Linux安全:AppArmor 的基本概念和管理
AppArmor是一项安全功能,可以在许多Linux发行版中找到。如:
- Annvix
- Arch Linux
- SLES
- openSUSE
- CentOS
- Debian
- Gentoo
- Pardus Linux
- PLD
- Ubuntu
同SELinux,Apparmor也是内核增强功能,旨在将程序限制在有限的资源集中。由于 AppArmor 和 SELinux 使用了同样的框架,所以它们可以互换。AppArmor 的开发初衷是因为人们认为 SELinux 太过复杂,不适合普通用户管理。Apparmor与其他安全工具的不同之处在于,它将访问控制属性绑定到程序而不是单个用户。
与SELinux相比,优势在于其易用性,实现同样的功能限制,会比使用SELinux的规则代码少很多;而且从代码的可读性上来看,apparmor的代码也更易理解和易读。
从安全性上来说,毋庸置疑,SELinux更安全。从理论上也可以了解到SELinux与Apparmor最大的区别在于:Apparmor使用文件名(路径名)最为安全标签,而SELinux使用文件的inode作为安全标签,这就意味着,Apparmor机制可以通过修改文件名而被绕过,另外,在文件系统中,只有inode才具有唯一性。
基本功能及使用
假设有一个可执行文件的路径为/usr/bin/man
,如果要用Apparmor
对其进行访问控制的话,就要新建一个文件名为usr.bin.man
的配置文件,并把这个配置文件放到Apparmor专门放置配置文件的目录/etc/apparmor.d
下。
所以每一个可执行文件都是与一个配置文件绑定的,因此如果修改/etc/apparmor.d/usr.bin.man
的文件名的话,配置策略将失效。
状态管理
Apparmor的限制是由加载到内核中的上述特殊配置文件提供的。这些配置文件可以在两种模式下运行:complain mode或enforce mode。
- Enforcement(强制): 以enforce模式加载的配置文件将导致配置文件中定义的策略被强制执行,同时对于违反这些限制条件的程序会进行日志记录(通过 syslog 或 auditd),类似SELinux的
enforcing
模式。 - Complain(投诉): Complain模式下的配置文件不会强制执行策略,而是报告违反策略的尝试,不会对程序的行为进行限制,只是进行记录。类似SELinux的
permissive
模式。
状态的查看
# 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.
4 processes have profiles defined.
4 processes are in enforce mode.
/usr/sbin/named (732)
/usr/sbin/ntpd (8750)
/usr/local/bin/redis-server (57596) docker-default
/usr/sbin/mysqld (501935) docker-default
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.
除了工作模式以外,Apparmor可以对程序进行多方面的限制,下面介绍几种简单常用的访问控制与资源限制功能。
文件系统的访问控制
Apparmor可以对某一个文件,或者某一个目录下的文件进行访问控制,包括以下几种访问模式:
权限符 | 说明 |
---|---|
r | 阅读 |
w | 写 |
ux | 无约束执行 |
Ux | 无约束执行 – 擦洗环境 |
px | 离散配置文件执行 |
Px | 离散配置文件执行 – 清理环境 |
ix | 继承执行 |
m | 允许PROT_EXEC与mmap(2)调用 |
l | 链接 |
在配置文件中的写法如/tmp r
, 表示可对/tmp
目录下的文件进行读取.没在配置文件中列出的文件,程序是不能访问的,类似白名单。
资源限制
Apparmor可以提供类似系统调用setrlimit一样的方式来限制程序可以使用的资源。要限制资源,可在配置文件中这样写:
set rlimit [resource] <= [value],
其resource代表某一种资源,value代表某一个值,
要对程序可以使用的虚拟内存做限制时,可以这样写:
set rlimit as<=10M, (可以使用的虚拟内存最大为10M)
注意:Apparmor可以对程序要使用多种资源进行限制,fsize
,data
,stack
,core
,rss
,as
,memlock
,msgqueue
等,但暂不支持对程序可以使用CPU时间进行限制。
访问网络限制
Apparmor可以程序是否可以访问网络进行限制,在配置文件里的语法是:
network [ [domain] [type] [protocol] ]
要让程序可以进行所有的网络操作,只需在配置文件中写:
network,
要允许程序使用在IPv4下使用TCP协议,可以这样写:
network inet tcp,
Capability条目
apparmor可以限制程序是否可以进行Capability
列表里的操作,如:
capability net_raw
允许应用程序访问CAP_NET_RAW
Posix.1e功能
根据上述提到的各种策略语法,可以编写出需要的配置文件,并按要求命名,放到/etc/apparmor.d
目录下,然后重启apparmor
服务即可。
修改任何/etc/apparmor.d
下的配置后,均需重启apparmor
服务生效,以下内容不再提示
~ # systemctl reload apparmor.service
配置文件和常用工具
相关软件包 apparmor-profiles
, apparmor-utils
apparmor-utils
软件包包含用于配置Apparmor的命令行工具。使用它可以更改Apparmor的执行模式,查找创建新配置文件的配置文件状态等。
aa-genprof
除了手动创建必要的配置文件以外,也有一些命令行工具可以快速创建策略文件,如aa-genprof
。
通过aa-genprof
创建对/usr/local/bin/puppy
的策略
~ # aa-genprof /usr/local/bin/puppy
~ # cat /etc/apparmor.d/usr.local.bin.puppy
# Last Modified: Wed May 18 19:07:42 2022
#include <tunables global=""></tunables>
/usr/local/bin/puppy {
#include <abstractions base=""></abstractions>
/usr/local/bin/puppy mr,
}
该文件默认是Enforcement
模式,可以通过如下方式修改文件以改变其工作模式
# Last Modified: Wed May 18 19:07:42 2022
#include <tunables global=""></tunables>
/usr/local/bin/puppy flags=(complain) {
#include <abstractions base=""></abstractions>
/usr/local/bin/puppy mr,
}
对于修改工作模式,也可以使用如下两个命令行工具来实现。
aa-complain
把AppArmor配置文件设置为complain模式
aa-enforce
把AppArmor配置文件设置为enforce模式
apparmor_status
看AppArmor配置文件的当前状态的,见上文
apparmor_parser
就是将AppArmor配置文件直接加载到内核,可以不用重启apparmor
服务让配置的规则生效。
可以使用-r
参数重新加载配置文件。
相关链接
- Apparmor的绕过
- 什么是AppArmor,以及如何保持Ubuntu安全?
- 在 Linux 上用 SELinux 或 AppArmor 实现强制访问控制(MAC)
- Linux 下selinux和AppArmor安全策略初探
-
https://zhuanlan.zhihu.com/p/457269937
- https://mos86.com/82456.html
- https://ubuntuqa.com/article/719.html
- https://wiki.ubuntu.com/AppArmor
- https://help.ubuntu.com/12.10/serverguide/apparmor.html