第一章

1、网络策略

需求1:在test命名空间创建一个名为deny-all的网络策略,拒绝本命名空间所有Pod的Ingress和Egress流量

  1. kubectl create namespace test
  2. cat > deny-all-test.yaml << EOF
  3. # 所有pod孤立的策略
  4. apiVersion: networking.k8s.io/v1
  5. kind: NetworkPolicy
  6. metadata:
  7. name: deny-all
  8. namespace: test
  9. spec:
  10. podSelector: {}
  11. policyTypes:
  12. - Ingress
  13. - Egress
  14. EOF
  15. cat > deny-ns-test.yaml << EOF
  16. # 只限定本名称空间下的pod间相互通信
  17. apiVersion: networking.k8s.io/v1
  18. kind: NetworkPolicy
  19. metadata:
  20. name: deny-ns
  21. namespace: test
  22. spec:
  23. podSelector: {}
  24. policyTypes:
  25. - Ingress
  26. ingress:
  27. - from:
  28. - namespaceSelector:
  29. matchLabels:
  30. project: test
  31. EOF

需求2:限制dev命名空间标签为env=dev的pod,只允许prod命名空间中的pod访问和其他所有命名空间app=client1标签pod访问

  1. kubectl create namespace dev
  2. kubectl create namespace prod
  3. kubectl label namespace prod project=prod
  4. cat > allow-env-dev-pod.yaml << EOF
  5. apiVersion: networking.k8s.io/v1
  6. kind: NetworkPolicy
  7. metadata:
  8. name: allow-env-dev
  9. namespace: dev
  10. spec:
  11. podSelector:
  12. matchLabels:
  13. env: dev
  14. policyTypes:
  15. - Ingress
  16. ingress:
  17. - from:
  18. - namespaceSelector:
  19. matchLabels:
  20. project: prod
  21. - podSelector:
  22. matchLabels:
  23. app: client
  24. EOF
  • 指定标签的pod访问,未实现

第二章

1、权限访问

1、创建一个名为backend-sa的serviceaccount,授权只能查看default命名空间下pod,再创建一个deployment使用这个serviceaccount。

  1. # 1.创建一个名为backend-sa的sa
  2. kubectl create serviceaccount backend-sa
  3. # 2.创建一个只能查看default名称空间下的role
  4. kubectl create role get-pod-role --verb=get,list,watch --resource=pods --dry-run=client -o yaml > get-pod-role.yaml
  5. # 3.创建一个rolebinding将backend-sa和get-pod-role绑定
  6. kubectl create rolebinding backend-sa-role --role=get-pod-role --serviceaccount=default:backend-sa --dry-run=client -o yaml > backend-sa-role.yaml
  7. # 4.测试
  8. kubectl --as=system:serviceaccount:default:backend-sa get pods
  9. # 5.创建一个deployment,并使用改sa查看
  10. kubectl create deployment web --image=nginx
  11. kubectl --as=system:serviceaccount:default:backend-sa get deployments
  12. 内容如下:没有权限
  13. Error from server (Forbidden): deployments.apps is forbidden: User "system:serviceaccount:default:backend-sa" cannot list resource "deployments" in API group "apps" in the namespace "default"

2、资源限额

2、为default命名空间下创建的容器默认请求值(resources.requests)cpu=200m,memory=200Mi

  1. apiVersion: v1
  2. kind: LimitRange
  3. metadata:
  4. name: limitrange-container
  5. namespace: default
  6. spec:
  7. limits:
  8. - default:
  9. cpu: 200m
  10. memory: 200Mi
  11. defaultRequest:
  12. cpu: 200m
  13. memory: 200Mi
  14. type: Container
  • 如果只设置了上限(default),则请求值(defaultRequest)和上限(default)相同

第三章

1、apparmor策略

