核心服务器安全须用selinux精准策略封装,而非依赖宽容模式;先运行getenforce和sestatus -v确认状态与策略类型,再通过ps -ez、semanage fcontext、setsebool及audit2allow等工具实现进程约束、文件端口类型声明、布尔值收紧与日志驱动的最小权限闭环加固。

核心服务器不能靠“宽容”保安全,必须用SELinux做精准策略封装——不是关掉它,而是让它只放行业务必需的最小动作。
确认当前状态与基础环境
先摸清底子,避免误操作:
- 运行 getenforce 查看当前模式(Enforcing/Permissive/Disabled)
- 执行 sestatus -v 确认策略类型(通常是 targeted)、启用状态、以及是否加载了自定义模块
- 检查内核是否真正支持: ls /sys/fs/selinux —— 若目录存在且可读,说明SELinux已编译进内核
锁定服务进程的安全上下文
核心服务(如 nginx、postgresql、redis)必须运行在专用域中,不能混用默认标签:
- 用 ps -eZ | grep nginx 查看进程上下文,确认是否为
system_u:system_r:httpd_t:s0类型(而非 unconfined_t) - 若进程被标记为
unconfined_service_t或unconfined_t,说明它绕过了SELinux管控,需强制约束:
semanage permissive -d httpd_t(移除宽容域)
systemctl restart nginx - 验证重启后进程是否回归
httpd_t:若仍为 unconfined,检查 systemd unit 文件中是否含SELinuxContext=覆盖项,或是否启用了ProtectKernelModules=yes干扰上下文继承
精确声明文件与端口资源类型
让策略知道“哪些文件属于哪个服务”,不能依赖 restorecon 自动猜测:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 对自定义Web根目录(如
/srv/app/public)注册持久化上下文:
semanage fcontext -a -t httpd_sys_content_t "/srv/app/public(/.*)?"
restorecon -Rv /srv/app/public - 若服务需监听非标准端口(如 8443),先查端口是否已被占用:
semanage port -l | grep https_port_t
再添加:
semanage port -a -t https_port_t -p tcp 8443 - 数据库数据目录(如
/var/lib/myapp/data)应使用专用类型:
semanage fcontext -a -t mysqld_db_t "/var/lib/myapp/data(/.*)?"
restorecon -Rv /var/lib/myapp/data
收紧布尔值并禁用冗余开关
生产环境必须关闭“便利但危险”的全局布尔值:
- 列出所有启用的布尔值:
getsebool -a | grep on - 关闭高风险项:
setsebool -P allow_unconfined_ns 0
setsebool -P nis_enabled 0
setsebool -P use_nfs_home_dirs 0 - 仅按需开启业务必需项,例如:
setsebool -P httpd_can_network_connect_db 1(而非笼统的 httpd_can_network_connect) - 禁止运行时动态修改布尔值:
semanage boolean -m --on httpd_can_network_connect_db(-m 表示修改策略库,-P 是其快捷写法)
日志驱动的策略加固闭环
不靠猜测,靠 audit.log 的真实拒绝记录生成最小权限策略:
- 清空旧日志并触发一次典型业务请求:
truncate -s 0 /var/log/audit/audit.log - 执行操作(如访问API、写入日志、连接数据库)
- 提取本次拒绝事件:
ausearch -m avc -ts $(date --date="1 minute ago" "+%m/%d/%Y %H:%M:%S") | audit2why - 若确认是合理访问被拒,生成并安装专用模块:
ausearch -m avc -ts recent | audit2allow -M myapp_core
semodule -i myapp_core.pp - 模块命名须含业务标识(如 myapp_core),便于后续审计和卸载:
semodule -r myapp_core
严格策略封装的关键,在于拒绝一切未明确定义的访问。每次添加规则,都应反问:这个动作是否真的不可替代?有没有更细粒度的类型或布尔值可用?不复杂但容易忽略。










