如何禁用SELinux(有无重启)
在本教程中,我将向我们介绍在Linux环境中正确禁用SELinux的步骤,尽管不建议这样做,但我们可以选择将活动模式更改为Permissive。
什么是SELinux?
在常规Linux系统上活动的默认访问控制基于
D
必需A
访问C
ontrol(DAC
)机制考虑
/etc/shadow
文件,其中包含本地Linux帐户的密码和帐户信息。没有适当的访问控制机制,该文件可由root用户拥有的任何进程读取和写入,而不管该进程在系统上的用途如何。
同样,许多软件守护程序都以Linux的" root用户"身份运行或者在系统上具有重要的特权。
这些守护程序中的错误很容易导致信息泄漏,甚至可能导致远程"可利用的漏洞"。
SELinux与DAC对应版本不同,实现了强制性的M和A的C语言控制(MAC),使管理员可以完全控制系统上允许的内容和不允许的内容。
"强制性"表示访问控制由操作系统强制执行,并且仅由系统管理员(或者安全管理员)已启用的策略规则定义
SELinux从根本上回答了这个问题:"可以<subject>对<object>执行<action>?
",例如:" Web服务器可以访问用户主目录中的文件吗?
"MAC系统可以配置为仅允许有限数量的进程读取和写入文件。
在这种经过特殊配置的系统上,以root用户身份登录的用户无法直接访问该文件,甚至无法移动该文件。
他甚至无法更改文件的属性:
# id uid=0(root) gid=0(root) # cat /etc/shadow cat: /etc/shadow: Permission denied # chmod a+r /etc/shadow chmod: changing permissions of '/etc/shadow': Permission denied
我应该使用SELinux吗?
这个问题没有简单明了的答案
这完全取决于需求,但一般建议是将其保持在"执行"状态
SELinux增强了系统安全性,因此,如果我们最关心安全性,那么必须在环境中使用SELinux
尽管我建议我们可以选择将其保持在"允许"状态而不是"禁用"状态
SELinux状态和模式
SELinux支持三种主要状态,即:disabled,permissive和enforcing。
这些状态通过SELINUX变量在/etc/selinux/config
文件中设置。
# egrep ^SELINUX= /etc/selinux/config SELINUX=enforcing
状态描述如下:
强制执行
这是默认且推荐的操作模式
这意味着SELinux处于活动状态,并将在系统上执行其策略
报告违反行为,也予以否认
有时将其称为主机入侵防护,因为它会在记录执行的操作时执行规则。
宽容的
SELinux处于活动状态,但不会在系统上强制执行其策略
相反,将报告任何违反该政策的行为,但仍然允许。
有时这称为主机入侵检测,因为它在仅报告模式下工作。
残障人士
- SELinux代码禁用了进一步的支持,从而在不激活SELinux的情况下进一步引导了系统。
检查SELinux状态
有几种方法可以用来检查Linux环境中SELinux的状态。
我们可以使用libselinux-utils提供的getenforce命令。
# getenforce Enforcing
要获取有关此状态的更多详细信息,请使用sestatus
# sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: enforcing Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Memory protection checking: actual (secure) Max kernel policy version: 31
也可以查询伪文件/sys/fs/selinux/enforce
以获得类似信息。
如果文件返回" 1",则SELinux处于"强制"模式。
如果返回0,则处于许可模式:
# cat /sys/fs/selinux/enforce 1
更改SELinux模式运行时而无需重新启动
我们可以在"允许"和"强制"之间切换SELinux状态,而无需重新启动。
将状态更改为允许状态并非完全被禁用,但是SELinux不会强制执行任何策略,而只会报告违规情况。
要更改运行时SELinux的状态,可以使用
setenforce
。现在," setenforce"不能禁用SELinux,但可以在" Enforcecing(1)"或者" Permissive(0)"模式之间切换
要将活动模式更改为Permissive
,请使用:
# setenforce 0
或者,我们也可以将/sys/fs/selinux/enforce的值更改为0。
# echo 0 > /sys/fs/selinux/enforce
验证当前模式
# getenforce Permissive
要将其切换回Enforcing,请使用:
# setenforce 1
或者,我们也可以将/sys/fs/selinux/enforce的值更改为1.
# echo 1 > /sys/fs/selinux/enforce
验证当前模式
# getenforce Enforcing
使用GRUB2禁用SELinux模式
当我们要在对系统有交互访问权的时间点想要切换到"许可"或者"强制"模式时,使用" setenforce"命令很有意义。
"但是如果我们在系统启动时需要这个怎么办?
"
如果系统由于SELinux访问控制而拒绝正常启动,则我们无法编辑/etc/selinux/config
文件。
我们可以在/etc/sysconfig/grub
中定义以下任一参数,这些参数优先于/etc/selinux/config
设置
禁用SELinux
使用
selinux = 0
这将通知系统完全禁用SELinux,并且具有与在配置文件中设置SELINUX = disabled相同的效果。
设置后,将不咨询其他参数(强制)。
请记住,在禁用SELinux的情况下引导系统意味着要再次启用它,必须完全重新标记文件系统。
启用许可模式
使用
enforcing = 0
这将通知系统以许可模式运行SELinux,并且具有与在配置文件中设置SELINUX = permissive相同的效果。
启用强制模式
使用
enforcing = 1
这将通知系统以强制模式运行SELinux,并且具有与在配置文件中设置SELINUX = enforcing相同的效果。
例如,根据/etc/selinux/config将SELinux设置为Enforcecing。
# egrep ^SELINUX= /etc/selinux/config SELINUX=enforcing
但是我将继续使用GRUB2将SELinux更改为Permissive
。
# grep GRUB_CMDLINE_LINUX /etc/sysconfig/grub GRUB_CMDLINE_LINUX="resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet biosdevname=0 net.ifnames=0 enforcing=0"
我在GRUB_CMDLINE_LINUX的末尾添加了" enforcing = 0"。
接下来重建GRUB2配置文件
# grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... done
重新启动服务器,重新启动后,我看到SELinux处于"许可"模式,即使在/etc/selinux/config中将其标记为" Enforcecing"。
# getenforce Permissive
重要的提示:
如果SELinux已经使用/etc/selinux/config
禁用,那么将不考虑这些GRUB2内核参数。
`如果系统无法启动,则:
重新引导系统,直到出现GRUB2引导屏幕。
使用箭头键导航到必须更改SELinux状态的引导条目。
这通常是默认的引导条目,并且已经被选中。按
E
键编辑引导输入行。
在GRUB2计时器达到零之前执行此操作;否则,系统将继续启动。使用箭头键转到以linux,linux16或者linuxefi开头的行的末尾
在此行的末尾添加`enforcing = 0'。
按" Ctrl + X"启动条目。
禁用SELinux的单一服务
无需将整个系统的SELinux模式更改为"许可",而是可以在系统以"强制"模式运行时将各个域设置为许可模式。
要允许一个域,请运行" semanage permissive -a <domain>"命令,其中" <domain>"是我们要允许的域。
" semanage"由RHEL和CentOS中的" policycoreutils-python-utils" rpm提供
例如,以Linux超级用户身份运行以下命令,以使httpd_t
域(Apache HTTP Server其中运行的域)成为" permissive":
# semanage permissive -a httpd_t
从/var/log/messages
Jan 30 16:24:52 client kernel: SELinux: Converting 2264 SID table entries... Jan 30 16:24:54 client kernel: SELinux: policy capability network_peer_controls=1 Jan 30 16:24:54 client kernel: SELinux: policy capability open_perms=1 Jan 30 16:24:54 client kernel: SELinux: policy capability extended_socket_class=1 Jan 30 16:24:54 client kernel: SELinux: policy capability always_check_network=0 Jan 30 16:24:54 client kernel: SELinux: policy capability cgroup_seclabel=1 Jan 30 16:24:54 client kernel: SELinux: policy capability nnp_nosuid_transition=1 Jan 30 16:24:54 client dbus-daemon[1052]: [system] Reloaded configuration
当一个域被标记为允许时,应用程序的行为就好像未在系统上启用SELinux一样,这使我们更容易找出SELinux是否确实是权限问题的原因。
使用相同的" semanage"命令,我们可以"列出当前定义的允许域"。
# semanage permissive -l Builtin Permissive Types Customized Permissive Types httpd_t
列出自定义允许类型(通过分发未标记为允许的类型)的另一种方法是使用" semodule"命令
# semodule -l | grep permissive_ permissive_httpd_t
要从域中删除许可模式,请将-d参数传递给semanage命令。
# semanage permissive -d httpd_t libsemanage.semanage_direct_remove_key: Removing last permissive_httpd_t module (no other permissive_httpd_t module exists at another priority).
永久禁用SELinux
如果仍然希望禁用SELinux,则需要在/etc/selinux/config中将SELINUX = enforcing修改为SELINUX = disabled。
# cat /etc/selinux/config
禁用SElinux
如果更改了/etc/selinux/config文件,则需要重新引导系统才能使更改生效。
因此,在修改此文件后,请继续并重新启动服务器
重新启动后验证SELinux状态
# getenforce Disabled