如何禁用SELinux(有无重启)

时间:2020-01-09 10:38:12  来源:igfitidea点击:

在本教程中,我将向我们介绍在Linux环境中正确禁用SELinux的步骤,尽管不建议这样做,但我们可以选择将活动模式更改为Permissive。

什么是SELinux?

  • 在常规Linux系统上活动的默认访问控制基于D必需A访问Control(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