Linux getenforce / sestatus / seinfo 的状态检查清单

2次阅读

getenforce直接显示selinux当前运行模式(enforcing/permissive/disabled),是轻量可靠的实时状态快照;sestatus则同时展示当前模式与配置文件设定值,避免重启后配置不生效;seinfo需加参数才输出策略元数据,否则无响应。

Linux getenforce / sestatus / seinfo 的状态检查清单

getenforce:三秒确认 SELinux 当前是否真在“管事”

直接运行 getenforce,它只输出一行:要么是 Enforcing,要么是 Permissive,要么是 Disabled。这是最轻量、最可靠的“实时状态快照”,不查配置、不读磁盘,只看内核当前执行策略的模式。

常见错误现象:getenforce 返回 Disabled,但 sestatus 显示 enabled —— 这说明 SELinux 内核模块已被卸载(比如用 selinux=0 启动参数),此时其他命令可能失效或行为异常。

  • Enforcing:策略正在生效,违规操作会被拒绝(如访问被标记为 httpd_sys_content_t 的文件却由非 httpd_t 进程发起)
  • Permissive:策略仍在加载,但所有拒绝动作都被绕过,只记日志到 /var/log/audit/audit.logdmesg
  • Disabled:SELinux 完全未启动,setenforce 会报错 Operation not supported

sestatus:看懂“配置 vs 实际”双状态,避免重启后翻车

sestatus 是唯一能同时告诉你“现在怎么跑”和“重启后打算怎么跑”的命令。关键字段有两组:Current mode(当前运行模式)和 Mode from config file(配置文件设定值)。

使用场景:排查“为什么我改了 /etc/selinux/config 却没生效?”—— 很可能 Current modePermissive,但 Mode from config fileenforcing,说明你只临时切过模式,还没重启。

  • -v 可看到进程和文件上下文示例,适合调试 Web 服务权限问题
  • -b 能列出所有布尔值开关(如 httpd_can_network_connect),比翻文档快得多
  • 注意 SELinux status: enabledCurrent mode: enforcing;前者只表示模块已加载,后者才决定是否拦截

seinfo:查策略细节时别被空输出坑住

seinfo 不是状态检查命令,而是策略元数据浏览器。它默认不输出任何内容,必须带参数才有信息,新手常以为命令坏了。

典型误操作:只输 seinfo,回车后光标闪半天没反应,其实它在等你指定要查什么。

  • seinfo -a:列出所有类型(type)、角色(role)、属性(Attribute)—— 输出极长,建议配合 lessgrep
  • seinfo -x -t httpd_t:查 httpd_t 域允许访问哪些类型(即它的“白名单”)
  • 若提示 Could not open policy handle,大概率是 SELinux 处于 Disabled 模式,或策略文件损坏(/sys/fs/selinux/policy 不可读)

临时关 SELinux 的正确姿势:setenforce 0 ≠ 关闭 SELinux

setenforce 0 实际是切换到 Permissive 模式,不是关闭。SELinux 依然在运行、依然记录 AVC 拒绝日志、依然维护安全上下文——只是不拦你。

为什么这样做?因为很多故障(如 nginx 无法读取自定义路径、容器挂载失败)需要先排除 SELinux 干扰,又不能贸然禁用(禁用需重启且破坏最小权限原则)。

  • 执行后务必用 getenforce 验证,别信“刚才敲了就一定成功”
  • setenforce 0 在重启后自动恢复原配置,不会持久化——这点常被运维忽略,导致上线后突然报错
  • setenforce 0 报错 Permission denied,说明你没用 root 权限,或当前已是 Disabled 模式(此时该命令不支持)

真正要关 SELinux,得改 /etc/selinux/config 里的 SELINUX=disabled 并重启;但除非你明确知道后果,否则只推荐用 Permissive 模式过渡。

text=ZqhQzanResources