,,如何理解Linux下的SELinux

,,如何理解Linux下的SELinux

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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: