企鹅日记(十七):SELinux初探

其实SELinux是在进行程序、文件等权限设置依据的一个内核模块。由于启动网络服务的也是程序,因此刚好也是能够控制网络服务能否访问系统资源的一道关卡!

传统的文件权限与帐号关系:自主访问控制 DAC。而以策略指定特定程序读取特定文件:强制访问控制,MAC。

DAC的困扰是当用户取得程序后,他可以通过这个进程与自己默认权限来处理他自己的文件资源,万一这个用户对linux不熟,很可能会有资源误用的问题产生。SELinux针对这个问题导入了强制访问控制(Mandatory Access Control)的方法。MAC可以针对特定的进程与特定的文件资源来进行权限的控制!也就是说,即使你是root,在使用不同的进程的时候,你所能取得的权限不一定是root,而要看当时该进程的设置而定。如此一来,针对控制的主体变成了进程而不是用户。

两个主要的策略(Policy)为:

× targeted:针对网络服务限制较多,针对本机限制较少,是默认策略。

× strict:完整的SELinux限制,限制方面较为严格。

建议使用默认的targeted就可以了。

在SELinux中,主体也就是进程想要取得目标也就是文件系统的资源访问权限,要经历三道关卡:

1,主体程序必须要通过SELinux策略内的规则放行。

2,与目标资源进行安全上下文的比较,比较成功才能进行下一步。

3,最终要得看文件系统的rwx权限设置,符合的才能最终访问资源。

安全上下文同时存在于主体进程和目标文件资源中,这个就相当于SELinux的rwx,需要每个文件和进程都设置的,懂否。进程的安全上下文放在内存中,而文件的安全上下文放在inode中。

查看安全上下文方法:

# ls -Z

drwx——. yidao yidao unconfined_u:object_r:user_home_t:s0 books

安全上下文主要用冒号分为三个字段:

身份标识(Identify):root表示root的帐号身份,system_u表示系统程序方面的标识,user_u表示一般用户相关的身份。

角色(Role):判断这个数据属于程序、文件资源还是代表用户,object_r代表的是文件或目录,system_r代表的进程

类型(Type):这个最重要,在文件资源中称为Type,而在进程中称为domain,domain需要与type搭配,则该程序才能顺利的读取文件资源。

====SELinux启动、关闭和查看====

目前SELinux支持三种模式:

enforcing:强制模式,代表SELinux正在运行中,且已经正确开始限制domain/type了。

permissive:宽容模式,代表SELinux正在运行中,不过仅会有警告信息并不会实际限制domain/type的访问。

disabled:关闭,SELinux并没有实际运行。

查看目前的SELinux的模式:

1
2
[yidao@localhost ~]$ getenforce
Disabled  <==显示目前的状态为关闭

查看SELinux的策略(Policy):

# sestatus  [-vb]

-v:检查列于/etc/sestatus.conf内的文件与程序的安全上下文内容

-b:将目前策略的规则布尔值列出

SELinux的配置文件为:/etc/selinux/config,启动和关闭都可以直接编辑这个文件,里面注释写的很清楚,不用解释了。

切换enforcing和permissive模式:

# setenforce [0|1]

0:转成permissive宽容模式

1:转成Enforcing强制模式

安全上下文设置方法:

# chcon [-R] [-t type] [-u user] [-r role] 文件

# chcon [-R] –reference=范例文件  文件

-R:连同子目录递归修改

-t:后接安全上下文的类型type字段!例如httpd_sys_content_t

-u:后接身份标识,例如system_u

-r:后接角色,例如system_r

–reference=范例文件,不解释了。

# chcon -t httpd_sys_content_t /var/www/html/index.html

# ll -Z /var/www/html/index.html

上面的chcon是通过直接指定的方式来处理安全上下文的类型数据,那我们知道其实系统默认的目录都有特殊的SELinux的安全上下文,下面的命令可以使用默认的安全上下文来还原

# restorecon [-Rv] 文件或目录

-R:连同子目录递归设置

-v:过程显示出来

SELinux最好启动两个服务来记录日志情况:

1,将错误信息写入/var/log/messages

# chkconfig –list setroubleshoot

# chkconfig setroubleshoot on

2,将详细数据写入/var/log/audit/audit.log

# chkconfig –list auditd

# chkconfig auditd on

然后这样分析日志文件:

# audit2why < /var/log/audit/audit.log

============================END==========================

本人博客已搬家,新地址为:http://yidao620c.github.io/

相关推荐