kubernetes CKS 3.2 AppArmor限制容器对资源访问

AppArmor(Application Armor) 是一个 Linux 内核安全模块,可用于限制主机操作系统上运行的进程的功能。每个
进程都可以拥有自己的安全配置文件。安全配置文件用来允许或禁止特定功能,例如网络访问、文件读/写/执行权限等。
Linux发行版内置:Ubuntu、Debian

3.2.1 Apparmor两种工作模式

• Enforcement(强制模式) :在这种模式下,配置文件里列出的限制条件都会得到执行,并且对于违反这些限制条
件的程序会进行日志记录。
• Complain(投诉模式):在这种模式下,配置文件里的限制条件不会得到执行,Apparmor只是对程序的行为进行
记录。一般用于调试。

3.2.2 常用命令

• apparmor_status:查看AppArmor配置文件的当前状态的

# apparmor_status 
apparmor module is loaded.
14 profiles are loaded.
14 profiles are in enforce mode.
   /usr/bin/man
   /usr/lib/NetworkManager/nm-dhcp-client.action
   /usr/lib/NetworkManager/nm-dhcp-helper
   /usr/lib/connman/scripts/dhclient-script
   /usr/sbin/named
   /usr/sbin/ntpd
   /usr/sbin/tcpdump
   /{,usr/}sbin/dhclient
   docker-default
   lsb_release
   man_filter
   man_groff
   nvidia_modprobe
   nvidia_modprobe//kmod
0 profiles are in complain mode.
32 processes have profiles defined.
32 processes are in enforce mode.
   /usr/sbin/named (736) 
   /usr/sbin/ntpd (8885) 
   /usr/sbin/nginx (32045) docker-default
   /usr/sbin/nginx (32111) docker-default
   /usr/sbin/nginx (32112) docker-default
   /pause (40156) docker-default
   /pause (40257) docker-default
   /pause (40280) docker-default
   /pause (40287) docker-default
   /usr/local/bin/kube-apiserver (40350) docker-default
   /usr/local/bin/etcd (40526) docker-default
   /usr/local/bin/kube-controller-manager (40528) docker-default
   /usr/local/bin/kube-scheduler (40530) docker-default
   /pause (41166) docker-default
   /pause (42818) docker-default
   /pause (57092) docker-default
   /pause (57160) docker-default
   /pause (57167) docker-default
   /coredns (57511) docker-default
   /coredns (57524) docker-default
   /usr/bin/kube-controllers (57965) docker-default
   /pause (61082) docker-default
   /usr/sbin/nginx (62149) docker-default
   /usr/sbin/nginx (62186) docker-default
   /usr/sbin/nginx (62187) docker-default
   /pause (84236) docker-default
   /usr/local/apache2/bin/httpd (84661) docker-default
   /usr/local/apache2/bin/httpd (84692) docker-default
   /usr/local/apache2/bin/httpd (84693) docker-default
   /usr/local/apache2/bin/httpd (84694) docker-default
   /usr/bin/sleep (773935) docker-default
   /pause (3760464) docker-default
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.

• apparmor_parser:将AppArmor配置文件加载到内核中
• apparmor_parser # 加载到内核中
• apparmor_parser -r # 重新加载配置
• apparmor_parser -R # 删除配置
• aa-complain:将AppArmor配置文件设置为投诉模式,需要安装apparmor-utils软件包
• aa-enforce:将AppArmor配置文件设置为强制模式,需要安装apparmor-utils软件包
Version:0.9 StartHTML:0000000105 EndHTML:0000001235 StartFragment:0000000141 EndFragment:0000001195

3.2.3 K8s使用AppArmor的先决条件

• K8s版本v1.4+,检查是否支持:kubectl describe node |grep AppArmor

root@VM-12-7-ubuntu:~# kubectl describe node |grep AppArmor 
  Ready                True    Mon, 04 Jul 2022 15:33:22 +0800   Fri, 24 Jun 2022 16:20:04 +0800   KubeletReady                 kubelet is posting ready status. AppArmor enabled

• Linux内核已启用AppArmor,查看 cat /sys/module/apparmor/parameters/enabled

root@VM-12-7-ubuntu:~# cat /sys/module/apparmor/parameters/enabled 
Y

• 容器运行时需要支持AppArmor,目前Docker已支持

