首页 > 技术笔记 > [SELinux] 浅析

[SELinux] 浅析

2014年2月11日 发表评论 阅读评论

背景:
在搭建kerberos时,ss服务器,系统启动时启的sshd进程,不能读取root的.k5login,普通用户的可以,但是把进程kill掉,再手动启动后,就可以读取root的.k5login。此问题是由于selinux导致,比较暴力的方法是直接disable掉selinux(大多数工程师都是这么干的)。
但是selinux在发行版中已经有很长时间了,所以说明他还是有价值的,一般对0day漏洞很用意义,所以看趋势还是会使用起来的,下面是对selinux的简单学习。
SELinux 是通过MAC(Mandatory Access Control, MAC) 的方式来管理程序,他控制的主体是程序进程,目标则是该程序进程能否读取的档案文件资源。

如何工作:
主体 (Subject):
SELinux 主要想要管理的就是程序,因此你可以將『主体』跟 process 划上等号;

目标 (Object):
主体程序能否读取的目标资源,一般就是文件系统。

政策 (Policy):
由于程序与文件数量庞大,因此SELinux会根据某些服务来制定基本的存取安全性策略,这些策略内还会有详细的规则rule来制定不同服务开放木箱资源的存取与否,当前centos里面有两个主要策略,分别是
target:针对网络服务限制较多,针对本机限制较少,是预设的策略
strict:完整的SELinux限制,限制方面较为严格
建议使用预设的targeted策略即可

安全上下文(security context):
主体能不能存取目标除了政策指定外,主体与目标的安全上下文必须一致才能顺利存取,安全上下文是非常重要的,如果设备错误,你的某些服务(主体)就无法存取档案系统(目标),审计日志audit.log中会一直出现权限不符的错误。
selinux_1
上图为检查过程。

安全上下文存在主体程序中与目标档案资源中,程序在内存中,所以安全上下文可以存在内存中,那档案的安全上下文是记录在哪里呢,事实上,安全上下文是存在档案的inode内的,因此在主体程序响应读取目标资源是,同样需要读取inode。

查看文件的安全上下文

[root@it12 ~]# ll -aZ /root/
dr-xr-x---. root root system_u:object_r:admin_home_t:s0 .
dr-xr-xr-x. root root system_u:object_r:root_t:s0      ..
-rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
-rw-------. root root unconfined_u:object_r:admin_home_t:s0 .bash_history
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 .bash_logout
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 .bash_profile
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 .bashrc
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 .cshrc
-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
-rw-r--r--. root root unconfined_u:object_r:krb5_home_t:s0 .k5login

安全上下文每个栏位的意义:
Identify:role:type
身份:角色:类型

身份 (Identify):

相当于账号方面的身份识别,主要的身份识别则有下面三种常见类型:

root:表示 root 的账号身份,如同上面的表格显示的是 root 家目录下的資料啊!
system_u:表示系統程序方面的识別,通常就是程序;
user_u:代表的是一般使用者账号相关的身份。
你会发现身份识别中,除了root之外,其他的识别后面会加上_u的字样,这个身份识别重点再让我们了解该资料为何种身份所有,而系统上面大部分的资料都会是system_u或root,至于/home下的资料,大部分都是user_u

角色 (Role):

透過角色栏位,我們可以知道這個資料是属于程序、档案资源是代表使用者。一般的角色有:

object_r:代表的是档案或目录等档案資源,這应该是最常見的囉;
system_r:代表的就是程序啦!不過,一般使用者也会被指定成為 system_r 喔!

你也会发现角色的懒位最後面使用『 _r 』來結尾!因為是 role 的意思嘛!

类型 (Type) :(最重要!)

在预设的 targeted 政策中, Identify 與 Role 栏位基本上是不重要的!重要的在于这个类型 (type) 栏位! 基本上,一個主体程序能不能读取到這個档案資源,与类型栏位有关!而类型栏位在档案与程序的定义不太相同,分別是:

type:在档案資源 (Object) 上面称为类型 (Type);
domain:在主替程序 (Subject) 则称为 (domain) 了!

domain 需要与 type 匹配,则該程序才能够順利的读取档案资源啦!

具体场景:
我遇到的问题就是由于.k5login的类型不能与sshd进程的domain匹配造成的。
在root目录中手动创建的.k5login的类型为admin_home_t,正确的应该是krb5_home_t。

