云原生安全原理
·
一、RBAC(基于角色的访问控制)
1.1 RBAC核心概念
┌─────────────────────────────────────────────────────────────────┐
│ RBAC核心概念 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ RBAC模型 │ │
│ │ │ │
│ │ User/ServiceAccount │ │
│ │ │ │ │
│ │ │ 绑定 │ │
│ │ ▼ │ │
│ │ ┌─────────────────┐ │ │
│ │ │ RoleBinding │ │ │
│ │ │ ClusterRoleBinding│ │ │
│ │ └────────┬────────┘ │ │
│ │ │ │ │
│ │ │ 引用 │ │
│ │ ▼ │ │
│ │ ┌─────────────────┐ │ │
│ │ │ Role │ │ │
│ │ │ ClusterRole │ │ │
│ │ └────────┬────────┘ │ │
│ │ │ │ │
│ │ │ 包含 │ │
│ │ ▼ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ Rules (权限规则) │ │ │
│ │ │ ├── apiGroups: ["", "apps", "batch"] │ │ │
│ │ │ ├── resources: ["pods", "deployments", "jobs"] │ │ │
│ │ │ └── verbs: ["get", "list", "watch", "create"] │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ 资源范围: │
│ ├── Role/RoleBinding: 命名空间级别 │
│ └── ClusterRole/ClusterRoleBinding: 集群级别 │
│ │
└─────────────────────────────────────────────────────────────────┘
1.2 RBAC配置示例
# ServiceAccount
apiVersion:v1
kind:ServiceAccount
metadata:
name:ci-bot
namespace:default
---
# Role - 命名空间级别权限
apiVersion:rbac.authorization.k8s.io/v1
kind:Role
metadata:
name:deployment-manager
namespace:default
rules:
-apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
-apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list", "watch"]
-apiGroups: [""]
resources: ["pods/exec"]
verbs: ["create"]
---
# RoleBinding
apiVersion:rbac.authorization.k8s.io/v1
kind:RoleBinding
metadata:
name:ci-bot-deployment-manager
namespace:default
subjects:
-kind:ServiceAccount
name:ci-bot
namespace:default
roleRef:
kind:Role
name:deployment-manager
apiGroup:rbac.authorization.k8s.io
---
# ClusterRole - 集群级别权限
apiVersion:rbac.authorization.k8s.io/v1
kind:ClusterRole
metadata:
name:pod-reader
rules:
-apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
---
# ClusterRoleBinding
apiVersion:rbac.authorization.k8s.io/v1
kind:ClusterRoleBinding
metadata:
name:all-pod-reader
subjects:
-kind:ServiceAccount
name:monitoring
namespace:monitoring
roleRef:
kind:ClusterRole
name:pod-reader
apiGroup:rbac.authorization.k8s.io
1.3 RBAC最佳实践
┌─────────────────────────────────────────────────────────────────┐
│ RBAC最佳实践 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. 最小权限原则 │
│ ├── 只授予必要的权限 │
│ ├── 避免使用通配符(*) │
│ └── 定期审计权限 │
│ │
│ 2. 命名空间隔离 │
│ ├── 不同环境使用不同命名空间 │
│ ├── 使用Role而非ClusterRole │
│ └── 限制跨命名空间访问 │
│ │
│ 3. ServiceAccount管理 │
│ ├── 为每个应用创建专用SA │
│ ├── 禁用自动挂载token(不需要时) │
│ └── 定期轮换token │
│ │
│ 4. 禁止做法 │
│ ├── 禁止授予cluster-admin给普通用户 │
│ ├── 禁止创建过于宽泛的ClusterRole │
│ └── 禁止在RoleBinding中引用ClusterRole(已弃用) │
│ │
│ 5. 审计与合规 │
│ ├── 启用审计日志 │
│ ├── 定期RBAC审计 │
│ └── 使用工具检查权限(kubectl auth can-i) │
│ │
│ 权限检查命令: │
│ kubectl auth can-i list pods --as=system:serviceaccount:default:ci-bot│
│ kubectl auth can-i '*' '*' --all-namespaces │
│ │
└─────────────────────────────────────────────────────────────────┘
二、NetworkPolicy深度应用
2.1 NetworkPolicy默认策略
# 默认拒绝所有入站流量
apiVersion:networking.k8s.io/v1
kind:NetworkPolicy
metadata:
name:default-deny-ingress
namespace:sensitive
spec:
podSelector: {}
policyTypes:
-Ingress
---
# 默认拒绝所有出站流量
apiVersion:networking.k8s.io/v1
kind:NetworkPolicy
metadata:
name:default-deny-egress
namespace:sensitive
spec:
podSelector: {}
policyTypes:
-Egress
---
# 默认拒绝所有流量(入站+出站)
apiVersion:networking.k8s.io/v1
kind:NetworkPolicy
metadata:
name:default-deny-all
namespace:sensitive
spec:
podSelector: {}
policyTypes:
-Ingress
-Egress
2.2 多层网络隔离架构
┌─────────────────────────────────────────────────────────────────┐
│ 多层网络隔离架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 外部流量 │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ DMZ层 (公开服务) │ │
│ │ │ │
│ │ ┌─────────┐ ┌─────────┐ │ │
│ │ │ Ingress │ │ API GW │ ← 允许外部入站 │ │
│ │ └────┬────┘ └────┬────┘ │ │
│ │ │ │ │ │
│ └───────┼─────────────┼─────────────────────────────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 应用层 (内部服务) │ │
│ │ │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │Web App │ │ API Svc │ │ Worker │ │ │
│ │ └────┬────┘ └────┬────┘ └─────────┘ │ │
│ │ │ │ ▲ │ │
│ └───────┼─────────────┼───────────┼────────────────────────┘ │
│ │ │ │ │
│ ▼ ▼ │ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 数据层 (敏感数据) │ │
│ │ │ │
│ │ ┌─────────┐ ┌─────────┐ │ │
│ │ │ MySQL │ │ Redis │ ← 仅允许应用层访问 │ │
│ │ └─────────┘ └─────────┘ │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ NetworkPolicy规则: │
│ ├── DMZ→应用: 允许特定端口 │
│ ├── 应用→数据: 允许数据库端口 │
│ ├── 数据层: 禁止所有外部访问 │
│ └── 跨层访问: 需要明确允许 │
│ │
└─────────────────────────────────────────────────────────────────┘
2.3 NetworkPolicy高级配置
# 多层隔离NetworkPolicy
# 数据库层
apiVersion:networking.k8s.io/v1
kind:NetworkPolicy
metadata:
name:database-policy
namespace:data
spec:
podSelector:
matchLabels:
tier:database
policyTypes:
-Ingress
-Egress
ingress:
-from:
-podSelector:
matchLabels:
tier:application
namespaceSelector:
matchLabels:
name:app
ports:
-protocol:TCP
port:3306
egress:
-to:
-namespaceSelector:
matchLabels:
name:monitoring
podSelector:
matchLabels:
app:prometheus
ports:
-protocol:TCP
port:9104
-to:# DNS
-namespaceSelector: {}
podSelector:
matchLabels:
k8s-app:kube-dns
ports:
-protocol:UDP
port:53
---
# 应用层
apiVersion:networking.k8s.io/v1
kind:NetworkPolicy
metadata:
name:application-policy
namespace:app
spec:
podSelector:
matchLabels:
tier:application
policyTypes:
-Ingress
-Egress
ingress:
-from:
-namespaceSelector:
matchLabels:
name:dmz
ports:
-protocol:TCP
port:8080
egress:
-to:
-podSelector:
matchLabels:
tier:database
namespaceSelector:
matchLabels:
name:data
ports:
-protocol:TCP
port:3306
-to:# 外部API
-ipBlock:
cidr:10.0.0.0/8
except:
-10.0.0.0/24# 排除内部网段
三、Pod安全标准
3.1 Pod安全级别
┌─────────────────────────────────────────────────────────────────┐
│ Pod安全标准 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 三种安全级别: │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Privileged (特权) │ │
│ │ ├── 不限制 │ │
│ │ ├── 允许特权容器 │ │
│ │ ├── 允许hostNetwork/hostPID/hostIPC │ │
│ │ └── 适用: 系统组件、CNI、CSI等 │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Baseline (基线) │ │
│ │ ├── 禁止明显危险配置 │ │
│ │ ├── 禁止特权容器 │ │
│ │ ├── 禁止hostNetwork/hostPID/hostIPC │ │
│ │ ├── 禁止hostPath │ │
│ │ └── 适用: 普通应用 │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Restricted (受限) │ │
│ │ ├── 最严格限制 │ │
│ │ ├── 必须runAsNonRoot │ │
│ │ ├── 必须seccompProfile │ │
│ │ ├── 必须readOnlyRootFilesystem │ │
│ │ ├── 必须drop ALL capabilities │ │
│ │ └── 适用: 安全敏感应用 │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
3.2 Pod安全标准配置
# 命名空间级别Pod安全策略
apiVersion:v1
kind:Namespace
metadata:
name:production
labels:
pod-security.kubernetes.io/enforce:restricted
pod-security.kubernetes.io/audit:restricted
pod-security.kubernetes.io/warn:restricted
---
# 符合Restricted级别的Pod配置
apiVersion:v1
kind:Pod
metadata:
name:secure-pod
namespace:production
spec:
securityContext:
runAsNonRoot:true
runAsUser:1000
runAsGroup:3000
fsGroup:2000
seccompProfile:
type:RuntimeDefault
containers:
-name:app
image:my-app:latest
securityContext:
allowPrivilegeEscalation:false
readOnlyRootFilesystem:true
capabilities:
drop:
-ALL
volumeMounts:
-name:tmp
mountPath:/tmp
volumes:
-name:tmp
emptyDir: {}
3.3 安全配置检查清单
┌─────────────────────────────────────────────────────────────────┐
│ Pod安全配置检查清单 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 基础安全: │
│ ├── [ ] runAsNonRoot: true │
│ ├── [ ] runAsUser: <non-zero-uid> │
│ ├── [ ] readOnlyRootFilesystem: true │
│ └── [ ] allowPrivilegeEscalation: false │
│ │
│ 能力控制: │
│ ├── [ ] capabilities.drop: ["ALL"] │
│ └── [ ] 不添加不必要的capabilities.add │
│ │
│ 安全配置: │
│ ├── [ ] seccompProfile.type: RuntimeDefault │
│ ├── [ ] apparmorProfile (如支持) │
│ └── [ ] seLinuxOptions (如需要) │
│ │
│ 网络安全: │
│ ├── [ ] hostNetwork: false │
│ ├── [ ] hostPID: false │
│ └── [ ] hostIPC: false │
│ │
│ 卷安全: │
│ ├── [ ] 不使用hostPath │
│ ├── [ ] 不挂载敏感主机目录 │
│ └── [ ] Secret使用SecretProjection │
│ │
│ 验证工具: │
│ kubectl get pod <pod> -o yaml | kubectl apply -f - --dry-run=warn│
│ kubectl auth can-i --as=system:anonymous list pods │
│ kubectl auth can-i --as=system:anonymous create pods │
│ │
└─────────────────────────────────────────────────────────────────┘
四、零信任架构
4.1 零信任核心原则
┌─────────────────────────────────────────────────────────────────┐
│ 零信任核心原则 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 传统边界安全 vs 零信任: │
│ │
│ 传统模式: │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ "信任内部网络,怀疑外部网络" │ │
│ │ │ │
│ │ 外部 ──►防火墙──► 内部(信任) │ │
│ │ │ │
│ │ 问题: 一旦突破边界,内部横向移动无阻拦 │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ 零信任模式: │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ "永不信任,始终验证" │ │
│ │ │ │
│ │ 每个请求都需要: │ │
│ │ ├── 身份验证(Authentication) │ │
│ │ ├── 授权验证(Authorization) │ │
│ │ ├── 设备验证(Device Trust) │ │
│ │ └── 上下文验证(Context: 时间/位置/行为) │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ 零信任三大支柱: │
│ ├── 身份: 强身份认证,最小权限 │
│ ├── 设备: 设备健康检查,证书管理 │
│ └── 网络: 微分段,加密通信 │
│ │
└─────────────────────────────────────────────────────────────────┘
4.2 Kubernetes零信任实现
┌─────────────────────────────────────────────────────────────────┐
│ Kubernetes零信任架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 身份层 │ │
│ │ ├── ServiceAccount (工作负载身份) │ │
│ │ ├── SPIFFE/SPIRE (统一身份框架) │ │
│ │ └── mTLS (双向TLS认证) │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 授权层 │ │
│ │ ├── RBAC (API访问控制) │ │
│ │ ├── NetworkPolicy (网络访问控制) │ │
│ │ └── AuthorizationPolicy (Istio/Kyverno/OPA) │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 数据层 │ │
│ │ ├── etcd加密 │ │
│ │ ├── Secret加密(KMS/External Secrets) │ │
│ │ └── 传输加密(TLS) │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 可观测层 │ │
│ │ ├── 审计日志 │ │
│ │ ├── 访问日志 │ │
│ │ └── 异常检测 │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
4.3 Istio零信任配置
# Istio AuthorizationPolicy
apiVersion:security.istio.io/v1beta1
kind:AuthorizationPolicy
metadata:
name:deny-all
namespace:production
spec:
{} # 空规则 = 拒绝所有请求
---
apiVersion:security.istio.io/v1beta1
kind:AuthorizationPolicy
metadata:
name:allow-frontend
namespace:production
spec:
selector:
matchLabels:
app:backend
rules:
-from:
-source:
principals: ["cluster.local/ns/frontend/sa/frontend-sa"]
to:
-operation:
methods: ["GET", "POST"]
paths: ["/api/*"]
when:
-key:request.headers[x-request-id]
notValues: [""]
---
# PeerAuthentication - 强制mTLS
apiVersion:security.istio.io/v1beta1
kind:PeerAuthentication
metadata:
name:default
namespace:istio-system
spec:
mtls:
mode:STRICT# 严格模式,只接受mTLS
五、供应链安全
5.1 软件供应链风险
┌─────────────────────────────────────────────────────────────────┐
│ 软件供应链风险 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 供应链攻击面: │
│ │
│ 源代码层 │
│ ├── 恶意代码注入 │
│ ├── 依赖混淆攻击 │
│ └── 代码库入侵 │
│ │ │
│ ▼ │
│ 构建层 │
│ ├── 构建系统入侵 │
│ ├── 恶意构建脚本 │
│ └── CI/CD漏洞利用 │
│ │ │
│ ▼ │
│ 制品层 │
│ ├── 镜像篡改 │
│ ├── 依赖漏洞 │
│ └── 签名伪造 │
│ │ │
│ ▼ │
│ 部署层 │
│ ├── 中间人攻击 │
│ ├── 配置篡改 │
│ └── 运行时注入 │
│ │
└─────────────────────────────────────────────────────────────────┘
5.2 镜像安全
┌─────────────────────────────────────────────────────────────────┐
│ 镜像安全实践 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. 镜像构建安全 │
│ ├── 使用最小基础镜像(distroless/scratch) │
│ ├── 多阶段构建减少攻击面 │
│ ├── 不以root用户运行 │
│ └── 固定版本标签,不使用:latest │
│ │
│ 2. 镜像扫描 │
│ ├── 构建时扫描(Trivy/Grype) │
│ ├── 定期扫描已部署镜像 │
│ ├── CVE数据库及时更新 │
│ └── 修复已知高危漏洞 │
│ │
│ 3. 镜像签名与验证 │
│ ├── Cosign签名镜像 │
│ ├── 部署前验证签名 │
│ └── 集成到CI/CD流程 │
│ │
│ 4. 镜像仓库安全 │
│ ├── 私有仓库(Harbor/ECR/ACR) │
│ ├── 访问控制 │
│ ├── 镜像签名策略 │
│ └── 漏洞扫描策略 │
│ │
│ 5. SBOM(软件物料清单) │
│ ├── 生成SBOM(Syft) │
│ ├── 存储SBOM │
│ └── 漏洞追踪 │
│ │
└─────────────────────────────────────────────────────────────────┘
5.3 镜像安全流水线
# GitHub Actions镜像安全流水线
name:secure-build
on:
push:
branches: [main]
jobs:
build:
runs-on:ubuntu-latest
steps:
-uses:actions/checkout@v4
-name:GenerateSBOM
uses:anchore/sbom-action@v0
with:
image:myapp:${{github.sha}}
format:spdx-json
output-file:sbom.json
-name:Scanforvulnerabilities
uses:aquasecurity/trivy-action@master
with:
image-ref:myapp:${{github.sha}}
format:'table'
exit-code:'1'
severity:'CRITICAL,HIGH'
-name:SignimagewithCosign
uses:sigstore/cosign-installer@v3
-run:|
cosign sign --key env://COSIGN_PRIVATE_KEY \
${{ env.REGISTRY }}/myapp@${{ steps.meta.outputs.digest }}
env:
COSIGN_PRIVATE_KEY:${{secrets.COSIGN_PRIVATE_KEY}}
-name:Pushtoregistry
run: |
docker push ${{ env.REGISTRY }}/myapp:${{ github.sha }}
5.4 策略引擎(Kyverno/OPA)
# Kyverno镜像签名验证策略
apiVersion:kyverno.io/v1
kind:ClusterPolicy
metadata:
name:verify-image-signatures
spec:
validationFailureAction:enforce
background:false
rules:
-name:verify-signature
match:
any:
-resources:
kinds:
-Pod
verifyImages:
-imageReferences:
-"*"
attestors:
-entries:
-keys:
publicKeys:|-
-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----
---
# Kyverno镜像仓库限制策略
apiVersion:kyverno.io/v1
kind:ClusterPolicy
metadata:
name:allowed-registries
spec:
validationFailureAction:enforce
rules:
-name:validate-registry
match:
any:
-resources:
kinds:
-Pod
validate:
message:"镜像必须来自允许的仓库"
pattern:
spec:
containers:
-image:"harbor.company.com/* | gcr.io/*"
六、安全合规检查
6.1 安全基线检查工具
┌─────────────────────────────────────────────────────────────────┐
│ 安全基线检查工具 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ kube-bench (CIS Kubernetes基准测试) │
│ ├── 检查控制平面配置 │
│ ├── 检查etcd配置 │
│ ├── 检查kubelet配置 │
│ └── 生成合规报告 │
│ │
│ kubectl命令: │
│ kube-bench run --targets master │
│ kube-bench run --targets node │
│ kube-bench run --targets etcd │
│ │
│ kube-hunter (Kubernetes渗透测试) │
│ ├── 发现集群漏洞 │
│ ├── 模拟攻击路径 │
│ └── 生成安全报告 │
│ │
│ Trivy Operator │
│ ├── 镜像漏洞扫描 │
│ ├── 配置审计 │
│ ├── RBAC评估 │
│ └── 网络策略检查 │
│ │
│ Falco (运行时安全) │
│ ├── 系统调用监控 │
│ ├── 异常行为检测 │
│ └── 实时告警 │
│ │
└─────────────────────────────────────────────────────────────────┘
6.2 Falco规则示例
# Falco规则 - 检测异常行为
-rule:PrivilegeContainerLaunched
desc:检测特权容器启动
condition:>
container.id != host and
container.privileged = true
output:>
Privileged container started
(user=%user.name container=%container.id image=%container.image.repository)
priority:WARNING
tags: [container, privilege]
-rule:ShellSpawnedinContainer
desc:检测容器内shell启动
condition:>
container.id != host and
proc.name in (bash, sh, zsh, ash) and
proc.pname exists
output:>
Shell spawned in container
(user=%user.name container=%container.id image=%container.image.repository
shell=%proc.name parent=%proc.pname)
priority:NOTICE
tags: [container, shell]
-rule:FileReadfromSensitivePath
desc:检测敏感文件读取
condition:>
container.id != host and
open_read and
fd.name in (/etc/shadow, /etc/passwd, /etc/ssh/*)
output:>
Sensitive file read in container
(user=%user.name container=%container.id file=%fd.name)
priority:WARNING
tags: [container, filesystem]
参考资料:
-
Kubernetes RBAC
-
Pod Security Standards
-
Network Policies
-
Zero Trust Architecture
-
CIS Kubernetes Benchmark
-
Falco Documentation
-
Kyverno Documentation
更多推荐
所有评论(0)