如何通过SELinux/AppArmor实现仅允许指定应用程序运行?
当然可以用SELinux或者AppArmor实现这种「仅允许指定应用运行」的白名单管控,我给你分别拆解下两种工具的具体实现思路和实操步骤,都是生产环境里验证过的方案:
一、用SELinux实现白名单管控
SELinux是基于安全上下文的强制访问控制系统,要做白名单的核心思路是:只给你允许的应用分配合法的执行权限和安全域,其他未授权的程序默认被拒绝执行。
先确保SELinux处于强制模式
用sestatus命令检查当前状态,如果显示SELinux status: enabled且Current mode: enforcing就没问题。如果不是,修改/etc/selinux/config文件,把SELINUX=enforcing,然后重启系统生效(注意:重启前一定要确认系统基础服务能适配SELinux,避免开机异常)。为允许的应用创建自定义安全上下文
比如你要允许/usr/bin/myapp运行,先给它标记专属的执行类型:semanage fcontext -a -t myapp_exec_t "/usr/bin/myapp" restorecon -v /usr/bin/myapp这条命令会把
myapp的文件类型设置为myapp_exec_t,后续策略会基于这个类型做管控。编写并加载自定义SELinux策略模块
创建一个myapp.te文件,内容如下(基础版,你可以根据应用实际需求扩展权限):module myapp 1.0; require { type unconfined_t; type myapp_exec_t; class file execute; class process transition; } # 允许用户域执行myapp的文件 allow unconfined_t myapp_exec_t:file execute; # 执行时切换到myapp专属的域 type_transition unconfined_t myapp_exec_t:process myapp_t;然后编译、打包、加载这个模块:
checkmodule -M -m -o myapp.mod myapp.te semodule_package -o myapp.pp -m myapp.mod semodule -i myapp.pp收紧全局执行权限
最后要禁止未授权的执行行为,比如关闭普通用户执行未标记文件的权限:setsebool -P user_exec_content off这一步要谨慎测试,确保系统必要的工具(比如bash、ls这些)不会被误拦截。
二、用AppArmor实现白名单管控
AppArmor是基于路径的强制访问控制系统,配置起来比SELinux更直观,适合快速搭建白名单规则。
确保AppArmor服务正常运行
启动并设置开机自启:systemctl start apparmor systemctl enable apparmor为允许的应用生成专属Profile
用AppArmor自带的工具生成基础规则,比如给/usr/bin/myapp生成Profile:aa-genprof /usr/bin/myapp执行这条命令后,工具会提示你运行
myapp,它会自动记录应用需要的权限(比如访问哪些文件、网络操作等),生成的Profile文件会保存在/etc/apparmor.d/usr.bin.myapp。优化Profile并启用
打开生成的Profile文件,去掉不必要的权限规则,只保留myapp运行必需的内容,确保规则尽可能严格。然后启用这个Profile:aa-enforce /etc/apparmor.d/usr.bin.myapp设置全局默认拒绝策略
创建一个默认的拒绝Profile/etc/apparmor.d/default,内容如下(可以根据需要调整,比如允许系统核心工具运行):profile default { # 拒绝所有未被授权的二进制执行 deny /bin/** px, deny /sbin/** px, deny /usr/bin/** px, deny /usr/sbin/** px, # 如果有需要允许的基础工具,可以单独写允许规则,比如: # allow /bin/bash px, }加载这个默认Profile:
apparmor_parser -r /etc/apparmor.d/default
关键注意事项
- 无论用哪种工具,一定要先在测试环境验证,避免误拦截系统核心服务导致系统无法正常使用;
- 对于脚本或者动态生成的程序,要额外处理:比如允许Python脚本运行的话,要确保Python解释器被授权,或者在Profile中明确允许脚本的路径;
- 系统更新或应用版本变更后,要同步审查并更新策略,避免权限过期导致应用无法运行。
备注:内容来源于stack exchange,提问作者Zvi Vered