如果遇到上述问题应该来如何修复呢,下面介绍一下相关的命令。
在介绍命令之前先说一下有关selinux的日志都属于审计日志audit,所以相关的日志都在/var/log/audit目录内。
上面的问题可以使用restorecon 或fixfiles来修复一下,使用方法如下
1、 restorecon
说明:恢复档案目录的预设的security Context
规格来源:/etc/selinux//contexts/files/目录内的file_contexts与file_contexts.local
常用参数如下:
-r | -R:包含子目录与其下档案目录
-F:恢復使用预设的項目(就算是檔案符合存取规范)
-v:显示执行过程
使用方式:restorecon [FRrv] [-e excludedir ] pathname… ]
使用范例如下:
restorecon /etc/ntp.conf
restorecon -v /etc/ntp.conf
restorecon -v -F /etc/ntp.conf
手动配置新增恢复规则
1)档案名称
/etc/selinux//contexts/files/file_contexts.local
2)新增配置范例
/var/ftp(/.*)? system_u:object_r:public_content_t
3)注意
可以使用semanage程式来维护会比较方便

2、fixfiles
说明:修正档案目录的预设的security Context,依据/etc/selinux//contexts/files/内相关档案修正
使用方式:
fixfiles { check | restore|[-F] relabel } [[dir] … ]
fixfiles -R rpmpackage[,rpmpackage...] { check | restore }
参数:
-R:使用指定的rpm 套件所提供的檔案清單
使用范例:
fixfiles check /etc
fixfiles restore /etc
fixfiles -F relabel /
fixfiles -R setup check

其他的一些命令
SELinux开机的三种状态
配置文件 /etc/sysconfig/seLinux
SELINUX = Enforcing (默认)
Disabled : 停用SELinux功能
Permissive : 仅显示警告信息,不阻止
Enforcing : 强制执行SELinux功能,产生警告信息
更改上面配置需要重启系统,重启后配置会永久生效,在由disable改回到其他任何一个状态时需要在系统根目录建立安全标签,命令如下
touch /.autorelabel

查询系统的selinux 目前的状态
3、sestatus
4、getenforce
设置selinux状态(重启后会失效)
5、setenforce [ Enforcing | Permissive | 1 | 0 ]
6、audit2why
说明:检视SELinux audit讯息内容,提供检视/var/log/audit/audit.log内的记录资讯说明
使用范例:audit2why < /var/log/audit/audit.log
注意:需要搭配启动auditd服务程式一起使用

7、sealert
说明:SELinux 讯息诊断用户端程序
参数如下:
-H, --html_output:使用网页格式输出(搭配 -a or -l 使用)
-l, --lookupid ID:检视指定ID的警示讯息
使用范例:
sealert -l xxxxx-xxxxx-xxxx
sealert -H -l xxxxx-xxxxx-xxxx > output.html
注意:需要搭配setroubleshoot服务一起使用
setroubleshoot服务启动后,会依据audit服务提供的资讯给予适当问题诊断,然后输出于/var/log/messages,该档案内会有相关输出资讯提供除错检视

8、semanage
说明:selinux policy维护工具
使用方式:semanage { login | user | port | interface | fcontext | translation} -l [-n]
使用范例:
semanage login -l
semanage user -l
semanage port -l
semanage port -a -t http_port_t -P tcp 81
semanage fcontext -a -t httpd_sys_Context_t “/home/users/(.+)/public_html(/.*)?“

9、secon
说明:检视程式、档案与使用者等相关SELinux Context
使用方式:
secon [-hVurtscmPRfLp] [CONTEXT]
secon [--file] FILE | [--link] FILE | [--pid] PID
参数:
-u, –user:show the user of the security context
-r, –role:show the role of the security context
-t, –type:show the type of the security context
-f, –file FILE:gets the context from the specified file FILE
-p, –pid PID:gets the context from the specified process PID
使用范例:
secon -u
secon -r
secon -t
secon –file /etc/passwd
secon –pid

oreutils 工具的 SELinux 模式:

常见的属于 coreutils 的工具如 ps、ls 等等,可以通过增加 Z 选项的方式获知 SELinux 方面的信息。

如 ps auxZ | grep lldpad

system_u:system_r:initrc_t:s0 root 1000 8.9 0.0 3040 668 ? Ss 21:01 6:08 /usr/sbin/lldpad -d

如 ls -Z /usr/lib/xulrunner-2/libmozjs.so

-rwxr-xr-x. root root system_u:object_r:lib_t:s0 /usr/lib/xulrunner-2/libmozjs.so

以此类推,Z 选项可以应用在几乎全部 coreutils 工具里。

分类: 技术笔记 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.