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