SELinux(Secure Enhanced Linux)安全增强Linux是美国国家安全局(NSA)为了计算机基础设施的安全而开发的一种全新的Linux安全策略机制。SELinux可以让系统管理员更灵活地定义安全策略。
目录
一、SELinux II简介。SELinux 2.1的基本概念。工作类型2.2安全环境介绍3。战略四。SELinux模式五.示例六。SELinux日志管理
一、SELinux简介
SELinux是一种内核级的安全机制。SELinux从Linux2.6内核开始就已经集成到内核中了。因为SELinux是内核级的,所以我们对其配置文件的所有修改都需要重启操作系统才能生效。
现在主流的Linux版本都集成了SELinux机制,CentOS/RHEL会默认开启SELinux机制。
通过进程读取和更改系统资源。为了保证系统资源的安全性,传统的Linux使用用户和文件权限的概念来限制对资源的访问,通过比较进程的发起用户和文件权限来保证系统资源的安全性。这是一种自由访问控制方法(DAC);但是随着系统资源安全需求的提高,出现了Linux下的安全增强机制(SELinux),在权限之外对进程和文件增加了更多的限制来增强访问条件。这种方法是强制访问控制(MAC)。两种方式最直观的对比就是,在传统DAC下,root可以访问任何文件,而在MAC下,即使root也只能访问设置允许的文件。
工作原理如下:
二、SELinux基本概念
我们知道,操作系统的安全机制实际上限制了两件事:进程和系统资源(文件、网络套接字、系统调用等。).
在之前的知识中,Linux操作系统通过用户和组的概念来限制我们的系统资源。我们知道每个流程都需要一个用户来执行。
在SELinux中,为这两件事定义了两个基本概念:域(domin)和上下文。
2.1、工作类型
SELinux下有不同的规则。SELinux根据不同的工作类型(on|off布尔值1|0)打开或关闭这些规则,然后通过打开或关闭规则来具体限制不同的进程读取文件。
getse tool-a或sestatus -b #检查当前工作类型下的每个规则是否打开。
setse tool-P rule name[0 | 1]#修改当前工作类型下指定规则的打开或关闭,-P表示修改文件使其永久化。
域用于限制系统,而上下文用于限制系统资源。
2.2、security context介绍
安全上下文存在于进程和文件中。上下文与进程一起存储在内存中,文件的上下文存储在其对应的inode中。因此,当一个进程访问一个文件时,它必须首先读取inode,然后判断它是否可以访问该文件。
Ls -Z #显示了文件的安全上下文。
Ps -eZ #显示了所有进程的安全上下文
我们可以通过命令ps -Z查看当前进程的域信息,也就是进程的SELinux信息:
[root @罗晓~]# ps -Z
标签PID TTY时间CMD
unconlined _ u:unconlined _ r:unconlined _ t:s0-s0:c0 . c 1023 2503 pts/0 00:00:00 su
un confined _ u:un confined _ r:un confined _ t:s0-s0:c0 . c 1023 2511 pts/0 00:00:00 bash
unconlined _ u:unconlined _ r:unconlined _ t:s0-s0:c0 . c 1023 3503 pts/0 00:00:00 PS
使用ls -Z命令,我们可以查看文件上下文信息,即文件的SELinux信息:
[root @罗晓~]# ls -Z
-rw。root root system _ u:object _ r:admin _ home _ t:s0 anaconda-ks . CFG
drwxr-xr-x . root root root unconlined _ u:object _ r:admin _ home _ t:s0 Desktop
-rw-r-r-root root system _ u:object _ r:admin _ home _ t:s0 install . log
-rw-r - r -。root root system _ u:object _ r:admin _ home _ t:s0 install . log . syslog
我们稍后再讨论这些字段的含义。
三、策略
在SELinux中,我们通过定义策略来控制哪些域可以访问哪些上下文。
在SELinux中,预置了多种策略模式,我们通常不需要自己定义策略,除非需要保护一些服务或程序。
在CentOS/RHEL,默认使用目标策略,那么目标策略是什么呢?
目标策略定义SELinux只限制目标进程,非目标进程不会被SELinux限制。通常我们的网络应用都是目标进程,比如httpd,mysqld,dhcpd等等。
我们CentOS的selinux配置文件是存储在/etc/sysconfig/目录中的SELinux文件。我们可以检查内容:
[root @罗晓~]# cat /etc/sysconfig/selinux
#该文件控制系统上SELinux的状态。
# SELINUX=可以取这三个值之一:
# enforcing -强制执行SELinux安全策略。
# permissive - SELinux打印警告而不是强制。
# disabled -没有加载SELinux策略。
SELINUX=强制执行
# SELINUXTYPE=可以取这两个值之一:
#目标-目标流程受到保护,
# mls -多级安全保护。
SELINUXTYPE=targeted //我们CentOS使用的策略就是目标策略。
四、SELinux模式
SELinux有三种工作模式:强制、许可和禁用。
强制模式:任何违反策略的行为都将被禁止,并记录为内核信息。
许可权限模式:违反策略的行为不会被禁止,但会给出警告信息。
禁用模式:禁用SELinux和系统没有SELinux是一样的。通常在不太了解SELinux的情况下,我们会将模式设置为禁用,这样在访问一些网络应用时就不会出现问题。
还说SELinux的主配置文件是/etc/sysconfig/selinux。
[root @罗晓~]# cat /etc/sysconfig/selinux
#该文件控制系统上SELinux的状态。
# SELINUX=可以取这三个值之一:
# enforcing -强制执行SELinux安全策略。
# permissive - SELinux打印警告而不是强制。
# disabled -没有加载SELinux策略。
SELinux=enforcement//我们看到SELinux默认的工作模式是enforcement。
# SELINUXTYPE=可以取这两个值之一:
#目标-目标流程受到保护,
# mls -多级安全保护。
SELINUXTYPE=有针对性
使用该命令修改工作模式只在目前有效,如果要在禁用和其他两种模式之间切换,必须修改配置文件参数并重启。配置文件是/etc/selinux/config,也可以通过/etc/sysconfig/selinux文件进行修改,其实就是/etc/selinux/config的一个软链接文件。
SELinux的默认工作模式是enforcing,我们可以将其更改为permissive或disabled。
如果我们想检查SELinux的当前工作状态,我们可以使用getenforce命令来检查:
[root @罗晓~]# getenforce
执行
目前的工作模式是强制执行。如果要设置SELinux当前的工作状态,可以使用setenforce [0|1]命令来修改。setenforce 0表示设置为许可,1表示强制。
【注意:】通过setenforce设置SELinux只是一个临时的修改,系统重启后就会失效,所以如果想永久修改,就修改SELinux的主配置文件。
[root @罗晓~]# setenforce 0
[root @罗晓~]# getenforce
自由的
[root @罗晓~]# setenforce 1
[root @罗晓~]# getenforce
执行
我们可以通过命令ls -Z查看我们文件的上下文信息,也就是SELinux信息,
[root @罗晓~]# ls -Z
-rw。root root system _ u:object _ r:admin _ home _ t:s0 anaconda-ks . CFG
drwxr-xr-x . root root root unconlined _ u:object _ r:admin _ home _ t:s0 Desktop
-rw-r-r-root root system _ u:object _ r:admin _ home _ t:s0 install . log
-rw-r - r -。root root system _ u:object _ r:admin _ home _ t:s0 install . log . syslog
我们发现system _ u:object _ r:admin _ home _ t:s0比传统的ls命令更多。现在我们来分析一下这个说法的含义。
系统_u:对象_r:管理_主页_t:s0
这个语句分为四段:第一段system_u代表用户,第二段object_r代表角色,第三段是SELinux中最重要的信息,admin_home代表类型,最后一段s0是MLS和MCS相关的东西,暂时不需要管。
system_u:指SElinux用户,root表示root账户身份,user_u表示没有权限的普通用户,system_u表示系统进程。用户可以确认他们的身份类型,这通常与角色一起使用。身份匹配不同的角色,有不同的权限。虽然您可以使用su命令切换用户,但是SElinux的用户没有变化。当帐户切换时,用户的身份保持不变,并且用户身份在目标策略环境中没有实质性作用。
object _ r: object _ r一般是文件目录的角色,system_r一般是进程的角色,user的角色一般是目标策略环境下的system_r。用户的角色类似于用户组的概念。不同的角色有不同的身份权限。一个用户可以有多个角色,但同一时间只能使用一个角色。在有针对性的政策环境下,该角色没有实际效果。在目标策略环境中,所有进程文件的角色都是system_r角色。
admin_home:文件和进程都有一个类型,SElinux根据类型的相关组合限制访问权限。
五、实例
让我们通过一个例子来看看上下文的价值和SELinux的访问控制。
比如我设置了一个Web服务器,我们知道www服务器默认的网页存储位置在/var/www/html的目录下。如果我们在这里创建一个新的index.html测试页面,启动我们的www服务器并刷新它,我们可以看到它的内容。这时,如果我们在我们的/home目录下建立一个index.html页面,然后把它移到/var/www/html的目录下,刷新页面,还可以吗?
首先,我们启动httpd服务:
[root @罗晓~]#服务httpd重启
正在停止httpd: [好]
为罗晓启动httpd:httpd:apr _ sockaddr _ info _ get()失败
httpd:无法可靠地确定服务器的完全限定域名,使用127.0.0.1作为ServerName
[好的]
然后打开浏览器,输入我们的127.0.0.1即可访问。此时您看到的界面是Apache的测试界面:
因为我们目前在/var/www/html下没有任何页面:
[root @罗晓首页]# ll /var/www/html/
总计0
接下来,我们在/home目录下建立一个index.html的页面,然后把它移到我们的/var/www/html目录下。
index.html # VI[root @罗晓家园]
这是一个关于SELinux的测试
[root @罗晓首页]# mv index.html/var/www/html/
[root @罗晓html]# cd /var/www/html/
[root @罗晓html]# ls
index.html
此时,按照正常情况,由于html目录中有一个index.html页面,如果我们此时刷新浏览器页面,应该会跳转到index.html页面。
但实际上我们发现页面还在这个测试页面上。为什么?这与我们的SELinux安全策略有关。我们可以到/var/log/audit目录下查看audit.log文件,找出错误信息。
[root @罗晓html]# tail/var/log/audit/audit . log
type=CRED _ DISP msg=audit(1369575601.957:289):user PID=3637 uid=0 auid=0 ses=44 subj=system _ u:system _ r:crond _ t:s0-s0:c0 . c 1023 msg=' op=PAM:set CRED acct=' root ' exe='/usr/sbin/crond ' hostname=?addr=?'终端=cron res=成功'
type=USER _ END msg=audit(1369575601.957:290):USER PID=3637 uid=0 auid=0 ses=44 subj=system _ u:system _ r:crond _ t:s0-s0:c0 . c 1023 msg=' op=PAM:session _ close acct=' root ' exe='/usr/sbin/crond ' hostname=?addr=?'终端=cron res=成功'
type=AVC msg=audit(1369575729.534:291):AVC:denied { getattr } for PID=3619 comm=' httpd ' path='/var/www/html/index . html ' dev=sda 2 ino=538738 scontext=unconlined _ u:system _ r:httpd _ t:s0 tcontext=unconlined _ u:object _ r:home _ root _ t:s0 tclass=file
type=SYSCALL msg=audit(1369575729.534:291):arch=c 00000003 e SYSCALL=4 success=no exit=-13 A0=7f FBC 87 bee 0 a2=7f FBC 87 bee 0 a3=7f FBC 87 bee 0 items=0 ppid=3612 PID=3619 auid=500 uid=48 GID=48 euid=48
type=AVC msg=audit(1369575729.535:292):AVC:denied { getattr } for PID=3619 comm=' httpd ' path='/var/www/html/index。html ' dev=sda 2 ino=538738 scontext=unconline _ u:system _ r:httpd _ t:s0 t context=unconline _ u:object _ r:home _ root _ t:s0 t class=file
type=SYSCALL msg=audit(1369575729.535:292):arch=c 000003 e SYSCALL=6 success=no exit=-13 A0=7f FBC 87 bee 0 a2=7 fffbc 87 bee 0 a3=1 items=0 ppid=3612 PID=3619 auid=500 uid=48 euid=48 suid=48 fsuid
type=AVC msg=audit(1369575736.549:293):AVC:denied { getattr } for PID=3618 comm=' httpd ' path='/var/www/html/index。html ' dev=sda 2 ino=538738 scontext=unconline _ u:system _ r:httpd _ t:s0 t context=unconline _ u:object _ r:home _ root _ t:s0 t class=file
type=SYSCALL msg=audit(1369575736.549:293):arch=c 00000003 e SYSCALL=4 success=no exit=-13 A0=7f FBC 87 bee 0 a2=7f FBC 87 bee 0 a3=7f FBC 87 bee 0 items=0 ppid=3612 PID=3618 auid=500 uid=48 GID=48 euid=48
type=AVC msg=audit(1369575736.549:294):AVC:denied { getattr } for PID=3618 comm=' httpd ' path='/var/www/html/index。html ' dev=sda 2 ino=538738 scontext=unconline _ u:system _ r:httpd _ t:s0 t context=unconline _ u:object _ r:home _ root _ t:s0 t class=file
type=SYSCALL msg=audit(1369575736.549:294):arch=c 000003 e SYSCALL=6 success=no exit=-13 A0=7f FBC 87 bee 0 a2=7 fffbc 87 bee 0 a3=1 items=0 ppid=3612 PID=3618 auid=500 uid=48 euid=48 suid=48 fsuid
从这个日志文件中,我们就可以看到刷新页面不出来index.html的原因就是因为我们的SELinux安全策略所导致的
我们通过ls -Z命令先来看看刚移动过来的index.html的上下文信息
[root @罗晓html]# ls -Z
-rw-r-r-r .根root unconlined _ u:object _ r:home _ root _ t:s0 index.html
我们发现其第三个字段的类型是home_root_t,这是为什么呢?因为我们刚才是在/首页目录下创建的这index.html文件,所以其默认会继承上一层目录的SELinux的类型信息,我们可以查看一下/首页这个目录的上下文信息:
[root @罗晓html]# ls -Z -d /home/
drwxr-xr-x . root root root root system _ u:object _ r:home _ root _ t:s0/home/
我们看到,其第三个字段和我们刚才的index.html相同,由此可以看出文件的语境值是受上一级目录影响的,一般情况下它们会继承上一级目录的语境值,但是,一些安装服务产生的文件语境值会例外,不继承上级目录的语境值,服务会自动创建它们的语境值,比如没有装超文本传送协议(超文本传输协议的缩写)服务的时候/var/目录下时没有万维网目录的,安装超文本协议服务服务后该服务会自动创建出所需的目录,并定义与服务相关的目录及文件才语境值,它们并不会继承上级目录的语境值。
[root @罗晓html]# ls -Z -d /var
drwxr-xr-x .根根系_u:object_r:var_t:s0 /var
[root @罗晓html]# ls -Z -d /var/www/html/
drwxr-xr-x . root root root root system _ u:object _ r:httpd _ sys _ content _ t:s0/var/www/html/
这时我们发现我们的/var/www/html目录的上下文类型是httpd_sys_content_t,而我们刚搬过来的index.html的类型是home _ root _ t,因为我们此时的SELinux工作模式是enforcing,违反策略的动作是被禁止的,所以我们的index.html中的信息在我们刷新页面时不会出现。那么,这个时候应该怎么解决这个问题呢?
通常,有两种解决方案:
直接将SELinux的工作模式设置为禁用,这样就不会有策略拦截的问题,但是这样我们的系统就没有SELinux的安全保护了。
通过restorecon或chcon命令修复我们的文件上下文信息。
restorecon命令可用于恢复文件的默认上下文:
restore con-r-v/var/www/html/index . html//-r表示递归。如果是目录,将修复该目录下的所有子目录和文件。
命令chcon可以更改文件的上下文信息。通常,我们使用一个参考文件来修改它:
chcon-reference=/var/www/html/index . html/var/www/html/test . html
这里,我们使用restorecon命令恢复文件的默认上下文:
index.html[root @罗晓html]# restorecon -v
restorecon reset/var/www/html/index . html context un confined _ u:object _ r:home _ root _ t:s0-un confined _ u:object _ r:httpd _ sys _ content _ t:s0
[root @罗晓html]# ls -Z
-rw-r - r -。root root un confined _ u:object _ r:httpd _ sys _ content _ t:s0 index.html
我们可以看到,使用restorecon命令后,index.html的上下文信息继承了上一级目录html的上下文信息。此时,我们可以刷新页面,在index.html中查看内容。
通过这个例子,我们可以了解文件的上下文信息与SELinux的关系,通过查看日志文件/var/log/audit/audit.log的信息找出错误,并使用restorecon命令修复我们文件的上下文信息。
六、SELinux日志管理
SELinux阻塞的进程的日志记录存储在文件/var/log/audit/audit.log中,但是用户对该文件的读取体验很差。可以去cat /var/log/audit/audit.log看一下,所以系统给我们提供了sealert工具来帮助我们整理这个日志文件。sealert工具处理日志文件需要一些时间。请耐心等待。
另外,SELinux的日志功能需要打开auditd.service服务。
通过案例了解sealert工具(apache SELinux配置):
1.确保httpd服务已配置并打开。
2./usr/sbin/httpd命令将启动读取以结尾的文件的进程。/var/www/html/目录中的html。现在,在您的主目录中创建文件~/index.html,想写什么就写什么,然后将新创建的文件移动到/var/www/html/。
3.通过浏览器,我们在地址栏输入本地IP,查看是否成功。当出现以下界面时,表示访问失败。
4.当我们配置服务时,我们确保没有问题。此时,我们应该认为SELinux可能阻止了我们访问。我们下达了命令。
sealert-a/var/log/audit/audit . log
查看SELinux日志,找到httpd的关键词,读取内容。下图的内容是我们主要关注的,其他的都是/var/log/audit/audit.log的内容,可以忽略。最后我们优先考虑改动最小的方案,也就是修改SELinux标签。
执行命令
restorecon-v/var/www/html/index . html
就是将文件修改为httpd可以访问的默认标签。
6.使用浏览器再次访问和查看结果。这一次,成功了。
以上就是如何理解Linux下SELinux的细节。更多关于Linux SELinux的信息,请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。