第一章
1、网络策略
需求1:在test命名空间创建一个名为deny-all的网络策略,拒绝本命名空间所有Pod的Ingress和Egress流量
kubectl create namespace testcat > deny-all-test.yaml << EOF# 所有pod孤立的策略apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: deny-all namespace: testspec: podSelector: {} policyTypes: - Ingress - EgressEOFcat > deny-ns-test.yaml << EOF# 只限定本名称空间下的pod间相互通信apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: deny-ns namespace: testspec: podSelector: {} policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: project: testEOF
需求2:限制dev命名空间标签为env=dev的pod,只允许prod命名空间中的pod访问和其他所有命名空间app=client1标签pod访问
kubectl create namespace dev kubectl create namespace prodkubectl label namespace prod project=prodcat > allow-env-dev-pod.yaml << EOFapiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: allow-env-dev namespace: devspec: podSelector: matchLabels: env: dev policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: project: prod - podSelector: matchLabels: app: clientEOF
第二章
1、权限访问
1、创建一个名为backend-sa的serviceaccount,授权只能查看default命名空间下pod,再创建一个deployment使用这个serviceaccount。
# 1.创建一个名为backend-sa的sakubectl create serviceaccount backend-sa# 2.创建一个只能查看default名称空间下的rolekubectl create role get-pod-role --verb=get,list,watch --resource=pods --dry-run=client -o yaml > get-pod-role.yaml# 3.创建一个rolebinding将backend-sa和get-pod-role绑定kubectl create rolebinding backend-sa-role --role=get-pod-role --serviceaccount=default:backend-sa --dry-run=client -o yaml > backend-sa-role.yaml# 4.测试kubectl --as=system:serviceaccount:default:backend-sa get pods# 5.创建一个deployment,并使用改sa查看kubectl create deployment web --image=nginxkubectl --as=system:serviceaccount:default:backend-sa get deployments内容如下:没有权限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
apiVersion: v1kind: LimitRangemetadata: name: limitrange-container namespace: defaultspec: limits: - default: cpu: 200m memory: 200Mi defaultRequest: cpu: 200m memory: 200Mi type: Container
- 如果只设置了上限(default),则请求值(defaultRequest)和上限(default)相同
第三章
1、apparmor策略
1、在工作节点上加载课堂上讲解的apparmor策略文件k8s-deny-write,并在Pod中应用该策略
cat > /etc/apparmor.d/k8s-deny-write << EOF#include <tunables/global>profile k8s-deny-write flags=(attach_disconnected) { #include <abstractions/base> file, deny /tmp/** w, deny /data/www/** w,}EOFapparmor_parser -a /etc/apparmor.d/k8s-deny-write root@k8s-master-1:/cks# apparmor_status | grep k8s k8s-deny-write
- 要在调度到的节点上加载apparmor(否则状态为Blocked)
cat apparmor-hello.yaml apiVersion: v1kind: Podmetadata: name: hello-apparmor annotations: # Tell Kubernetes to apply the AppArmor profile "k8s-apparmor-example-deny-write". # Note that this is ignored if the Kubernetes node is not running version 1.4 or greater. container.apparmor.security.beta.kubernetes.io/hello: localhost/k8s-deny-writespec: containers: - name: hello image: busybox command: [ "sh", "-c", "echo 'Hello AppArmor!' && sleep 1h" ]
2、seccomp
2、在工作节点上加载课堂上讲解的seccomp文件,禁止容器里使用chmod命令,并在Pod中应用该策略
cat !$cat /var/lib/kubelet/seccomp/profiles/chmod.json{ "defaultAction": "SCMP_ACT_ALLOW", "syscalls": [ { "names": [ "chmod" ], "action": "SCMP_ACT_ERRNO" } ]}
- 要在调度到的节点上创建,否则pod起不来
- 注意拒绝策略名词是:SCMP_ACT_ERRNO 而不是 SCMP_ACT_ERROR
cat seccomp-hello.yaml apiVersion: v1kind: Podmetadata: name: hello-seccompspec: securityContext: seccompProfile: type: Localhost localhostProfile: profiles/chmod.json containers: - name: hello-2 image: busybox command: [ "sh", "-c", "echo 'Hello AppArmor!' && sleep 1h" ]
第四章
1、Pod安全上下文
示例1:容器默认没有挂载文件系统能力,添加SYS_ADMIN增加这个能力
cat sys-admin.yamlapiVersion: v1kind: Podmetadata: name: sys-admin-podspec: containers: - name: test image: busybox command: - sleep - 24h securityContext: capabilities: add: ["SYS_ADMIN"]
案例2:只读挂载容器文件系统,防止恶意二进制文件创建
cat read-only.yamlapiVersion: v1kind: Podmetadata: name: read-onlyspec: containers: - name: read-only image: busybox command: - sleep - 24h securityContext: readOnlyRootFilesystem: true
2、PSP
1、创建一个PSP策略,防止创建特权Pod,再创建一个ServiceAccount,使用kubectl –as验证PSP策略效果
apiVersion: policy/v1beta1kind: PodSecurityPolicymetadata: name: examplespec: privileged: false # Don't allow privileged pods! seLinux: rule: RunAsAny supplementalGroups: rule: RunAsAny runAsUser: rule: RunAsAny fsGroup: rule: RunAsAny volumes: - '*'
# 创建SAkubectl create serviceaccount geray# 将SA绑定到系统内置Rolekubectl create rolebinding geray --clusterrole=edit --serviceaccount=default:geray# 创建使用PSP权限的Rolekubectl create role psp:unprivileged --verb=use --resource=podsecuritypolicy --resource-name=psp-example# 将SA绑定到Rolekubectl create rolebinding geray:psp:unprivileged --role=psp:unprivileged --serviceaccount=default:geray
cat privileged.yaml apiVersion: v1kind: Podmetadata: name: test1spec: containers: - name: web image: nginx securityContext: privileged: truecat noPrivileged.yaml apiVersion: v1kind: Podmetadata: name: test2spec: containers: - name: web image: nginxkubectl --as=system:serviceaccount:default:geray create -f privileged.yaml kubectl --as=system:serviceaccount:default:geray create -f noPrivileged.yaml
3、gVisor
2、使用containerd作为容器运行时,准备好gVisor,创建一个RuntimeClass,创建一个Pod在gVisor上运行