介绍
AppArmor(ApplicationArmor)是一个Linux内核安全模块,可用于限制主机操作系统上运行的进程的功能。每个进程都可以拥有自己的安全配置文件。安全配置文件用来允许或禁止特点功能,例如网络访问、文件读/写/执行权限等
linux发行版内置:Ubuntu、Debian 在cents中是selinux,相比于linux更易于使用
工作流程
1、创建一个pod在注解里指定apparmor的profile
2、文件在对应宿主机上,对应宿主机的kubelet读取对应配置
3、如果pod的请求profile里拒绝,则pod没有权限
AppArmor两种工作模式
Enforcement(强制模式):在这种模式下,配置文件里列出的限制条件都会得到执行,并且对于违反这些挟制条件的程序会进行日志记录
Complain(投诉模式):在这种模式下,配置文件里的限制条件不会得到执行,Apparmor只是对程序的行为进行记录一般用于调试
常用命令:
apparmor_status: 查看AppArmor配置文件的当前状态的
apparmor_parser:将AppArmor配置文件加载到内核中
apparmor_parser<profile> #加载到内核中
apparmor_parser-r <profile> #重新加载配置
apparmor_parser-R <profile> #删除配置
aa_complaij:将AppArmor配置文件设置为投诉模式,需要安装apparmor-utils软件包
aa-enforce:将AppArmor配置文件设置为强制模式,需要安装apparmor-utils软件包
K8s使用APPArmor的先决条件:
系统ubentu内置 centos不内置 做此实验用ubentu
K8s版本v1.4+,检查是否支持:kubectl describe node |grep AppArmor
Linux内核已启用AppArmor,查看cat /sys/module/apparmor/parameters/enabled
容器运行时需要支持AppArmor,目前Docker已支持
container.apparmor.security.beta.kubernetes.io/<container_name>: <profile_ref>
<container_name> 的名称是配置文件所针对的容器的名称,<profile_def> 则设置要应用的配置文件。 <profile_ref>
- runtime/default
- localhost/<profile_name> 应用在主机上加载的名为 <profile_name>
- unconfined
<profile_ref>
#<container_name>Pod中容器名
#<profile_ref>pod所在宿主机上策略名,默认目录/etc/apparmor.d
访问文件权限模式
字符 | 描述 |
r | 读 |
w | 写 |
a | 追加 |
k | 文件加锁 |
l | 链接 |
x | 可执行 |
通配符 | 描述 | 示列 |
* | 在目录级别匹配零个或多个字符 | /dir/* 匹配目录中的任何文件 /dir/a* 匹配目录中以a开头的任意文件 /dir/*.png 匹配目录中以.png结尾的任意文 件 /dir/a*/ 匹配/dir里面以a开头的目录 /dir/*a/ 匹配/dir里面以a结尾的目录 |
** | 在多个目录级别匹配零个或多个字符 | /dir/** 匹配/dir目录或者/dir目录下任何文件 和目录 /dir/**/ 匹配/dir或者/dir下面任何目录 |
[] [^] | 字符串,匹配其中任意字符 | /dir/[^.]* 匹配/dir目录中以.之外的任何文件 /dir/**[^/] 匹配/dir目录或者/dir下面的任何 目录中的任何文件 |
案列:容器文件系统访问限制
步骤
1、将自定义策略配置文件保存到/etc/apparmor.d/修改文件即时生效
2、加载配置文件到内核:apparmor_parser<profile>
3、pod注解指定策略配置名
1.自定义配置文件及对应说明
2.加载至内核
【】cd /etc/apparmor.d/
【】apparmor_parser -r k8s-deny-write
【】apparmor_status |grep k8s
3、pod注解指定策略配置名并测试
【】kubectl apply -f apparmor.yaml#在上文
【】kubectl exec -it hello-apparmor bash
【】mkdir /test
4、创建其他pod可进行正常创建等行为
【】kubectl create deployment web --image=nginx-n zn
【】kubectl exec -it -n zn web-8667899c97-4s52r
【】mkdir /tmp/123
【】touch test