SELinux 宽容模式(permissive) 强制模式(enforcing) 关闭(disabled) 几种模式之间的转换

本文介绍了SELinux的三种模式及其切换方法,包括如何通过命令行进行操作、配置文件的调整以及与系统启动参数的关系。此外,还提供了禁用SELinux的方式以及避免重启系统的解决方案。

在Android的root相关的文章里经常会看到关于SElinux,Android4.3以后引进SElinux。

SELinux 的启动、关闭与查看

1、并非所有的 Linux distributions 都支持 SELinux
目前 SELinux 支持三种模式,分别如下:

•enforcing:强制模式,代表 SELinux 运作中,且已经正确的开始限制 domain/type 了;

•permissive:宽容模式:代表 SELinux 运作中,不过仅会有警告讯息并不会实际限制 domain/type 的存取。这种模式可以运来作为 SELinux 的 debug 之用;

•disabled:关闭,SELinux 并没有实际运作。

2,查看SELinux的模式

# getenforce Enforcing <==就显示出目前的模式为 Enforcing

3,查看 SELinux 的政策 (Policy)

[root@master oracle]# sestatus
SELinux status: enabled <==是否启动 SELinux
SELinuxfs mount: /selinux <==SELinux 的相关文件资料挂载点
Current mode: enforcing <==目前的模式
Mode from config file: enforcing <==设定档指定的模式
Policy version: 21
Policy from config file: targeted <==目前的政策为何?

4,通过配置文件调整SELinux的参数

[root@www ~]# vi /etc/selinux/config 
SELINUX=enforcing <==调整 enforcing|disabled|permissive 
SELINUXTYPE=targeted <==目前仅有 targeted 与 strict 

5,SELinux 的启动与关闭

【重要常识】上面是预设的政策与启动的模式!你要注意的是,如果改变了政策则需要重新开机;如果由 enforcing 或 permissive 改成 disabled ,或由 disabled 改成其他两个,那也必须要重新开机。这是因为 SELinux 是整合到核心里面去的, 你只可以在 SELinux 运作下切换成为强制 (enforcing) 或宽容 (permissive) 模式,不能够直接关闭 SELinux 的!
同时,由 SELinux 关闭 (disable) 的状态到开启的状态也需要重新开机啦!所以,如果刚刚你发现 getenforce 出现 disabled 时, 请到上述文件修改成为 enforcing 吧!

【重点】如果要启动SELinux必须满足以下两个点:
所以,如果你要启动 SELinux 的话,请将上述的 SELINUX=enforcing 设定妥当,并且指定 SELINUXTYPE=targeted 这一个设定, 并且到 /boot/grub/menu.lst 这个文件去,看看核心有无关闭 SELinux 了呢?

[root@www ~]# vi /boot/grub/menu.lst 
default=0 
timeout=5 
splashimage=(hd0,0)/grub/splash.xpm.gz 
hiddenmenu 
title CentOS (2.6.18-92.el5) 
      root (hd0,0) 
      kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quiet selinux=0 
      initrd /initrd-2.6.18-92.el5.img 

如果要启动 SELinux ,则不可以出现 selinux=0 的字样在 kernel 后面!

【问题】通过上面的学习我们知道,如果将启动着的SELinux改为禁用,需要重启电脑,我们不想重启电脑又不想开启SELinux该怎么办呢?
【答案】将强制模式改为宽松模!

[root@www ~]# setenforce [0|1] 

选项与参数:
0 :转成 permissive 宽容模式;
1 :转成 Enforcing 强制模式

范例一:将 SELinux 在 Enforcing 与 permissive 之间切换与查看

[root@www ~]# setenforce 0 
[root@www ~]# getenforce Permissive 
[root@www ~]# setenforce 1 
[root@www ~]# getenforce Enforcing

6,查看已启动程序的type设定