3.2.4 AppArmor限制容器对资源访问

AppArmor 目前处于测试阶段,因此在注解中指定AppArmor策略配置文件。

apiVersion: v1
kind: Pod
metadata:
  name: hello-apparmor
  annotations:
    container.apparmor.security.beta.kubernetes.io/: localhost/>

示例:
• Pod中容器名称
• Pod所在宿主机上策略名,默认目录/etc/apparmor.d

3.2.5案例:容器文件系统访问限制

3.2.5.1 将自定义策略配置文件保存到/etc/apparmor.d/

cat /etc/apparmor.d/deny-k8s-write
#include 
profile k8s-deny-write flags=(attach_disconnected) {
  #include 
  file, # 允许所有文件读写
#  deny /bin/** w, # 拒绝所有文件写
  deny /data/www/** w,
}

文件解析:
•第一行:导入依赖,遵循C语言约定
•第二行:指定策略名
•第三行:{} 策略块
![image.png](https://img-blog.csdnimg.cn/img_convert/c05b5b3579c71e32b6666e30dcfaea80.png#clientId=u004b64ad-ce30-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=741&id=u0ea88ad6&margin=[object Object]&name=image.png&originHeight=926&originWidth=946&originalType=binary&ratio=1&rotation=0&showTitle=false&size=218213&status=done&style=none&taskId=u074f9aa7-50b6-4682-ad70-3f7f0e75d8f&title=&width=756.8)

3.2.5.2 加载配置文件到内核:apparmor_parser

apparmor_parser deny-k8s-write

查看:

apparmor_status 

3.2.5.3 Pod注解指定策略配置名

apiVersion: v1
kind: Pod
metadata:
  name: hello-apparmor
  annotations:
    # 告知 Kubernetes 去应用 AppArmor 配置 "k8s-apparmor-example-deny-write"。
    # 请注意,如果节点上运行的 Kubernetes 不是 1.4 或更高版本,此注解将被忽略。
    container.apparmor.security.beta.kubernetes.io/hello: localhost/k8s-deny-write
spec:
  containers:
  - name: hello
    image: busybox:1.28
    command: [ "sh", "-c", "echo 'Hello AppArmor!' && sleep 1h" ]

进入容器验证,发觉无法再/data/www创建文件

root@k8s-master:~# kubectl exec -it hello-apparmor -- sh
/ # pwd
/
/ # touch wangjinxiong.txt
/ # cd /data/www
sh: cd: can't cd to /data/www: No such file or directory
/ # mkdir -p /data/www
/ # cd /data/www
/data/www # touch 1.txt
touch: 1.txt: Permission denied

3.2.6 工作流程

![image.png](https://img-blog.csdnimg.cn/img_convert/d2709900dcff542683fb2df6a4f0dec1.png#clientId=u004b64ad-ce30-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=593&id=ud6caa391&margin=[object Object]&name=image.png&originHeight=741&originWidth=1391&originalType=binary&ratio=1&rotation=0&showTitle=false&size=162190&status=done&style=none&taskId=u2f9f5a46-31bb-42ad-bedb-c750d24fc82&title=&width=1112.8)

3.2.7 CKS考试题目

在集群的工作节点上,执行下面准备好的配置文件/etc/apparmor.d/nginx_apparmor 编辑准备好的清单文件/home/candidate/KSSH00401/nginx-deploy.yaml应用于AppArmor文件。 最后,在Pod中应用apparmor策略文件。

# 1.先进入工作节点操作 
ssh kssh00401-worker1 
# 2.确认策略名称
vi /etc/apparmor.d/nginx_apparmor
# nginx-profile-3
或者
apparmor_status | grep nginx
apparmor_parser /etc/apparmor.d/nginx_apparmor # 加载策略
# 3.在管理节点操作
vi /home/candidate/KSSH00401/nginx-deploy.yaml
…
annotations:
container.apparmor.security.beta.kubernetes.io/<容器名称>: localhost/nginx-profile-3
# 4. 执行yaml文件
kubectl apply -f /home/candidate/KSSH00401/nginx-deploy.yaml

参考官方地址:https://kubernetes.io/zh-cn/docs/tutorials/security/apparmor/

你可能感兴趣的:(kubernetes,CKS,docker,linux,运维,kubernetes)