
Kubernetes AppArmor 简单运用
AppArmor 简介
AppArmor 是一个有效且易于使用的 Linux 应用程序安全系统。AppArmor 通过强制执行良好行为并防止已知和未知的应用程序缺陷被利用,主动保护操作系统和应用程序免受外部或内部威胁,甚至是零日攻击。
AppArmor 通过提供强制访问控制 (MAC) 来补充传统的 Unix 自主访问控制 (DAC) 模型。自 2.6.36 版起,它已包含在主线 Linux 内核中,并且自 2009 年以来,它的开发得到了 Canonical 的支持。
AppArmor 模式
AppArmor 有两种工作模式:enforcement、complain。
模式 | 描述 |
---|---|
Enforcement |
配置文件里列出的限制条件都会得到执行,并且对于违反这些限制条件的程序会进行记录。 |
Complain |
配置文件里的限制条件不会得到执行,Apparmor只是对程序的行为进行记录。例如程序可以写一个在配置文件里注明只读的文件,但 Apparmor 不会对程序的行为进行限制,只是进行记录。 |
访问控制与资源限制
文件系统的访问控制
Apparmor 可以对某一个文件,或者某一个目录下的文件进行访问控制,包括以下几种访问模式:
访问模式 | 描述 |
---|---|
r |
读模式 |
w |
写模式 |
a |
追加模式 |
f |
锁定文件模式 |
l |
链接模式 |
在配置文件中的写法,例如:
# 表示可对/tmp目录下的文件进行读取
/tmp r
注意:没在配置文件中列出的文件,程序是不能访问的。
资源限制
Apparmor 可以提供类似系统调用 setrlimit 一样的方式来限制程序可以使用的资源。要限制资源,可在配置文件中这样写:
set rlimit [resource] <= [value],
其 resource 代表某一种资源,value 代表某一个值,要对程序可以使用的虚拟内存做限制时,可以这样写:
# 可以使用的虚拟内存最大为1M
set rlimit as <= 1M,
访问网络
Apparmor 可以限制程序的网络访问,在配置文件中的语法是:
network [[domain][type][protocol]]
举例:
# 设置程序可以进行所有的网络操作
network
# 允许程序使用IPv4中的TCP协议
network inet tcp
配置文件的编写
编写完配置文件后,要把文件放到/etc/apparmor.d
这个目录下
配置与安装
在k8s工作节点安装 apparmor 命令。
# Ubuntu
apt-get install apparmor-utils apparmor-profiles apparmor-profiles-extra -y
# Centos请参考
# https://gitlab.com/apparmor/apparmor/-/wikis/Distro_CentOS
接着我们查看当前AppArmor的状态。
apparmor_status
# 或者通过如下命令检查模块是否启用
cat /sys/module/apparmor/parameters/enabled
注意:Apparmor 的profile配置文件均保存在目录/etc/apparmor.d
,对应的日志文件记录在/var/log/messages
。
Demo
在工作节点创建/etc/apparmor.d/nginx_apparmor
文件,并编写可以读取所有文件的策略和不可以做写文件的操作。
vim /etc/apparmor.d/nginx_apparmor
#include <tunables/global>
profile nginx-profile flags=(attach_disconnected) {
#include <abstractions/base>
file,
# Deny all file writes.
# 拒绝所有对文件写的操作
deny /** w,
}
接着我们创建一个Pod,不加载apparmor配置。vim pod1.yaml
apiVersion: v1
kind: Pod
metadata:
name: hello-apparmor
annotations:
container.apparmor.security.beta.kubernetes.io/hello: localhost/nginx-profile
spec:
containers:
- name: hello
image: busybox
command: ["sh","-c","echo 'Hello AppArmor!' && sleep 1h"]
在集群的工作节点上,确保准备好的AppArmor文件在/etc/AppArmor.d
的目录下,文件名称是nginx_apparmor。编辑位于~/pod1.yaml
准备好的清单文件,以应用AppArmor配置。最后应用清单文件并创建pod指定清单文件。
ssh node1
apparmor_parser -q /etc/apparmor.d/nginx_apparmor
apparmor_status | grep nginx
exit
注意必须加入这一串:container.apparmor.security.beta.kubernetes.io/<容器名>: localhost/<策略>
表示该容器启动时必须遵守配置的Apparmor策略规则。
读取文件,我们没有做限制,访问是没什么问题的。
kubectl exec hello-apparmor -- cat /etc/hosts
写一个文件时,就会报错没权限。
kubectl exec hello-apparmor -- touch /etc/test1
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

