引言
随着云计算和容器技术的快速发展,Kubernetes(K8s)已经成为容器编排领域的领导者。K8s集群的安全配置与防护对于保障容器化应用的安全至关重要。本文将深入探讨K8s集群的安全配置与防护之道,帮助您构建一个安全无忧的容器化应用环境。
K8s集群安全概述
Kubernetes集群的安全性主要涉及以下几个方面:
- 认证(Authentication):确保只有授权用户才能访问K8s API。
- 授权(Authorization):控制用户对资源的访问权限。
- 准入控制(Admission Control):在资源被创建或修改之前进行检查,确保其符合安全策略。
- 网络策略(Network Policies):控制Pod之间的通信。
- 容器镜像安全:确保容器镜像的安全性。
- 集群审计与监控:实时监控集群状态,及时发现并处理安全事件。
K8s集群安全配置
1. 基础系统安全配置
- 系统时间同步:安装NTP服务并配置可靠的NTP服务器,确保系统时间同步。
sudo apt update
sudo apt install ntpdate ntp
sudo ntpdate ntp1.aliyun.com
- 禁用Swap功能:Kubernetes要求所有节点禁用Swap,通过编辑
/etc/fstab
文件并注释掉Swap行实现,然后执行swapoff --all
命令。
sudo swapoff --all
- 配置容器运行时环境:推荐使用Docker或Containerd作为容器运行时。
sudo apt-get update
sudo apt-get install docker.io
2. 网络策略
- 创建网络策略:限制Pod之间的通信。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-backend-to-frontend
namespace: default
spec:
podSelector:
matchLabels:
role: frontend
policyTypes:
- Ingress
- Egress
3. 镜像安全
- 利用ImagePolicyWebhook策略管理镜像来源:防止使用未经验证的镜像。
apiVersion: policy/v1
kind: PodSecurityPolicy
metadata:
name: strict-image-policy
spec:
podSecurityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
seLinux: {}
supplementalGroups: [3000]
allowedCapabilities: ['NET_ADMIN', 'SYS_ADMIN']
forbiddenCapabilities: ['ALL']
volumes:
- configMap
- emptyDir
- secret
- persistentVolumeClaim
- projected
- downwardAPI
- gitRepo
- all
imagePolicyWebhook:
enabled: true
allowedScopes:
- 'image-pullers'
- 'system:authenticated'
- 'system:unauthenticated'
- 'system:serviceaccount'
- 'system:serviceaccount:kube-system:kubelet'
- 'system:serviceaccount:kube-system:statefulset-nginx'
- 'system:serviceaccount:kube-system:replica-set-nginx'
- 'system:serviceaccount:kube-system:deployment-nginx'
- 'system:serviceaccount:kube-system:daemonset-nginx'
- 'system:serviceaccount:kube-system:deployment-nginx-ingress'
- 'system:serviceaccount:kube-system:replica-set-nginx-ingress'
- 'system:serviceaccount:kube-system:daemonset-nginx-ingress'
4. 集群审计与监控
- 配置集群审计:记录集群操作日志,便于事后分析。
”`yaml apiVersion: audit.k8s.io/v1 kind: Policy metadata: name: default spec: # The Policy and its Rules specify what events are logged, and under what conditions. # Rules are applied in order, and the first matching rule is used. # If no rules match, the default behavior is to log all requests. rules:
- level: Request
resources:
- groups: [“”] resources: [“pods”, “services”, “nodes”, “persistentvolumes”, “persistentvolumeclaims”]
- groups: [“apps”] resources: [“deployments”, “replicasets”, “statefulsets”]
- groups: [“rbac.authorization.k8s.io”] resources: [“roles”, “rolebindings”, “clusterroles”, “clusterrolebindings”]
- groups: [“extensions”] resources: [“ingresses”]
- groups: [“batch”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“admissionregistration.k8s.io”] resources: [“validatingwebhookconfigurations”, “mutatingwebhookconfigurations”]
- groups: [“policy”] resources: [“podsecuritypolicies”]
- groups: [“networking.k8s.io”] resources: [“networkpolicies”]
- groups: [“authentication.k8s.io”] resources: [“tokenreviews”, “selfsubjectaccessreviews”, “selfsubjectrulesreviews”]
- groups: [“authorization.k8s.io”] resources: [“selfsubjectaccessreviews”, “selfsubjectrulesreviews”, “subjectaccessreviews”, “subjectrulesreviews”]
- groups: [“apiextensions.k8s.io”] resources: [“customresourcedefinitions”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”]
- groups: [“autoscaling.k8s.io”] resources: [“horizontalpodautoscalers”]
- groups: [“batch”, “extensions”] resources: [“jobs”, “cronjobs”]
- groups: [“storage.k8s.io”] resources: [“storageclasses”, “volumeattachments”, “storagepods”]
- groups: [“coordination.k8s.io”] resources: [“leases”, “configmaps”] -