198 lines
8.4 KiB
Markdown
198 lines
8.4 KiB
Markdown
# 03 — 主机安全
|
||
|
||
> GB/T 22239-2019 第三级「设备和计算安全」控制点映射。
|
||
> 本维度以**容器与 Pod**为「主机」单元(AgentKit 不直接运维 K8s node)。
|
||
|
||
## 1. 维度说明
|
||
|
||
AgentKit 以容器形态运行在客户 K8s 集群。「主机安全」分为两层:
|
||
|
||
- **容器/Pod 层**(AgentKit 责任):镜像安全、运行时安全上下文、
|
||
ServiceAccount、Pod 级 RBAC。
|
||
- **K8s node 层**(客户责任):宿主机操作系统内核加固、node 基线、
|
||
主机入侵检测(HIDS)。
|
||
|
||
AgentKit 自身实现:
|
||
|
||
- **已实现**:非 root 容器、最小权限安全上下文(capabilities drop ALL)、
|
||
ServiceAccount 隔离、容器级资源限制。
|
||
- **P0 补齐项**:容器镜像漏洞扫描(CI 集成 Trivy/Grype)、
|
||
Pod 安全审计日志采集标准化。
|
||
- **P1 参考**:distroless 基础镜像。
|
||
|
||
## 2. GB/T 22239-2019 三级要求(简要)
|
||
|
||
| 控制点 ID | 要求摘要 |
|
||
|-----------|----------|
|
||
| HST-01 | 身份鉴别:设备/系统身份标识与鉴别 |
|
||
| HST-02 | 访问控制:操作系统/账户权限最小化,远程管理受控 |
|
||
| HST-03 | 安全审计:设备审计日志,覆盖系统管理活动 |
|
||
| HST-04 | 入侵防范:主机入侵检测,系统加固 |
|
||
| HST-05 | 恶意代码防范:主机防病毒,恶意代码检测 |
|
||
| HST-06 | 资源控制:CPU/内存/磁盘限制,会话超时 |
|
||
| HST-07 | 镜像与补丁管理:系统补丁及时更新,镜像来源可信 |
|
||
|
||
## 3. AgentKit 实现映射
|
||
|
||
### 3.1 容器镜像安全(HST-07)— 部分已实现 / P0 补齐
|
||
|
||
#### 已实现
|
||
|
||
- **多阶段构建**:builder + runner 两阶段,最终镜像不含构建工具链。
|
||
[Dockerfile](file:///Users/chiguyong/Code/Fischer-agentkit/Dockerfile)
|
||
- **非 root 用户**:runner 阶段创建 `appuser`(UID 1001 / GID 1001),
|
||
`USER appuser` 强制非 root 运行。
|
||
- **基础镜像**:`python:3.11-slim`(精简版,比 full 镜像减少攻击面)。
|
||
- **HEALTHCHECK**:内置健康检查
|
||
(`/api/v1/health`,30s 间隔)。
|
||
- **不写字节码**:`PYTHONDONTWRITEBYTECODE=1`,减少磁盘 .pyc 残留。
|
||
|
||
#### P0 补齐项:镜像漏洞扫描
|
||
|
||
**当前状态:P0**。CI 流水线未集成容器镜像漏洞扫描。
|
||
|
||
**P0 补齐计划**:
|
||
|
||
1. CI 流水线增加 Trivy 扫描步骤:
|
||
```yaml
|
||
- name: Trivy scan
|
||
run: trivy image --severity HIGH,CRITICAL --exit-code 1 fischer-agentkit:${{ github.sha }}
|
||
```
|
||
2. Helm Chart 增加 `image.digest` 字段,部署时使用不可变 digest 而非 tag。
|
||
3. 镜像签名(cosign)— P1,可选。
|
||
|
||
### 3.2 K8s node 安全基线(HST-04 / HST-05)— 待评估
|
||
|
||
**当前状态:待评估**。K8s 宿主机由客户运维,AgentKit 不控制 node 操作系统。
|
||
|
||
客户侧需提供:
|
||
|
||
- node 操作系统加固基线(CIS Benchmark for Kubernetes / 操作系统)。
|
||
- 主机入侵检测(HIDS,如 Falco / OSSEC)。
|
||
- 主机防病毒(如客户机房要求)。
|
||
|
||
AgentKit 侧的缓解:
|
||
|
||
- Pod `securityContext` 强制非 root + drop ALL capabilities
|
||
([values.yaml](file:///Users/chiguyong/Code/Fischer-agentkit/deploy/helm/agentkit/values.yaml)
|
||
`podSecurityContext` / `securityContext` 段),即使 node 被攻破,
|
||
容器逃逸到 root 的难度提升。
|
||
|
||
### 3.3 身份鉴别 / ServiceAccount(HST-01)— 已实现
|
||
|
||
AgentKit Pod 使用专用 ServiceAccount,不共享 default SA:
|
||
|
||
- **ServiceAccount 创建**:
|
||
[deploy/helm/agentkit/templates/serviceaccount.yaml](file:///Users/chiguyong/Code/Fischer-agentkit/deploy/helm/agentkit/templates/serviceaccount.yaml)
|
||
- **values 配置**:
|
||
```yaml
|
||
serviceAccount:
|
||
create: true
|
||
name: "" # 留空则用 fullname(专用 SA)
|
||
annotations: {} # 云厂商 workload identity 注解
|
||
```
|
||
- **Workload Identity**(可选):`workloadIdentity.enabled: true` 时
|
||
注入 projected SA token,用于访问云 KMS / STS
|
||
([values.yaml](file:///Users/chiguyong/Code/Fischer-agentkit/deploy/helm/agentkit/values.yaml)
|
||
`workloadIdentity` 段)。
|
||
|
||
Pod 内应用层身份鉴别见 `04-application.md` §1(SSO + JWT)。
|
||
|
||
### 3.4 访问控制 / Pod 级 RBAC(HST-02)— 已实现
|
||
|
||
- **capabilities drop ALL**:
|
||
```yaml
|
||
securityContext:
|
||
allowPrivilegeEscalation: false
|
||
capabilities:
|
||
drop: [ALL]
|
||
```
|
||
([values.yaml](file:///Users/chiguyong/Code/Fischer-agentkit/deploy/helm/agentkit/values.yaml) `securityContext` 段)
|
||
- **runAsNonRoot 强制**:`podSecurityContext.runAsNonRoot: true`,
|
||
K8s admission 拒绝非 root Pod。
|
||
- **readOnlyRootFilesystem**:当前为 `false`(agentkit 需写临时文件用于缓存/日志),
|
||
通过 `emptyDir` 挂载 `/tmp` 实现写入隔离
|
||
([deployment.yaml](file:///Users/chiguyong/Code/Fischer-agentkit/deploy/helm/agentkit/templates/deployment.yaml)
|
||
`volumes.tmp`)。
|
||
- **privileged: false**(默认,未启用特权模式)。
|
||
|
||
应用层 RBAC(member/operator/admin + 9 权限位)见
|
||
`04-application.md` §2。
|
||
|
||
### 3.5 安全审计 / 容器日志(HST-03)— 已实现 + P0 补齐
|
||
|
||
#### 已实现
|
||
|
||
- **stdout/stderr 标准输出**:AgentKit 日志全部输出到 stdout,
|
||
由 K8s 日志采集(如 Loki / Fluent Bit)收集。
|
||
- **OTel trace**:每个 Pod 的请求 trace 通过 OTLP 导出到 collector
|
||
(U1,强制依赖)。
|
||
- **审计事件**:RBAC 变更、deprovisioning、SCIM 操作写入 `auth_audit_log` 表
|
||
+ OTel span event([audit.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/audit.py))。
|
||
- **终端命令审计**:每条终端命令 + 决策(executed/confirmed/blocked/denied)
|
||
写入 `terminal_audit_logs` 表
|
||
([terminal_security.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/terminal_security.py))。
|
||
|
||
#### P0 补齐项:审计日志标准化采集
|
||
|
||
**当前状态:P0**。容器日志采集到客户日志平台的链路未标准化。
|
||
|
||
**P0 补齐计划**:
|
||
|
||
1. Helm Chart 增加 `logging.fluentBitSidecar` 选项(可选 sidecar 采集)。
|
||
2. 审计日志 JSON 化(structured logging),便于 SIEM 解析。
|
||
3. 与 `02-network.md` §3.7 的 180 天保留策略协同落地。
|
||
|
||
### 3.6 入侵防范(HST-04)— 已实现(容器层)
|
||
|
||
容器层入侵防范已实现:
|
||
|
||
- **非 root + drop ALL capabilities**:限制容器内可执行的系统调用。
|
||
- **allowPrivilegeEscalation: false**:阻止子进程提权。
|
||
- **资源 limits**:CPU 1000m / Memory 2Gi 上限,防止容器失控耗尽 node 资源
|
||
([values.yaml](file:///Users/chiguyong/Code/Fischer-agentkit/deploy/helm/agentkit/values.yaml)
|
||
`resources.limits`)。
|
||
- **Liveness/Readiness 探针**:故障 Pod 自动重启
|
||
([deployment.yaml](file:///Users/chiguyong/Code/Fischer-agentkit/deploy/helm/agentkit/templates/deployment.yaml)
|
||
`livenessProbe` / `readinessProbe`)。
|
||
|
||
node 层入侵检测(HIDS)见 §3.2,依赖客户侧。
|
||
|
||
### 3.7 资源控制(HST-06)— 已实现
|
||
|
||
- **Pod resources**:
|
||
```yaml
|
||
resources:
|
||
requests: { cpu: 250m, memory: 512Mi }
|
||
limits: { cpu: 1000m, memory: 2Gi }
|
||
```
|
||
- **应用层限流**:[RateLimiter](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/middleware.py)
|
||
IP 维度滑动窗口。
|
||
- **会话超时**:终端 session 1800s 闲置断开
|
||
([terminal_server.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/routes/terminal_server.py))。
|
||
- **JWT 短时效**:access 15min / refresh 7d
|
||
([jwt_utils.py](file:///Users/chiguyong/Code/Fischer-agentkit/src/agentkit/server/auth/jwt_utils.py))。
|
||
|
||
## 4. distroless 基础镜像(P1 参考)
|
||
|
||
**当前状态:P1**。当前基础镜像为 `python:3.11-slim`,含 shell + 包管理器,
|
||
攻击面大于 distroless。
|
||
|
||
**P1 升级路径**:
|
||
|
||
1. 切换到 `gcr.io/distroless/python3-debian12` 作为 runner 基础镜像。
|
||
2. 需调整:distroless 无 shell,HEALTHCHECK 的 `python -c` 命令需改为
|
||
HTTP 探针(K8s livenessProbe httpGet,已支持)。
|
||
3. 多阶段构建的 builder 阶段保持 `python:3.11-slim`(构建工具链需要)。
|
||
|
||
distroless 不阻碍等保三级认证,但作为安全增强项写入整改计划。
|
||
|
||
## 5. 测评建议
|
||
|
||
1. **HST-01 / HST-02 / HST-06**:直接展示 ServiceAccount + securityContext
|
||
+ resources 配置即可。
|
||
2. **HST-03**:已实现部分展示 audit.py + terminal_security.py,
|
||
P0 补齐日志标准化采集。
|
||
3. **HST-07**:P0 补齐镜像漏洞扫描后展示 Trivy 扫描报告。
|
||
4. **HST-04 / HST-05**:容器层已实现,node 层由客户提供 HIDS 证据。
|