是不是都把SELinux给忘了?

发布时间 2023-04-24 09:49:12作者: 不背锅运维

SELinux是什么鬼

SELinux(Security-Enhanced Linux)是一个安全模块,内置于 Linux 内核中,为 Linux 系统提供了一个额外的安全层。它通过实施强制访问控制(MAC)来限制进程的访问权限,可以帮助防止恶意软件和攻击者对系统的攻击。与传统的基于用户/组的访问控制(DAC)不同,SELinux 使用安全策略(如标签和规则)来管理进程、文件、网络端口等资源的访问权限。这些策略可以根据特定的应用程序或系统环境进行自定义配置,使系统管理员能够更精细地控制系统的安全性和保护系统免受潜在的安全威胁。

大部分都关闭了selinux

据我所了解,虽然SELinux提供了额外的安全保障,但在生产环境中,大部分工程师都是选择关闭SELinux,包括我也是。这是因为在默认情况下,SELinux所提供的安全策略可能会对某些应用程序或系统服务的正常运行产生限制或问题,这可能需要进行一些配置调整。由于SELinux本身的复杂性和学习成本,这些调整可能会需要花费较长的时间来完成,从而影响生产环境的部署和维护效率。

虽然关闭SElinux后使在运维工作中更加方便,但始终都是要在“方便”和“麻烦”之间做出选择,安全了就自然会变得麻烦,但方便了也不一定是不安全,但也不一定是安全。如果是处于DMZ区域对外提供服务的linux操作系统关闭SELinux是有一定风险的,如果系统中存在潜在的安全漏洞或攻击,关闭 SELinux 可能会降低系统的安全性。

实战场景

大部分人选择关闭SElinux,从而导致很多人对SElinux的配置方法都已经遗忘了吧?本篇对SElinux的配置做个分享。直接通过一个可能在实际运维工作中用得上的小场景案例来说明整个配置过程,勾起一下你那惨痛的背锅经历。

场景:假设有一台Web服务器,需要运行Nginx和PHP-FPM来提供Web服务,同时需要访问MySQL数据库。为了加强服务器的安全性,需要启用SELinux,并根据需要进行相应的配置。

  1. 查看SELinux状态和模式
[root@workhost ~]# sestatus 
SELinux status:                 disabled
# 或
[root@workhost ~]# getenforce 
Disabled
  1. 永久开启SELinux
cat > /etc/selinux/config << EOF
SELINUX=enforcing
SELINUXTYPE=targeted
EOF

重启系统,使更改生效。

注意:SELinux将在系统启动时自动启用并使用指定的模式。如果之前禁用了SELinux,现在启用它可能会影响系统的行为。

重启后再次查看状态:

[root@workhost ~]# sestatus 
SELinux status:                 enabled
Current mode:                   enforcing
  1. 配置SELinux以允许Nginx和PHP-FPM服务提供Web服务。由于Nginx和PHP-FPM需要绑定到网络端口,需要修改SELinux策略以允许它们执行此操作,为Nginx和PHP-FPM配置SELinux:
[root@workhost ~]# semanage port -a -t http_port_t -p tcp 80
[root@workhost ~]# semanage port -a -t http_port_t -p tcp 443

将端口80和443添加到SELinux的http_port_t类型中,以允许Nginx和PHP-FPM服务绑定到这些端口。

  1. 配置SELinux以允许MySQL服务访问。由于MySQL服务需要读取和写入数据文件,因此需要修改SELinux策略以允许它执行此操作。可以使用以下命令为MySQL配置SELinux:
[root@workhost ~]# semanage port -a -t mysqld_port_t -p tcp 3306

将端口3306添加到SELinux的mysqld_port_t类型中,以允许MySQL服务访问该端口。

  1. 配置SELinux以允许Nginx和PHP-FPM服务访问MySQL数据库,修改SELinux策略以允许它们执行此操作:
[root@workhost ~]# setsebool -P httpd_can_network_connect_db 1

将SELinux的httpd_can_network_connect_db选项设置为1,以允许Nginx和PHP-FPM服务连接到MySQL数据库。

  1. 测试SELinux配置,确保所有服务都可以正常访问并运行
[root@workhost ~]# systemctl restart nginx php-fpm

将重新启动Nginx和PHP-FPM服务,并检查是否出现任何错误。

还可以使用以下命令测试MySQL的配置:

[root@workhost ~]# mysql -h 192.168.11.10 -u cmdbuser -p

此命令将连接到MySQL数据库并验证是否可以正常读取和写入数据。

  1. 关于php-fpm端口

注意了,默认情况下,PHP-FPM并不使用网络端口来提供服务,而是通过UNIX套接字(Unix socket)来与Nginx进行通信。我的Nginx和PHP-FPM都在同一台服务器上,则不需要为PHP-FPM配置SELinux端口。如果PHP-FPM需要与其他服务器进行通信,例如通过网络连接到一个远程的数据库服务器,那么就需要为PHP-FPM配置SELinux端口以允许它连接到其他服务器的网络端口。在这种情况下,可以使用semanage命令为PHP-FPM配置SELinux端口,就像刚才为MySQL服务做的那样。

最后的总结

SELinux的工作机制基于标签(Label)和策略(Policy)。每个进程、文件、目录、套接字等系统资源都被赋予一个唯一的标签,这些标签被用来指示该资源的安全级别。策略则定义了哪些进程或用户可以访问或操作哪些资源,并规定了对这些资源的访问权限。

SELinux有三种模式:Enforcing、Permissive和Disabled。

  1. Enforcing模式:是默认模式,也是最安全的模式,它强制执行SELinux策略,只允许访问和操作经过授权的资源,对未授权的访问进行拒绝和记录。如果一个进程或用户尝试访问或操作未授权的资源,它将被拒绝并记录日志。
  2. Permissive模式:与Enforcing模式类似,但是它不会拒绝未授权的访问和操作,而是记录日志。这个模式可以用来测试策略,找到需要修改的地方。
  3. Disabled模式:禁用SELinux,系统将不会应用SELinux的策略,所有的访问和操作将以传统的Linux权限控制方式进行。

总之,SELinux的工作机制是通过标签和策略来实现强制访问控制的。它的Enforcing模式可以帮助系统保护资源,减少潜在的安全漏洞和攻击。

本文转载于WX公众号:不背锅运维(喜欢的盆友关注我们):https://mp.weixin.qq.com/s/ceHqfTdJ1NbAAFQjJkiyEQ