Я создаю Политику безопасности Pod, чтобы запретить ВСЕМ пользователям создавать Pod как Root-пользователь. Мой кластер на GKE.
Шаги, которые я выполнил до сих пор:
1) Включить PodSecurityPolicy в моем кластере
gcloud beta container clusters update standard-cluster-11 --enable-pod-security-policy
2) Определите политику. Политика проста и ограничивает пользователя root.
apiVersion: extensions/v1beta1
kind: PodSecurityPolicy
metadata:
name: a-restrict-root
spec:
privileged: false
runAsUser:
rule: MustRunAsNonRoot # <------ Root user restricted.
seLinux:
rule: RunAsAny
fsGroup:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
volumes:
- '*'
3) И, конечно же, реализация правильных правил RBAC, чтобы их можно было применять для ВСЕХ пользователей.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: gce:podsecuritypolicy:a-restrict-root
labels:
addonmanager.kubernetes.io/mode: Reconcile
kubernetes.io/cluster-service: "true"
rules:
- apiGroups:
- policy
resourceNames:
- a-restrict-root
resources:
- podsecuritypolicies
verbs:
- use
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: gce:podsecuritypolicy:a-restrict-root
labels:
addonmanager.kubernetes.io/mode: Reconcile
kubernetes.io/cluster-service: "true"
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: gce:podsecuritypolicy:a-restrict-root
subjects:
- kind: Group
apiGroup: rbac.authorization.k8s.io
name: system:serviceaccounts
Теперь наступает момент, когда я пытаюсь раскрутить стручок. Определение модуля выглядит так:
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo
spec:
securityContext:
runAsUser: 0
fsGroup: 0
volumes:
- name: sec-ctx-vol
emptyDir: {}
containers:
- name: sec-ctx-demo
image: gcr.io/google-samples/node-hello:1.0
volumeMounts:
- name: sec-ctx-vol
mountPath: /data/demo
securityContext:
allowPrivilegeEscalation: false
Как видите, runAsUser
установлен на 0
, что означает root
.
Когда я запускаю kubectl create -f pod.yaml
, модуль создается и переходит в состояние Running
.
Когда я выполняю exec в Pod, я вижу все процессы, выполняющиеся от имени root
$ kubectl exec -it security-context-demo -- sh
# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 4336 812 ? Ss 19:25 0:00 /bin/sh -c node server.js
root 6 0.4 0.5 772124 22656 ? Sl 19:25 0:00 node server.js
root 11 0.0 0.0 4336 724 ? Ss 19:26 0:00 sh
root 16 0.0 0.0 17500 2072 ? R+ 19:26 0:00 ps aux
Но на основании моего PodSecurityPolicy это НЕ должно быть разрешено. Я что-то пропустил?
ОБНОВЛЕНИЕ:
Я развернул модуль nginx по умолчанию, который, как я знаю, всегда запускается от имени пользователя root. Его манифест:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
И когда я его создаю, он тоже запускается успешно.
$ kubectl get po
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 2m
Принимая во внимание, что из-за PSP он не должен запускаться.