SELinux是什么?
SELinux
全称Security Enhanced Linux
(安全性增强Linux
),意在现有的Linux
系统中额外增加一层安全控制层面,主要就是在解决某某应用是否可访问某某文件
的问题。SELinux
通常是和Linux
自带的DAC(目录权限控制)
(也就是平常ls
后看到的rwx
之类的)一起工作。SELinux
实现了MAC(强制访问控制)
,即为系统中每个文件和进程打上标签SELinux上下文标签
,在进程对文件进行访问时,对标签进行检测,查看是否有可以访问。
使用SELinux的好处
- 所有进程和文件均会被
SELinux
。SELinux
策略规则定义了进程与文件的交互方式以及进程之间的交互方式。仅当存在专门允许访问的SELinux策略规则时,才允许访问。 - 提供细粒度的访问控制。
SELinux
访问决策超越了由用户自行决定并基于Linux用户和组ID控制的传统UNIX权限,它基于所有可用信息,例如SELinux用户,角色,类型以及(可选)安全级别。 SELinux
策略是在整个系统范围内由管理人员定义和实施的。- 改进了缓解特权升级攻击的方法。进程在域中运行,因此彼此分开。
SELinux
策略规则定义了进程如何访问文件和其他进程。如果某个进程受到威胁,则攻击者只能访问该进程的正常功能,并且可以访问该进程已配置为有权访问的文件。例如,如果Apache HTTP Server
受感染,除非添加或配置了特定的SELinux
策略规则或允许这种访问,否则攻击者无法使用该过程读取用户主目录中的文件。SELinux
可用于强制执行数据机密性和完整性,并保护进程免受不受信任的输入。
注意:
SELinux
并不是防病毒软件,密码管理器,防火墙和其他安全系统的替代品。SELinux
旨在增强现有的安全解决方案,而不是替代它们。即使在运行SELinux
时,也必须继续遵循良好的安全惯例,例如使软件保持最新,使用难以猜测的密码或防火墙规则。
初步了解SELinux
以下操作以
Centos 7
为例,其他发行版Linux
命令基本一致,只需注意包管理器的安装命令即可
启用SELinux
要使用SELinux
,首先我们需要确保其是可用的,使用如下命令查看
[root@localhost ~]# sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: permissive
Mode from config file: error (Success)
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 31
# 如果没在运行我们需要设置为Permissive模式,然后重启
[root@localhost ~]# setenforce 0
Permissive
为了避免以下的操作出现,命令找不到的情况,我们先安装以下几个软件包:
[root@localhost ~]# yum install -y setools selinux-policy-devel setroubleshoot-server
然后我们需要确保 auditd
and rsyslog
守护进程是运行的。
[root@localhost ~]# systemctl enable auditd.service&&systemctl enable auditd.service
这两个守护进程是负责记录SELinux
在运行过程中文件访问的AVC(Access Vector Cache)
(其实就是被拦截的操作)信息的,拦截的信息一般会被记录在两个文件中。
/var/log/audit/audit.log
,记录格式如下:
type=AVC msg=audit(1223024155.684:49): avc: denied { getattr } for pid=2000 comm="httpd"
path="/var/www/html/file1" dev=dm-0 ino=399185 scontext=unconfined_u:system_r:httpd_t:s0
tcontext=system_u:object_r:samba_share_t:s0 tclass=file
/var/log/message
,记录格式如下:
May 7 18:55:56 localhost setroubleshoot: SELinux is preventing httpd (httpd_t) "getattr" to
/var/www/html/file1 (samba_share_t). For complete SELinux messages. run sealert -l de7e30d6-