Linux SeLinux简单知识点

本文介绍Linux SeLinux相关的知识

很多人在安装有些软件,修改某些配置的时候会受到Selinux安全策略的限制,这时部分人喜欢人云亦云,浮于表面的看下技术博客得到片面的解决方案:关闭/永久禁用Selinux。其实这是不安全的做法,至少不是一个有探究精神的程序员的做法。当然我也是一字半解,本着尽量安全的原则来介绍下Selinx的使用。

具体环境如下表:

环境 版本
RHEL/CentOS 7.x

安全增强型Linux(Security-Enhanced Linux)简称SELinux,它是一个Linux内核模块,也是Linux的一个安全子系统。SELinux 主要由美国国家安全局开发。Linux2.6及以上版本的Linux内核都已经集成了SELinux模块。SELinux的结构及配置非常复杂,而且有大量概念性的东西,要学精难度较大。很多Linux系统管理员嫌麻烦都把SELinux关闭了。如果可以熟练掌握SELinux并正确运用,那么Linux的安全性会有极大的保证。

SELinux出现之前,Linux上的安全模型叫DAC,全称是Discretionary Access Control(自主访问控制)。DAC的核心思想很简单,就是:进程理论上所拥有的权限与执行它的用户的权限相同。比如,以root用户启动Browser,那么Browser就有root用户的权限,在Linux系统上能干任何事情。

DAC太过宽松,Selinux在DAC之外,设计了一个新的安全模型,叫MAC(Mandatory Access Control),翻译为强制访问控制。MAC的处世哲学非常简单:即任何进程想在SELinux系统中干任何事情,都必须先在安全策略配置文件中赋予权限。凡是没有出现在安全策略配置文件中的权限,进程就没有该权限。强制访问控制系统的用途在于增强系统抵御0-Day攻击(利用尚未公开的漏洞实现的攻击行为)的能力。所以它不是网络防火墙或ACL的替代品,在用途上也不重复。

举例来说,系统上的Apache被发现存在一个漏洞,使得某远程用户可以访问系统上的敏感文件(比如/etc/passwd来获得系统已存在用户),而修复该安全漏洞的 Apache 更新补丁尚未释出。此时SELinux可以起到弥补该漏洞的缓和方案。因为 /etc/passwd 不具有Apache的访问标签,所以Apache对于/etc/passwd 的访问会被 SELinux 阻止。

相比其他强制性访问控制系统,SELinux 有如下优势:

  • 控制策略是可查询而非程序不可见的。
  • 可以热更改策略而无需重启或者停止服务。
  • 可以从进程初始化、继承和程序执行三个方面通过策略进行控制。
  • 控制范围覆盖文件系统、目录、文件、文件启动描述符、端口、消息接口和网络接口。

代码演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[thinktik@thinkcent ~]$ getenforce
Enforcing
[thinktik@thinkcent ~]$ su
Password:
[root@thinkcent thinktik]# setenforce Enforcing
[root@thinkcent thinktik]# getenforce
Enforcing
[root@thinkcent thinktik]# setenforce Permissive
[root@thinkcent thinktik]# getenforce
Permissive
[root@thinkcent thinktik]# setenforce 1
[root@thinkcent thinktik]# getenforce
Enforcing
[root@thinkcent thinktik]# setenforce 0
[root@thinkcent thinktik]# getenforce
Permissive

getenforce可能返回结果有三种:EnforcingPermissiveDisabledDisabled代表SELinux被禁用,Permissive代表仅记录安全警告但不阻止可疑行为,Enforcing 代表记录警告且阻止可疑行为。

setenforce [ Enforcing | Permissive | 1 | 0 ]命令可以立刻改变SELinux运行状态,在Enforcing和Permissive之间切换,结果保持至关机。一个典型的用途是看看到底是不是SELinux导致某个服务或者程序无法运行。若是在setenforce 0之后服务或者程序依然无法运行,那么就可以肯定不是 SELinux 导致的。

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@thinkcent thinktik]# cat  /etc/sysconfig/selinux

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted

配置文件/etc/sysconfig/selinux还包含了SELinux运行策略的信息,通过改变变量SELINUXTYPE的值实现,该值有两种可能:targeted代表仅针对预制的几种网络服务和访问请求使用SELinux保护,strict代表所有网络服务和访问请求都要经过SELinux。

RHEL/CentOS 和Fedora默认设置为targeted,包含了对几乎所有常见网络服务的 SELinux 策略配置,已经默认安装并且可以无需修改直接使用。

1
2
3
4
5
6
7
8
9
10
11
12
[root@thinkcent thinktik]# getsebool -a
abrt_anon_write --> off
abrt_handle_event --> off
abrt_upload_watch_anon_write --> on
antivirus_can_scan_system --> off
antivirus_use_jit --> off
auditadm_exec_content --> on
authlogin_nsswitch_use_ldap --> off
authlogin_radius --> off
authlogin_yubikey --> off
awstats_purge_apache_log_files --> off
boinc_execmem --> on

获取本机selinux策略值,也称为bool值。

举例

MySQL/MariaDB在修改监听端口时可能会受到Selinux的保护,那么具体的操作如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 防火墙开放MariaDB监听端口123
[root@thinkcent my_name]# firewall-cmd --zone=public --add-port=123/tcp --permanent
success
# 防火墙重启
[root@thinkcent my_name]# firewall-cmd --reload
success
# Selinux开放MariaDB监听端口123 注意这步,很多人的SElinx开启状态下不放行MariaDB监听这个端口导致配置失败
[root@thinkcent my_name]# semanage port -a -t mysqld_port_t -p tcp 123
# 修改配置文件 在[mysqld]下一行加入 port=123
[root@thinkcent my_name]# vim /etc/my.cnf.d/server.cnf
# 重启MariaDB
[root@thinkcent my_name]# systemctl restart mariadb


登陆MariaDB后查看监听端口看到端口由3306变成123

MariaDB [(none)]> show global variables like 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port | 123 |
+---------------+-------+
1 row in set (0.002 sec)

这样的例子很多,CentOS7在SSH端口修改,MongoDB安装等基本都会遇到,我还是不建议大家直接关闭Selinux的,遇到这些问题去解决问题比消极逃避好很多。

Selinux小结

https://blog.csdn.net/wzsy/article/details/50481767

写的不错?请我喝杯可乐!!!
0%