一、起源
项目源地址AppArmor / apparmor · GitLab,与SELinux一样,也是属于强制访问控制(MAC)机制,默认集成在openSUSE和Ubuntu系统中,优势是比SELinux配置简单,并且有学习模式,方便用户使用。AppArmor可以限制特定进程读取/写入和执行文件的能力(及其他能力)。其主要理念是进程内部发生的操作都不能脱离控制。
而 SELinux 则是使用附加到对象(例如文件、二进制文件、网络套接字)的标签,并通过这些标签确定特权边界,从而建立一个可以跨越多个进程甚至整个系统的限制级别。
二、架构和模式
与SELinux一样,AppArmor也是一种强制访问类型(MAC)的扩展,只有当要访问的资源符合DAC要求后,才会进行AppArmor的权限判断。但是与SELinux必须只有明确的允许策略才能允许访问不同,AppArmor只有当程序的配置文件明确规定了受限,才会限制。比如我们安装了一个可执行程序,如果想用AppArmor进行访问控制,就需要新建一个配置文件到/etc/apparmor.d/目录下,这个目录下的每个配置文件都是跟可执行程序绑定的,不要随便修改配置文件名或程序路径。
2.1 获取AppArmor运行模式
1、查看APPArmor运行状态
可以使用cat /sys/module/apparmor/parameters/enabled
Y:表示正在运行。
使用
aa-status
可以查看当前
AppArmor
的运行状态和具有配置文件的应用程序:
AppArmor的工作模式有两种(实际跟SELinux一样,也是三种,关闭模式这里未包含):Enforce、Complain。
Enforce:只有一些状态事件(比如加载配置文件)和导致拒绝的事件生成审核信息;
Complain:与Enforce类似,只是对于违反配置的事件也是允许的,不会拒绝。
2.2、改变APPArmor的运行模式
AppArmor的配置文件在/etc/apparmor.d/目录下,如果想修改某个程序的运行模式,可以用aa-complain或aa-enforce把程序修改为投诉模式或强制模式,例如:
sudo aa-complain /bin/ping
sudo aa-enforce /bin/ping
如果想禁用AppArmor可以使用以下命令:
aa-teardown:卸载当前会话所有的配置文件;
sudo /etc/init.d/apparmor stop 停止apparmor功能;
如果新增了一个程序,想用AppArmor进行权限管理,可以使用sudo aa-genprof <path to executable>命令生成apparmor配置文件。
三、AppArmor策略
以tcpdump文件为例,它的策略文件如下:
# vim:syntax=apparmor
# Last Modified: Wed Feb 3 07:58:30 2009
# Author: Jamie Strandboge <[email protected]>
#include <tunables/global>
/usr/sbin/tcpdump {
#include <abstractions/base>
#include <abstractions/nameservice>
#include <abstractions/user-tmp>
capability net_raw,
capability setuid,
capability setgid,
capability dac_override,
network raw,
network packet,
# for -D
capability sys_module,
@{PROC}/bus/usb/ r,
@{PROC}/bus/usb/** r,
# for finding an interface
@{PROC}/[0-9]*/net/dev r,
/sys/bus/usb/devices/ r,
/sys/class/net/ r,
/sys/devices/**/net/* r,
# for -j
capability net_admin,
# for tracing USB bus, which libpcap supports
/dev/usbmon* r,
/dev/bus/usb/ r,
/dev/bus/usb/** r,
# for init_etherarray(), with -e
/etc/ethers r,
# for USB probing (see libpcap-1.1.x/pcap-usb-linux.c:probe_devices())
/dev/bus/usb/**/[0-9]* w,
# for -z
/{usr/,}bin/gzip ixr,
/{usr/,}bin/bzip2 ixr,
# for -F and -w
audit deny @{HOME}/.* mrwkl,
audit deny @{HOME}/.*/ rw,
audit deny @{HOME}/.*/** mrwkl,
audit deny @{HOME}/bin/ rw,
audit deny @{HOME}/bin/** mrwkl,
owner @{HOME}/ r,
owner @{HOME}/** rw,
# for -r, -F and -w
/**.[pP][cC][aA][pP] rw,
# for convenience with -r (ie, read pcap files from other sources)
/var/log/snort/*log* r,
/usr/sbin/tcpdump mr,
# Site-specific additions and overrides. See local/README for details.
#include <local/usr.sbin.tcpdump>
}
可以看到AppArmor的权限配置比SELinux要简单很多,以文件为例,可配置的权限有:
配置项
含义
r
读取数据
w
创建、删除、写入文件
a
追加权限
k
文件锁定权限
l
链接权限
x
可执行权限
m
内存映射可执行文件
3.1 违反策略的日志
违反AppArmor权限的日志可能写到以下文件:
/var/log/kern.log
/var/log/syslog
它的拦截日志的可读性比selinux的拦截日志可读性要好多了。
3.2 违反策略的解决方法
1、改为投诉模式
可以使用sudo aa-complain [PROGRAM1 PROGRAM2 ...]命令将对该程序的安全模式改为投诉模式,只监控不拦截。
2、修改策略配置文件
apparmor_parser专门用来编译、管理AppArmor策略,包括加载新的apparmor.d策略文件到内核。
可以修改/etc/apparmor.d/目录下程序的配置文件,根据拦截日志添加对应的权限,修改完成后可以使用sudo apparmor_parser -r /etc/apparmor.d/process_name 重新加载配置文件。
版权归原作者 yolo_yyh 所有, 如有侵权,请联系我们删除。