本文共 10049 字,大约阅读时间需要 33 分钟。
SELinux
全称Security Enhanced Linux
(安全性增强Linux
),意在现有的Linux
系统中额外增加一层安全控制层面,主要就是在解决某某应用是否可访问某某文件
的问题。SELinux
通常是和Linux
自带的DAC(目录权限控制)
(也就是平常ls
后看到的rwx
之类的)一起工作。SELinux
实现了MAC(强制访问控制)
,即为系统中每个文件和进程打上标签SELinux上下文标签
,在进程对文件进行访问时,对标签进行检测,查看是否有可以访问。
SELinux
。 SELinux
策略规则定义了进程与文件的交互方式以及进程之间的交互方式。仅当存在专门允许访问的SELinux策略规则时,才允许访问。SELinux
访问决策超越了由用户自行决定并基于Linux用户和组ID控制的传统UNIX权限,它基于所有可用信息,例如SELinux用户,角色,类型以及(可选)安全级别。SELinux
策略是在整个系统范围内由管理人员定义和实施的。SELinux
策略规则定义了进程如何访问文件和其他进程。如果某个进程受到威胁,则攻击者只能访问该进程的正常功能,并且可以访问该进程已配置为有权访问的文件。例如,如果Apache HTTP Server
受感染,除非添加或配置了特定的SELinux
策略规则或允许这种访问,否则攻击者无法使用该过程读取用户主目录中的文件。SELinux
可用于强制执行数据机密性和完整性,并保护进程免受不受信任的输入。注意:
SELinux
并不是防病毒软件,密码管理器,防火墙和其他安全系统的替代品。SELinux
旨在增强现有的安全解决方案,而不是替代它们。即使在运行SELinux
时,也必须继续遵循良好的安全惯例,例如使软件保持最新,使用难以猜测的密码或防火墙规则。
以下操作以
Centos 7
为例,其他发行版Linux
命令基本一致,只需注意包管理器的安装命令即可
要使用SELinux
,首先我们需要确保其是可用的,使用如下命令查看
[root@localhost ~]# sestatusSELinux status: enabledSELinuxfs mount: /sys/fs/selinuxSELinux root directory: /etc/selinuxLoaded policy name: targetedCurrent mode: permissiveMode from config file: error (Success)Policy MLS status: enabledPolicy deny_unknown status: allowedMax kernel policy version: 31# 如果没在运行我们需要设置为Permissive模式,然后重启[root@localhost ~]# setenforce 0Permissive
为了避免以下的操作出现,命令找不到的情况,我们先安装以下几个软件包:
[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:s0tcontext=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-5488-466d-a606-92c9f40d316d
关于这个访问拦截控制,是先进行DAC
拦截,再进行MAC
拦截的。也就是说进程访问一个文件时,会先判断是否具有读写权限,然后再判断是否SELinux
上下文中的域是否符合访问规则。
SELinux
的配置文件为/etc/selinux/config
,其内容如下:
# 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=disable# SELINUXTYPE= can take one of three values:# targeted - Targeted processes are protected,# minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection.SELINUXTYPE=targeted
配置文件很简单就只有两个配置项:
enforcing
- 启用SELinux
规则,对不符合访问策略的行为进行阻止permissive
- 启用SELinux
规则但是对被拦截的操作只进行记录不阻止进程的访问.disabled
- 不启用SELinux
规则.selinux-policy-mls
才可使用,这个我会单独出一篇文章来介绍.我们可以通过setenforce
命令来设置运行模式,重启后生效。
# 0-permissive,1-enforcing,如需禁用需要修改配置文件setenforce 0
注意:请勿在不清楚规则的情况下,启用
enforcing
和MLS运行策略,可能会导致系统无法启动。请勿在生产环境下,进行试验,在进行策略更改之前请务必对系统进行快照备份,以免出现不可恢复的情况。
到这里呢,我们将逐渐进入正题。如何查看上下文标识,如何修改标识,如何查看配置的规则等等,将是这一节的关注点。
在确保按上一节的操作配置SELinux
之后,我们将来看看如何查看文件或进程的上下文标识:
# 我们需要先切换至root用户再进行如下操作:# 查看文件的上下文标识[root@localhost /]# ls -Zlrwxrwxrwx. root root system_u:object_r:bin_t:s0 bin -> usr/bindr-xr-xr-x. root root system_u:object_r:boot_t:s0 bootdrwxr-xr-x. root root system_u:object_r:device_t:s0 devdrwxr-xr-x. sssd pulse-access system_u:object_r:root_t:s0 elkdrwxr-xr-x. root root system_u:object_r:etc_t:s0 etcdrwxr-xr-x. root root system_u:object_r:home_root_t:s0 homelrwxrwxrwx. root root......# 查看进行的上下文标识[root@localhost /]# ps -ZLABEL PID TTY TIME CMDunconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 11360 pts/0 00:00:00 shellunconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 11934 pts/0 00:00:00 ps
我们以system_u:object_r:bin_t:s0
为例,通常一个上下文标识的由如下几部分组成:
user:role:type:level
user
- 这是一个SELinux
的内部用户对象,每个Linux用户都会映射到SELinux
的内部用户对象,这可以使Linux用户可以继承对SELinux用户的限制,用如下命令即可查看映射关系:[root@localhost /]# semanage login -l登录名 SELinux 用户 MLS/MCS 范围 服务__default__ unconfined_u s0-s0:c0.c1023 *root unconfined_u s0-s0:c0.c1023 *system_u system_u s0-s0:c0.c1023 *# 查看当前用户的上下文标识[root@localhost /]# id -Zunconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
默认的新建用户在未使用useradd -Z
参数指定SELinux 用户
时,默认映射到__default__新用户名
上,最终也是映射到unconfined_u
role
- 这是基于角色的访问控制(RBAC)
安全模型。该角色是RBAC的属性。 SELinux用户被授权使用角色,角色被授权用于域。该角色充当域和SELinux用户之间的中介。利用role绑定到user
上可以控制user的访问权限。最终,它控制可以访问的对象类型。# SELinux内置了14个角色[root@localhost /]# seinfo -rRoles: 14 auditadm_r dbadm_r guest_r staff_r user_r logadm_r object_r secadm_r sysadm_r system_r webadm_r xguest_r nx_server_r unconfined_r
这里对其中几个角色进行一下说明:
webadm_r
- 只能管理与Apache HTTP Server相关的SELinux类型。dbadm_r
- 只能管理与MariaDB数据库和PostgreSQL数据库管理系统有关的SELinux类型。logadm_r
- 只能管理与syslog和auditlog进程相关的SELinux类型secadm_r
- 只能管理SELinuxauditadm_r
- 只能管理与audit
子系统相关的流程。举个例子,如果一个进程运行时被绑定的角色为webadm_r
,那么这个进程在运行时就只能访问域为Apache HTTP Server相关的SELinux相关的文件,例如:
[root@localhost /]# ls -dZ /var/www/htmldrwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
这个文件夹的域为httpd_sys_content_t
,那么webadm_r
是有权限访问的,所以访问该服务程序时是可以正常返回界面的,如果使用如下命令临时修改了文件的域之后:
[root@localhost /]# chcon -R -t samba_share_t /var/www/html# 可以使用如下命令恢复默认的域[root@localhost /]# restorecon -R -v /var/www/html
再次访问同一样的网页就会被拒绝。
type
- 这个在官方文档中被称为域,是SELinux
中最重要的一个概念,不同域的进程和文件。如果没有指定的规则指明是可以访问的,那么该进程对该文件的访问将被拒绝。level
- 这个属性只有在MLS/MCS
的运行策略中才会用到这里我们可以先不用管首先,需要注意的是SELinux
默认采用的是上下文继承的方式来生成标识,即新建的文件的标识一般与父目录的保持一致。
[root@localhost /]# chcon -R -t (typename) (filepath)
其中-R
是针对与目录使用的,表示递归修改
# -R是针对与目录使用的,表示递归修改,-v 表示显示恢复的记录[root@localhost /]# restorecon -R -v (filepath)
# filepath可以使用正则表达式,-a表示新增一条记录#例如semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"[root@localhost /]# semanage fcontext -a -t (typename) (filepath)# 新增的记录可以使用如下命令查看[root@localhost /]# semanage fcontext -C -l
新增的记录被存储在/etc/selinux/targeted/contexts/files/file_contexts.local
中
# 先删除新添记录[root@localhost /]# semanage fcontext -d (filepath)# 恢复原有标识# -R是针对与目录使用的,表示递归修改,-v 表示显示恢复的记录[root@localhost /]# restorecon -R -v (filepath)
在启用SELinux
之后,如果不为NFS文件系统指定相应的上下文系统可能会出现被拒绝的情况。下面我们就来看下如何为新挂载的系统配置上下文标识:
# 覆盖现有文件系统扩展属性,或为不支持扩展属性的文件系统指定不同的默认上下文。[root@localhost /]# mount server:/export /local/mount/point -o context="system_u:object_r:httpd_sys_content_t:s0"
当使用上下文选项挂载文件系统时,禁止用户和进程更改上下文。例如,在安装了上下文选项的文件系统上运行chcon命令会导致“操作不受支持”错误
#配置默认上下文,与上述配置不同的是,这个只是用作为未设置上下文的文件配置默认标识,上面的选项是用作覆盖的[root@localhost /]# mount /dev/sda2 /test/ -o defcontext="system_u:object_r:samba_share_t:s0"
从同一网络位置挂载多个卷,使用不同上下文标识:
# 需要指定nosharecache参数,否则第二的卷将无法挂载[root@localhost /]# mount server:/export/web /local/web -o nosharecache,context="system_u:object_r:httpd_sys_content_t:s0"[root@localhost /]# mount server:/export/database /local/database -o nosharecache,context="system_u:object_r:mysqld_db_t:s0"
如果想要开机自动挂载的话,只需在/etc/fstab
中配置即可,示例如下:
server:/export /local/mount/ nfs context="system_u:object_r:httpd_sys_content_t:s0" 0 0
被复制的新生成的文件,将按照目标文件夹的上下文标识生成。
移动文件,将不会改变文件现有的上下文标识,所以尽量使用文件复制,以便SELinux
重新标识文件,避免出现某些不可访问的情况出现。
使用如下命令可以检查目录下的文件,是否与默认上下文的标识是否一致,通常是某些文件访问异常时,可以发现问题。
[root@localhost /]# matchpathcon -V /var/www/html/*/var/www/html/file1 has context unconfined_u:object_r:samba_share_t:s0, should besystem_u:object_r:httpd_sys_content_t:s0/var/www/html/file2 verified./var/www/html/file3 verified.
发现不吻合的上下文标识后,可以使用restorecon
进行恢复
下面以tar
为例,默认程序是不会保存上下文信息的,除非加上--selinux
选项,如果需要解压之后,保持与当前上下文一致需要使用如下语句:
[root@localhost /]# tar --selinux -cf test.tar file{1,2,3}#恢复至当前默认上下文[root@localhost /]# tar -xvf archive.tar | restorecon -f -
该程序的统计信息来源于/sys/fs/selinux/avc/cache_stats
,使用如下:
# 每两秒查询一次AVC信息[root@localhost /]# avcstat 2lookups hits misses allocs reclaims frees7387467 7360550 26917 27232 26272 267331510 1508 2 2 0 04196 4196 0 0 0 0
查看关于SELinux
的概况:
[root@localhost /]# seinfoStatistics for policy file: /sys/fs/selinux/policyPolicy Version & Type: v.31 (binary, mls) Classes: 130 Permissions: 272 Sensitivities: 1 Categories: 1024 Types: 4796 Attributes: 255 Users: 8 Roles: 14 Booleans: 318 Cond. Expr.: 367 Allow: 108418 Neverallow: 0 Auditallow: 158 Dontaudit: 10073 Type_trans: 18172 Type_change: 74 Type_member: 35 Role allow: 37 Role_trans: 415 Range_trans: 5899 Constraints: 143 Validatetrans: 0 Initial SIDs: 27 Fs_use: 32 Genfscon: 103 Portcon: 614 Netifcon: 0 Nodecon: 0 Permissives: 0 Polcap: 5[root@localhost /]# seinfo -uUsers: 8 sysadm_u system_u xguest_u root guest_u staff_u user_u unconfined_u
在策略中搜索特定规则、搜索策略源文件或二进制文件。
# 查询能访问httpd_sys_content_t的角色 [root@localhost /]# sesearch --role_allow -t httpd_sys_content_tFound 37 role allow rules: allow system_r xguest_r; allow webadm_r system_r; allow system_r webadm_r; allow system_r user_r; allow system_r unconfined_r; allow system_r unconfined_r; allow system_r unconfined_r; allow unconfined_r system_r; allow sysadm_r user_r; allow sysadm_r staff_r; ....
更多工具可以看:
转载地址:http://vqfen.baihongyu.com/