反模式:給人或 CI/CD cluster-admin
。
建議:職能導向角色 + 命名空間邊界。
# 只能讀取同 NS 的 Pod
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
namespace: ephi-core
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: bind-dev-to-pod-reader
namespace: ephi-core
subjects:
- kind: Group
name: devs
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: disallow-privileged-and-hostpath
spec:
validationFailureAction: enforce
rules:
- name: no-privileged
match:
resources:
kinds: [Pod]
validate:
message: "Privileged containers are not allowed"
pattern:
spec:
containers:
- =(securityContext):
=(privileged): false
- name: no-hostpath
match:
resources:
kinds: [Pod]
validate:
message: "HostPath volumes are forbidden"
deny:
conditions:
any:
- key: "{{ request.object.spec.volumes[].hostPath }}"
operator: NotEquals
value: null
- name: require-requests-limits-and-probes
match:
resources:
kinds: [Deployment,StatefulSet,DaemonSet,Job,CronJob]
validate:
message: "Containers must set resources and liveness/readiness probes"
foreach:
- list: "request.object.spec.template.spec.containers[]"
deny:
conditions:
any:
- key: "{{ element.resources.requests.cpu }}"
operator: Equals
value: null
- key: "{{ element.livenessProbe }}"
operator: Equals
value: null
- key: "{{ element.readinessProbe }}"
apiVersion: kyverno.io/v2
kind: ClusterPolicy
metadata:
name: verify-image-signatures
spec:
validationFailureAction: enforce
rules:
- name: verify-signature
match:
resources:
kinds: [Pod]
verifyImages:
- imageReferences:
- "registry.example.com/*"
attestors:
- entries:
- keys:
publicKeys: |
-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
resources:
- group: ""
resources: ["secrets"]
- level: RequestResponse
verbs: ["update","patch","create","delete"]
resources:
- group: "rbac.authorization.k8s.io"
resources: ["roles","rolebindings","clusterroles","clusterrolebindings"]
- level: Metadata
userGroups: ["system:authenticated"]
審計日誌需送往集中式 SIEM(可用 OTel Collector → Kafka/ELK/Cloud SIEM)。