SELinux 与 AppArmor

一、SELinux

1. 概念

2. 模式

getenforce
setenforce 0   # permissive
setenforce 1   # enforcing

3. 文件标签

ls -Z
ps -eZ
id -Z

# 改标签
chcon -t httpd_sys_content_t /var/www/html/index.html
restorecon -v /path/to/file

# 查看所有类型
seinfo -t

4. 策略

# 策略包
semodule -l

# 加载
semodule -i mypolicy.pp

# 生成
audit2allow -a

# 日志
ausearch -m avc
sealert -a /var/log/audit/audit.log

5. 嵌入式 SELinux 定制

二、AppArmor

1. 概念

2. 配置

apt install apparmor apparmor-utils
aa-status

3. 策略

/etc/apparmor.d/

# 例:限制 myapp
cat > /etc/apparmor.d/usr.bin.myapp <<EOF
#include <tunables/global>

/usr/bin/myapp {
    #include <abstractions/base>
    /etc/myapp.conf r,
    /var/log/myapp w,
    /tmp/myapp-* rwk,
    deny capability sys_admin,
}
EOF

apparmor_parser -r /etc/apparmor.d/usr.bin.myapp

三、能力(Capabilities)

# 查看
getcap /usr/bin/myapp

# 设置
setcap cap_net_raw+ep /usr/bin/ping

常见 capability:
- CAP_CHOWN
- CAP_DAC_OVERRIDE
- CAP_NET_ADMIN
- CAP_NET_RAW
- CAP_SYS_ADMIN
- CAP_SYS_NICE
- CAP_SYS_TIME
- CAP_MKNOD

四、seccomp

1. 概念

2. 使用

#include <seccomp.h>

scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_ALLOW);
seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(execve), 0);
seccomp_load(ctx);
seccomp_release(ctx);

3. Docker / systemd 用 seccomp 限制容器

五、嵌入式建议