共计 2975 个字符,预计需要花费 8 分钟才能阅读完成。
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,并依据须要进行相应的配置。
- 查看 SELinux 状态和模式
[root@workhost ~]# sestatus
SELinux status: disabled
# 或
[root@workhost ~]# getenforce
Disabled
- 永恒开启 SELinux
cat > /etc/selinux/config << EOF
SELINUX=enforcing
SELINUXTYPE=targeted
EOF
重启零碎,使更改失效。
留神:SELinux 将在系统启动时主动启用并应用指定的模式。如果之前禁用了 SELinux,当初启用它可能会影响零碎的行为。
重启后再次查看状态:
[root@workhost ~]# sestatus
SELinux status: enabled
Current mode: enforcing
- 配置 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 服务绑定到这些端口。
- 配置 SELinux 以容许 MySQL 服务拜访。因为 MySQL 服务须要读取和写入数据文件,因而须要批改 SELinux 策略以容许它执行此操作。能够应用以下命令为 MySQL 配置 SELinux:
[root@workhost ~]# semanage port -a -t mysqld_port_t -p tcp 3306
将端口 3306 增加到 SELinux 的 mysqld_port_t 类型中,以容许 MySQL 服务拜访该端口。
- 配置 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 数据库。
- 测试 SELinux 配置,确保所有服务都能够失常拜访并运行
[root@workhost ~]# systemctl restart nginx php-fpm
将重新启动 Nginx 和 PHP-FPM 服务,并查看是否呈现任何谬误。
还能够应用以下命令测试 MySQL 的配置:
[root@workhost ~]# mysql -h 192.168.11.10 -u cmdbuser -p
此命令将连贯到 MySQL 数据库并验证是否能够失常读取和写入数据。
- 对于 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。
- Enforcing 模式:是默认模式,也是最平安的模式,它强制执行 SELinux 策略,只容许拜访和操作通过受权的资源,对未受权的拜访进行回绝和记录。如果一个过程或用户尝试拜访或操作未受权的资源,它将被回绝并记录日志。
- Permissive 模式:与 Enforcing 模式相似,然而它不会回绝未受权的拜访和操作,而是记录日志。这个模式能够用来测试策略,找到须要批改的中央。
- Disabled 模式:禁用 SELinux,零碎将不会利用 SELinux 的策略,所有的拜访和操作将以传统的 Linux 权限管制形式进行。
总之,SELinux 的工作机制是通过标签和策略来实现强制访问控制的。它的 Enforcing 模式能够帮忙零碎爱护资源,缩小潜在的安全漏洞和攻打。
本文转载于 WX 公众号:不背锅运维(喜爱的盆友关注咱们):https://mp.weixin.qq.com/s/ceHqfTdJ1NbAAFQjJkiyEQ