
Kubernetes 已成为现代云原生应用的事实标准,但随着其广泛采用,安全问题也日益凸显。本文将介绍10个关键的安全技巧,帮助加固Kubernetes集群,防范潜在威胁。
场景:开发团队经常为了方便而为服务账户授予过多权限,导致安全风险。
案例:某电商平台因开发人员为默认命名空间的服务账户授予cluster-admin权限,导致攻击者通过被入侵的Pod获取了集群完全控制权。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: Open-all
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
----------------------
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: can-do-anything
subjects:
- kind: ServiceAccount
name: default
namespace: default
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io解决方案:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: read-only-configmaps
rules:
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["get", "list"]
--------------------------
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-only-configmaps
subjects:
- kind: ServiceAccount
name: my-app
namespace: prod
roleRef:
kind: Role
name: configmap-reader
apiGroup: rbac.authorization.k8s.io最佳实践:
场景:生产集群默认以root身份运行容器,增加了安全风险。
案例:金融机构因容器以root运行,攻击者利用漏洞获取节点root权限并窃取敏感数据。
apiVersion: v1
kind: Pod
metadata:
name: secure-app
spec:
securityContext: ##未指定容器的安全上下文
-name: app
image: secure-app:v1
securityContext: ##未指定容器的安全上下文解决方案:
apiVersion: v1
kind: Pod
metadata:
name: secure-app
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
containers:
- name: app
image: secure-app:v1
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]场景:许多Dashboard直接暴露在互联网上,缺乏适当认证。
案例:攻击者通过公开的Dashboard获取管理员权限并删除生产环境。
将LoadBalancer或nodeport访问的暴露至互联网上。 解决方案:
#1、使用端口转发安全访问
kubectl port-forward -n kubernetes-dashboard service/kubernetes-dashboard 8080:443
#2、通过云服务商的安全组或防火墙规则限制 API 服务器的访问场景:Secrets默认仅base64编码存储,容易被窃取。
案例:开发人员未意识到base64不是加密,导致生产凭证泄露。
apiVersion: apiserver.config.k8s.io/v1
kind: Secret
data:
name:Secrets
password:dDdewewe8dsdk ##直接存放加密密码解决方案:
# 创建加密配置
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: <32-byte-key>场景:许多集群运行着已知漏洞的容器镜像。
案例:零售商因使用含已知漏洞的旧镜像遭受攻击。
apiVersion: v1
kind: deployment
metadata:
name: -deployment
spec:
containers:
- name: deployment-app
image: deployment-app/deployment-image:latest ##直接使用不可信源拉取镜像解决方案:
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingAdmissionPolicy
metadata:
name: image-scan-policy
spec:
failurePolicy: Fail
matchConstraints:
resourceRules:
- apiGroups: [""]
apiVersions: ["v1"]
operations: ["CREATE"]
resources: ["pods"]
validations:
- expression: "object.spec.containers.all(c, c.image.startsWith('trusted-registry/'))"
message: "只允许使用受信任仓库的镜像"场景:Pod间默认无限制通信,增加了横向移动风险。
案例:攻击者通过入侵一个Pod访问集群内其他服务。
解决方案:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: restrict-traffic
spec:
podSelector:
matchLabels:
app: db
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 5432场景:长期有效的凭证增加了泄露风险。
案例:外部或其他员工利用未撤销的凭证访问集群。
解决方案:
apiVersion: v1
kind: Secret
metadata:
name: db-credentials
annotations:
kubectl.kubernetes.io/rotate: "true"
type: Opaque
data:
username: <base64>
password: <base64> ##第四步的方法需增加安全
providers:
- aescbc:
keys:
- name: key1
secret: <32-byte-key>场景:不安全的Pod配置增加了攻击面。
案例:攻击者利用特权容器逃逸到节点。
解决方案:
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted
spec:
privileged: false
allowPrivilegeEscalation: false
requiredDropCapabilities:
- ALL
runAsUser:
rule: MustRunAsNonRoot场景:缺乏监控难以及时发现异常行为。
案例:攻击者潜伏数月未被发现。
解决方案:
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
resources:
- group: ""
resources: ["secrets"]
- group: ""
resources: ["configmaps"]场景:旧版本包含已知安全漏洞。
案例:利用旧版本漏洞获取集群控制权。
解决方案:
# 检查当前版本
kubectl version --short
# 计划升级策略
kubectl get nodes -o wideKubernetes安全需要多层次防御策略。通过实施这10个技巧,可以显著降低集群安全风险。记住,安全不是一次性工作,而是需要持续关注和改进的过程。定期审计、监控和更新安全措施,确保集群始终处于最佳保护状态。
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!