陈小冬的技术 2013-04-04
其实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/