Linux安全:AppArmor 的基本概念和管理

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参数重新加载配置文件。

相关链接

Spread the love
Comments are closed.