1、在工作节点上加载课堂上讲解的apparmor策略文件k8s-deny-write,并在Pod中应用该策略

  1. cat > /etc/apparmor.d/k8s-deny-write << EOF
  2. #include <tunables/global>
  3. profile k8s-deny-write flags=(attach_disconnected) {
  4. #include <abstractions/base>
  5. file,
  6. deny /tmp/** w,
  7. deny /data/www/** w,
  8. }
  9. EOF
  10. apparmor_parser -a /etc/apparmor.d/k8s-deny-write
  11. root@k8s-master-1:/cks# apparmor_status | grep k8s
  12. k8s-deny-write
  • 要在调度到的节点上加载apparmor(否则状态为Blocked
  1. cat apparmor-hello.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: hello-apparmor
  6. annotations:
  7. # Tell Kubernetes to apply the AppArmor profile "k8s-apparmor-example-deny-write".
  8. # Note that this is ignored if the Kubernetes node is not running version 1.4 or greater.
  9. container.apparmor.security.beta.kubernetes.io/hello: localhost/k8s-deny-write
  10. spec:
  11. containers:
  12. - name: hello
  13. image: busybox
  14. command: [ "sh", "-c", "echo 'Hello AppArmor!' && sleep 1h" ]

2、seccomp

2、在工作节点上加载课堂上讲解的seccomp文件,禁止容器里使用chmod命令,并在Pod中应用该策略

  1. cat !$
  2. cat /var/lib/kubelet/seccomp/profiles/chmod.json
  3. {
  4. "defaultAction": "SCMP_ACT_ALLOW",
  5. "syscalls": [
  6. {
  7. "names": [
  8. "chmod"
  9. ],
  10. "action": "SCMP_ACT_ERRNO"
  11. }
  12. ]
  13. }
  • 要在调度到的节点上创建,否则pod起不来
  • 注意拒绝策略名词是:SCMP_ACT_ERRNO 而不是 SCMP_ACT_ERROR
  1. cat seccomp-hello.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: hello-seccomp
  6. spec:
  7. securityContext:
  8. seccompProfile:
  9. type: Localhost
  10. localhostProfile: profiles/chmod.json
  11. containers:
  12. - name: hello-2
  13. image: busybox
  14. command: [ "sh", "-c", "echo 'Hello AppArmor!' && sleep 1h" ]

第四章

1、Pod安全上下文

示例1:容器默认没有挂载文件系统能力,添加SYS_ADMIN增加这个能力

  1. cat sys-admin.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: sys-admin-pod
  6. spec:
  7. containers:
  8. - name: test
  9. image: busybox
  10. command:
  11. - sleep
  12. - 24h
  13. securityContext:
  14. capabilities:
  15. add: ["SYS_ADMIN"]

案例2:只读挂载容器文件系统,防止恶意二进制文件创建

  1. cat read-only.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: read-only
  6. spec:
  7. containers:
  8. - name: read-only
  9. image: busybox
  10. command:
  11. - sleep
  12. - 24h
  13. securityContext:
  14. readOnlyRootFilesystem: true

2、PSP

1、创建一个PSP策略,防止创建特权Pod,再创建一个ServiceAccount,使用kubectl –as验证PSP策略效果

  1. apiVersion: policy/v1beta1
  2. kind: PodSecurityPolicy
  3. metadata:
  4. name: example
  5. spec:
  6. privileged: false # Don't allow privileged pods!
  7. seLinux:
  8. rule: RunAsAny
  9. supplementalGroups:
  10. rule: RunAsAny
  11. runAsUser:
  12. rule: RunAsAny
  13. fsGroup:
  14. rule: RunAsAny
  15. volumes:
  16. - '*'
  1. # 创建SA
  2. kubectl create serviceaccount geray
  3. # 将SA绑定到系统内置Role
  4. kubectl create rolebinding geray --clusterrole=edit --serviceaccount=default:geray
  5. # 创建使用PSP权限的Role
  6. kubectl create role psp:unprivileged --verb=use --resource=podsecuritypolicy --resource-name=psp-example
  7. # 将SA绑定到Role
  8. kubectl create rolebinding geray:psp:unprivileged --role=psp:unprivileged --serviceaccount=default:geray
  1. cat privileged.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: test1
  6. spec:
  7. containers:
  8. - name: web
  9. image: nginx
  10. securityContext:
  11. privileged: true
  12. cat noPrivileged.yaml
  13. apiVersion: v1
  14. kind: Pod
  15. metadata:
  16. name: test2
  17. spec:
  18. containers:
  19. - name: web
  20. image: nginx
  21. kubectl --as=system:serviceaccount:default:geray create -f privileged.yaml
  22. kubectl --as=system:serviceaccount:default:geray create -f noPrivileged.yaml

3、gVisor

2、使用containerd作为容器运行时,准备好gVisor,创建一个RuntimeClass,创建一个Pod在gVisor上运行