AppArmor(Application Armor) 是一个 Linux 内核安全模块,可用于限制主机操作系统上运行的进程的功能。每个
进程都可以拥有自己的安全配置文件。安全配置文件用来允许或禁止特定功能,例如网络访问、文件读/写/执行权限等。
Linux发行版内置:Ubuntu、Debian
• Enforcement(强制模式) :在这种模式下,配置文件里列出的限制条件都会得到执行,并且对于违反这些限制条
件的程序会进行日志记录。
• Complain(投诉模式):在这种模式下,配置文件里的限制条件不会得到执行,Apparmor只是对程序的行为进行
记录。一般用于调试。
• 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
• 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已支持
AppArmor 目前处于测试阶段,因此在注解中指定AppArmor策略配置文件。
apiVersion: v1
kind: Pod
metadata:
name: hello-apparmor
annotations:
container.apparmor.security.beta.kubernetes.io/ : localhost/>
示例:
• Pod中容器名称
• Pod所在宿主机上策略名,默认目录/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)
apparmor_parser deny-k8s-write
查看:
apparmor_status
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
![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)
在集群的工作节点上,执行下面准备好的配置文件/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/