[root@master oracle]# ps aux -Z 
LABEL USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND 
system_u:system_r:init_t root 1 0.0 0.4 2060 520 ? Ss May07 0:02 init [5 system_u:system_r:kernel_t root 2 0.0 0.0 0 0 ? S< May07 0:00 [migra] system_u:system_r:kernel_t root 11 0.0 0.0 0 0 ? S< May07 0:00 [kacpi] system_u:system_r:auditd_t root 4022 0.0 0.4 12128 560 ? S<sl May07 0:01 auditd system_u:system_r:auditd_t root 4024 0.0 0.4 13072 628 ? S<sl May07 0:00 /sbin/a system_u:system_r:restorecond_t root 4040 0.0 4.4 10284 5556 ? Ss May07 0:00 /usr/sb 

说明:其实这些东西我们都不用管,都是SELinux内置的。只要学会在强制和宽松模式间转换就行了!

小结附:

关闭SELinux的方法:
修改/etc/selinux/config文件中的SELINUX="" 为 disabled ,然后重启。
如果不想重启系统,使用命令setenforce 0

注:
setenforce 1 设置SELinux 成为enforcing模式
setenforce 0 设置SELinux 成为permissive模式
在lilo或者grub的启动参数中增加:selinux=0,也可以关闭selinux


查看selinux状态:
/usr/bin/setstatus -v
如下:

SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   permissive
Mode from config file:          enforcing
Policy version:                 21
Policy from config file:        targeted

getenforce/setenforce查看和设置SELinux的当前工作模式


查看SELinux状态:

1、/usr/sbin/sestatus -v ##如果SELinux status参数为enabled即为开启状态

SELinux status: enabled

2、getenforce ##也可以用这个命令检查

关闭SELinux:

1、临时关闭(不用重启机器):


setenforce 0  ##设置SELinux 成为permissive模式

##setenforce 1 设置SELinux 成为enforcing模式

2、修改配置文件需要重启机器:

修改/etc/selinux/config 文件

将SELINUX=enforcing改为SELINUX=disabled

重启机器即可

### 问题分析 在某些系统中,将 SELinux 设置为 `permissive` 模式可能导致系统崩溃。这通常与 SELinux 的运行机制和特定系统的安全策略配置有关。SELinux 在 `permissive` 模式下仍然会检查访问控制策略,并记录违反策略的行为,但不会实际阻止这些操作[^2]。尽管如此,在某些情况下,这种行为可能会导致关键进程因无法满足预期的安全策略而异常终止。 此外,SELinux 的行为依赖于内核模块和安全策略的正确配置。如果安全策略文件损坏、不兼容或未正确加载,即使处于 `permissive` 模式,也可能引发系统不稳定的问题[^3]。 ### 解决方法 #### 1. 检查 SELinux 日志以定位问题根源 在系统崩溃后,应优先检查日志信息,尤其是包含 `avc:` 字样的日志条目。这些条目表示 SELinux 拒绝了某个访问请求,可能与系统崩溃相关。使用以下命令过滤日志: ```bash dmesg | grep avc: ``` 也可以结合 `logcat` 查看 Android 系统中的详细日志输出,以进一步确认问题来源[^2]。 #### 2. 避免直接设置 `SELINUX=permissive` 如果发现将 SELinux 设置为 `permissive` 导致系统崩溃,建议避免直接修改 `/etc/selinux/config` 文件中的 `SELINUX=permissive`,而是考虑临时使用 `setenforce 0` 命令切换到宽容模式进行调试。该方式仅在当前运行时生效,重启后将恢复原有配置,从而降低系统崩溃的风险[^1]。 #### 3. 审查并修复安全策略 SELinux 的安全性依赖于其策略文件的完整性与正确性。若系统崩溃发生在 SELinux 政策加载阶段,可能是由于策略文件存在冲突或缺失。可以通过重新编译或更新 SELinux 策略来解决此类问题。对于嵌入式设备,如 Android 系统,应确保所有服务和进程的 SELinux 上下文定义完整且正确[^4]。 例如,在 Android 系统中,可以检查 `/sepolicy` 文件是否被正确加载,并确保 `.te`(Type Enforcement)文件中的权限声明准确无误。 #### 4. 在开发环境中启用 SELinux 调试功能 在调试过程中,可启用 SELinux 的审计功能,以便更详细地追踪访问控制决策过程。通过向内核启动参数添加 `selinux=1 enforcing=0` 可以启用 SELinux 并将其置于宽容模式,同时保留完整的策略执行路径,便于排查潜在问题。 #### 5. 对于 Android 系统,考虑禁用 SELinux 或调整策略 在 Android 开发中,如果 SELinux 的限制过于严格且难以适配现有组件,可以在内核配置中移除 `CONFIG_SECURITY_SELINUX=y` 选项,从源头上禁用 SELinux 支持[^1]。此方法适用于定制固件开发,尤其在构建用户版本时需确保所有组件均符合 SELinux 策略要求,否则可能出现运行时权限问题。 ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值