博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SELinux详解之第一章——基本介绍
阅读量:3898 次
发布时间:2019-05-23

本文共 10049 字,大约阅读时间需要 33 分钟。

SELinux是什么?

SELinux全称Security Enhanced Linux(安全性增强Linux),意在现有的Linux系统中额外增加一层安全控制层面,主要就是在解决某某应用是否可访问某某文件的问题。SELinux通常是和Linux自带的DAC(目录权限控制)(也就是平常ls后看到的rwx之类的)一起工作。SELinux实现了MAC(强制访问控制),即为系统中每个文件和进程打上标签SELinux上下文标签,在进程对文件进行访问时,对标签进行检测,查看是否有可以访问。

使用SELinux的好处

  • 所有进程和文件均会被SELinuxSELinux策略规则定义了进程与文件的交互方式以及进程之间的交互方式。仅当存在专门允许访问的SELinux策略规则时,才允许访问。
  • 提供细粒度的访问控制。 SELinux访问决策超越了由用户自行决定并基于Linux用户和组ID控制的传统UNIX权限,它基于所有可用信息,例如SELinux用户,角色,类型以及(可选)安全级别。
  • SELinux策略是在整个系统范围内由管理人员定义和实施的。
  • 改进了缓解特权升级攻击的方法。进程在域中运行,因此彼此分开。
  • SELinux策略规则定义了进程如何访问文件和其他进程。如果某个进程受到威胁,则攻击者只能访问该进程的正常功能,并且可以访问该进程已配置为有权访问的文件。例如,如果Apache HTTP Server受感染,除非添加或配置了特定的SELinux策略规则或允许这种访问,否则攻击者无法使用该过程读取用户主目录中的文件。
  • SELinux可用于强制执行数据机密性和完整性,并保护进程免受不受信任的输入。

注意:SELinux并不是防病毒软件,密码管理器,防火墙和其他安全系统的替代品。SELinux旨在增强现有的安全解决方案,而不是替代它们。即使在运行SELinux时,也必须继续遵循良好的安全惯例,例如使软件保持最新,使用难以猜测的密码或防火墙规则。

初步了解SELinux

以下操作以Centos 7为例,其他发行版Linux命令基本一致,只需注意包管理器的安装命令即可

启用SELinux

要使用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的配置详情

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规则.
  • 安全控制类型
    • targeted - 只对指定目标进行保护
    • minimum -自定义的目标保护规则.
    • mls - 多级安全保护规则,使用这个类型需要安装selinux-policy-mls才可使用,这个我会单独出一篇文章来介绍.

我们可以通过setenforce命令来设置运行模式,重启后生效。

# 0-permissive,1-enforcing,如需禁用需要修改配置文件setenforce 0

注意:请勿在不清楚规则的情况下,启用enforcing和MLS运行策略,可能会导致系统无法启动。请勿在生产环境下,进行试验,在进行策略更改之前请务必对系统进行快照备份,以免出现不可恢复的情况。

SELinux上下文标识

到这里呢,我们将逐渐进入正题。如何查看上下文标识,如何修改标识,如何查看配置的规则等等,将是这一节的关注点。

在确保按上一节的操作配置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

这里对其中几个角色进行一下说明:

  1. webadm_r - 只能管理与Apache HTTP Server相关的SELinux类型。
  2. dbadm_r - 只能管理与MariaDB数据库和PostgreSQL数据库管理系统有关的SELinux类型。
  3. logadm_r - 只能管理与syslog和auditlog进程相关的SELinux类型
  4. secadm_r - 只能管理SELinux
  5. auditadm_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)

NFS文件系统挂载

在启用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 -

SELinux信息查询命令

avcstat

该程序的统计信息来源于/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

seinfo

查看关于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

sesearch

在策略中搜索特定规则、搜索策略源文件或二进制文件。

# 查询能访问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/

你可能感兴趣的文章
Datatables基本初始化——jQuery表格插件
查看>>
Servlet监听器——实现在线登录人数统计小例子
查看>>
Oracle笔记——简单查询语句 Oracle入门
查看>>
基于Hibernate和Struts2的用户管理系统小案例
查看>>
打开.class文件的方法
查看>>
基于windows平台Git+GitHub+Hexo搭建个人博客(一)
查看>>
基于windows平台Git+GitHub+Hexo搭建个人博客(二)
查看>>
Windows平台下SVN安装配置及使用
查看>>
python简便的编辑工具:jupyter notebook
查看>>
使用pip安装的时候出现 ModuleNotFoundError: No module named ‘pip‘
查看>>
Selenium自动化测试(八)之上传文件
查看>>
Selenium UI自动化(Java篇)
查看>>
使用Fiddler模拟弱网进行测试
查看>>
使用POI读取Excel测试用例
查看>>
记一次数据推送的异常解决端口解决
查看>>
linux、mysql、nginx、tomcat 性能参数优化
查看>>
Nginx使用Linux内存加速静态文件访问
查看>>
杀掉nginx进程后丢失nginx.pid,如何重新启动nginx
查看>>
nginx另类复杂的架构
查看>>
Nginx流量复制/AB测试/协程
查看>>