selinux 概念:
security enhanced linux,安全强化的linux;
背景:selinux是由美国国家安全局NSA开发,为了控管这方面的权限和程序的问题,同时selinux也被整合到linux核心的模块。
简单说SElinux是在进行程序、文件等细部权限设定依据的一个核心模块。由于启动网络服务也是程序,因此刚好也能控制网络服务能否存取系统资源的一道关卡!
传统的文件权限和帐号关系:自主式访问控制,DAC
系统帐号分为root (系统管理员用户)和一般用户,这两种身份能否使用系统上面的文件资源则与rwx的权限设定有关。不过,各种权限设定对root是无效的。因此当某个程序想要对档案进行存取时,系统就会根据该程序的拥有者/群组,对比该文件的权限,若权限检查通过,那么可以存取该文件了。
这种存取文件系统的方式被称为「自主式访问控制 (Discretionary access control)DAC」基本上,就是依据程序的拥有者和档案资源的rwx权限来决定有无存取的能力,不过这种DAC的访问控制的问题:
1:root具有最高的权限,若某个root权限的程序被控制,那么这支程序就可以在系统上进行任何资源的存取。
2:用户可以取得程序来变更文件资源的访问权限,若不小心将目录设定未777,那么对于任何人的权限都是rwx,那么也很危险。
——————
以 策略(policy)、规则(rule) 指定 特定程序 「读取」 特定文件:
为了避免DAC容易发生的问题,SELinux就导入了委任式访问控制,Mandatory Access Control 。
他可以针对特定的程序 和 特定的档案资源 来进行权限的管控!也就是说即使root用户,在使用不同的程序时,
所取得的权限也不一定是root,而是要看该程序的设定。如此以来,我们针对控制的「主体」变成了 程序,而非用户,
此外主体程序也不能任意使用系统档案资源,因为每个档案资源也有针对该主题程序而设定 可取用的权限!如此以来,系统管控粒度更细,但整个系统程序那么多,档案那么多,一项一项控制可就没完没了,所以SELinux也提供一些预设的政策Policy,并在该policy内提供多个规则rule,用户选择是否启用该控制规则!
————————————————————————
SELinux 运作模式
SELinux是透过 MAC的方式来管控 程序,控制的主体是「程序」,而目标则是该程序能否读取的「档案资源」;
主体Subject,SELinux主要管理的就是程序
目标Object,主体程序能否存取目标资源,一般就是文件系统。
策略/政策 Policy, 由于程序和文件数量庞大,因此SELinux 会依据某些服务来制订基本的存取安全性政策。这些政策内还会有详细的规则rule,来指定不同的服务开放某些资源的存取与否。在CentOS 5系列里面有两个主要的策略
1:targeted,针对网络服务限制较多,针对本机限制较少,也是预设的策略
2:strict,完整的SELinux限制,限制较为严格。
----
安全性上下文(Security Context)
主体能不能存取目标除了 策略poliy之外,主体和目标的安全性上下文security context,安全性上下文有点类似文件系统的rwx,而且它的内容和设定非常重要!如果设定错误,某些服务也无法存取文件系统资源,当然也会出现「权限不符」的错误。
安全性上下文存在于主体程序中和目标档案资源中。程序在内存内,所以安全性上下文可以存入是没问题。那档案的安全性上下文是记录在哪里呢?事实上,安全性上下文是放置到档案的 inode 内,因此主体程序想要诺取目标档案资源时,同样需要诺取 inode , 这 inode 内就可以比对安全性上下文以及 rwx 等权限值是否正确,而给予适当的读取权限依据。
查看档案的安全性上下文, 「ls -Z」
drwxr-xr-x root root root:object_r:user_home_t Desktop
-------
如上所示,安全性上下文主要用冒号分为三个字段,三个字段的意义是
Identify:role:type
身份标识:角色:类型
Identify:相当于帐号方面的身份识别!主要的身份识别则有如下三种:
root:标识root帐号身份,
system_u:标识系统程序方面的识别,通常就是程序
user_u:一般用户帐号相关的身份。
角色Role:
透过这个字段,我们可以知道这个数据是属于程序,文件资源还是代表使用者。一般角色有:
object_r:代表档案或者目录资源。
system_r:代表程序,一般使用者也会被指定为system_r。
类型type:最重要!
在预设的targeted 策略中,identify和role字段基本上不怎么重要。最重要的字段在于type字段。
基本上一个主体程序能不能读取到这个档案资源,与类型字段有关,而类型字段在档案和程序的定义不太相同。分别是
type:在档案资源object 上面类型type类型
domain:在主体程序subject上称为领域domain。
domain 需要和type搭配,该程序才可以顺利读取档案资源。
程序和文件 SELinux type字段的相关性
透过身份识别和角色定义,可知:
身份识别 角色 对应在targeted的意义
root system_r 代表root帐号登入系统所取得权限
system_u system_r 由于是系统帐号,因此是非交谈式的系统运作程序
user_u system_r 一般可登入用户的程序
————————————
主体和目标之间是否具有读写权限,与程序的domain和档案的type有关。以www服务器功能的httpd这支程序和/var/www/html这个目录来说明。
查看其安全性上下文可知
ll -Zd /usr/sbin/httpd /var/www/html
-rwxr-xr-x root root system_u:object_r:httpd_exec_t /usr/sbin/httpd
drwxr-xr-x root root system_u:object_r:httpd_sys_content_t /var/www/html
--------
# 两者的角色字段都是 object_r ,代表都是档案!而 httpd 属于 httpd_exec_t类型,
# /var/www/html 则属于 httpd_sys_content_t 这个类型!
——————————
httpd 领域(domain)能够读取html目录类型type,如上的对应关系在其对应的策略和规则中。
对于一般情况,1:策略内部需要 指定详细的domain/type 相关性;
2:若档案的type设定错误,即使rwx全开的777,也将导致主体程序无法读取目标档案资源。
——————————————————————
在CentOS 5.x的发行版本下本身就支持SELinux,支持三种模式
1:enforcing :强制模式,代表SELinux运作中,且已经正确开始限制domain/type了;
2:persissive:宽容模式,代表selinux运作中,不过仅会有告警讯息并不会实际限制domain/type的存取。
3:disable:关闭模式,selinux没有运作。
——————————————
获取selinux模式
getenforce
获取selinux的策略policy
sestatus [-vb]
-v:检查位于 /etc/sestatus.conf 内的档案和程序的安全性上下文;
-b:将目前策略的规则布尔值列出,即默写规则rule是否要启动(0/1)
---------------
SELinux status: enabled
SELinuxfs mount: /selinux <==SELinux 的相关档案数据挂载点
Current mode: enforcing <==目前的模式
Mode from config file:enforcing <==配置文件指定的模式
Policy version:21
Policy from config file:targeted <==目前的策略
----
如上配置是默认的策略,若改变了策略,那么需要重启。
在enforcing 模式,可能由于一些设定的问题导致SELinux让某些服务无法正常的运作,此时可以将enforing的模式改为permissive模式。让SELinux只会警告无法顺利联机的信息,而不是限制主体程序的读写权限。
让selinux在enforcing和permissive之间切换的方法
setenforce[0|1]
0:转成1permissive 宽容模式
1:enforcing模式
————————————
注意:在setenforce无法在disable的模式下进行切换哦!
————————————————————————————
pstree | grep httpd
root:system_r:httpd_t root 24089 0.2 1.2 22896 9256 ? Ss 16:06 0:00 /usr/sbin/httpd
root:system_r:httpd_t apache 24092 0.0 0.6 22896 4752 ? S 16:06 0:00 /usr/sbin/httpd
······
网络服务启动之后,ps -Z 选项可以查看程序的安全性上下文,而且发现此程序的domain是 httpd_t
我们在 /var/wwww/html/ 新建文件index.html,并查看其安全性上下文
ll -Z /var/www/html/index.html
-rw-r--r-- root root root:object_r:httpd_sys_content_t /var/www/html/index.html
权限是 apache 可以读取的标志,而 SELinux 则是 httpd_sys_content_t的类型 (type),也是httpd_t 能读取的;
为什么httpd_t可以读取呢?因为targeted 策略里面有设定。若html目录内文件的security context 的type不能被httpd的domain读取,
那么即使html的目录权限是777,那么也不能够被httpd程序读取;
——————————————————-
重设SELinux 的安全性上下文 security context
chcon [-R][-t type] [-u user][- role] 目标档案
chcon [-R] --reference=范例文件 目标档案
-R:连同该目录下的次目录也同时修改
-t :后面接security context的type字段,例如 httpd_sys_content_t;
-u :后面接身份识别:例如system_u;
-r : 后面接角色,例如system_r;
--reference=范例文件 : 以范例文档的security context 来修改 目标档案的 security context;
————————————————————
chcon是透过直接指定的方式来处理安全性上下文,系统默认的目录都有特殊的selinux安全性上下文,例如/var/www/html 原本就是httpd可以读取的目录,那么移动到此目录下的文件也应当具有正确的security context。那么有没有可以是预设的security context 还原的方式呢?那就是restorecon。
restorecon [-Rv] 目录/文件
-R:连同子目录一并修改
-v:显示过程。
——————————————————
SELinux 所需的服务
由于它是整合到核心上的功能,因此几乎不需要启动其他额外的服务来开启selinux。由于SELinux的安全性上下文的限制,若当之网络服务无法审理运行,其错误信息如何记录下来呢?
settroubleshoot
该服务可以将错误信息写入 /var/log/messages;
查看该服务是否开机启动
chkconfig --list setroubleshoot
setroubleshoot 0:off 1:off 2:off 3:on 4:on 5:on 6:off
linux在 3 和 5 的 运行级别上开启 on 即可。
若没有开启,可以使用如下命令开启
chkconfig setroubleshoot on
查看错误信息
cat /var/log/messages | grep setroubleshoot
···
messages. run sealert -l 6c028f77-ddb6-4515-91f4-4e3e719994d4
····
重点是sealert -l 可以提供更加完整的信息。
sealert -l 6c028f77-ddb6-4515-91f4-4e3e719994d4
SELinux is preventing the httpd from using potentially mislabeled files
···
Detailed Description:
···
Allowing Access:
···
If you want httpd to access this files, you need to relabel them using restorecon -v '/var/www/html/index.html'.You might want to relabel the entire directory using restorecon -R -v '/var/www/html'.
......
重点按照 allowing access 的提示去处理,完成对应的selinux的设定,即可。
auditd
将selinux的信息写入 /var/log/audit/audit.log
与上一个setroubleshoot服务类似,最好在设定开启启动模式。auditd会将 许多selinux信息记录下来,而不只是错误信息。由于其文档庞大,selinux提供了一个audit2why的指令来让我们查询错误信息。
audit2why < /var/log/audit/audit.log
将登录档内容读进来分析,并输出分析结果。
type=AVC msg=audit(1237799959.349:355): avc: denied { getattr } for pid=24094 comm="httpd" path="/var/www/html/index.html" dev=hda2 ino=654685 scontext=root:s ystem_r:httpd_t:s0 tcontext=root:object_r:user_home_t:s0 tclass=file Was caused by: Missing or disabled TE allow rule. Allow rules may exist but be disabled by boolean settings; check boolean settings. You can see the necessary allow rules by running audit2allow with this audit message as input.
用法和输出如上,比较有趣的是那个AVC,access vector cache 的缩写,目的是记录所有和selinux有关的存取统计资料,输出的信息也有错误发生的原因,type不符。
推荐 setroubleshoot
-------------------
selinux 的策略和rule 管理
查看targeted 策略,该策略提供多少相关规则? seinfo 命令
seinfo [-Atrub]
-A:列出SElinux的状态,规则布尔值,身份识别,角色,类别等信息
-t:列出selinux的所有类别type
-r:列出所有的role种类
-u:列出所有的身份识别user种类
-b:列出所有规则的布尔值
-------------
seinfo -b | grep httpd
Rule loading disabled
allow_httpd_mod_auth_pam
allow_httpd_bugzilla_script_anon_write
httpd_enable_ftp_server
···
如上可以看到和httpd相关的布尔值,若想找到httpd的selinux 的 security context,可以使用seinfo -t | grep httpd 查询
查询到相关的type和布尔值后,若想知道详细的规则,可以使用sesearch指令
sesearch [-a] [-s 主体类别] [-t 目标类别] [-b 布尔值]
-a :列出该类别或布尔值的所有相关信息
-t:接目标类别,例如 -t httpd_t
-b:接布尔值的规则,例如 -b httpd_enable_ftp_server
——————————————
例如 找出目标资源 httpd_sys_content_t的有关信息
sesearch -a -t httpd_sys_content_t
Found 74 av rules:
allow readahead_t httpd_sys_content_t : file { ioctl read getattr lock };
allow readahead_t httpd_sys_content_t : dir { ioctl read getattr lock
search };
···
「allow 主体程序安全性本文类别 目标档案安全性本文类别」
#如上说明这个类别可以被那个主体程序的类别所读取,以及目标档案资源的格式;从上面我们也可以查到
某个主体程序subjec 可以读取的目标资源object;httpd可以读取 httpd_sys_content_t;
——————————————
查看某个布尔值
sesearch -b httpd_enable_homedirs -a
Found 21 av rules:
allow httpd_t user_home_dir_t : dir { getattr search };
allow httpd_t cifs_t : file { ioctl read getattr lock };
allow httpd_t cifs_t : dir { ioctl read getattr lock search };
···
布尔值的设定里面规范了很多主体程序和目标档案资源的放行与否,其实实际规范这些规则就是这些布尔值。
主体程序能否对目标档案进行存取,与布尔值有关。布尔值可以将规则设定成启动或者关闭 1/0;
————————————————
由seinfo和sesearch的输出信息,实际的策略数据存放在/etc/selinux/targeted/policy/
------------
查看系统se布尔值,
getsebool [-a] [布尔值列表]
-a:列出系统上所有的布尔值列表,开闭情况
例如 getsebool -a
NetworkManager_disable_trans --> off
allow_console_login --> off
allow_cvs_read_shadow --> off
allow_daemons_dump_core --> on
···
修改se布尔值
setsebool [-P] 布尔值=[0|1]
-P:直接将设定值写入配置文件,该设定值程序重新读取会生效;
setsebool -P httpd_enable_homedirs=0
_________
查看目录默认的security context
semanage {login|user|port|interface|fcontext|translation} -l
semanage fcontext -{a|d|m} [-frst] file_spec
选项和参数:
fcontext :主要用在security context的用途, -l 为查询的意思;
-a :增加的意思,你可以增加一些目录的默认 security context 设定;
-m :修改的意思;
-d :删除的意思。
semanage fcontext -l
SELinux fcontext type Context
/var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
...
添加 public_content_t 类型给到指定的目录
semanage fcontext -a -t public_content_t "/srv/samba(/.*)?"
security enhanced linux,安全强化的linux;
背景:selinux是由美国国家安全局NSA开发,为了控管这方面的权限和程序的问题,同时selinux也被整合到linux核心的模块。
简单说SElinux是在进行程序、文件等细部权限设定依据的一个核心模块。由于启动网络服务也是程序,因此刚好也能控制网络服务能否存取系统资源的一道关卡!
传统的文件权限和帐号关系:自主式访问控制,DAC
系统帐号分为root (系统管理员用户)和一般用户,这两种身份能否使用系统上面的文件资源则与rwx的权限设定有关。不过,各种权限设定对root是无效的。因此当某个程序想要对档案进行存取时,系统就会根据该程序的拥有者/群组,对比该文件的权限,若权限检查通过,那么可以存取该文件了。
这种存取文件系统的方式被称为「自主式访问控制 (Discretionary access control)DAC」基本上,就是依据程序的拥有者和档案资源的rwx权限来决定有无存取的能力,不过这种DAC的访问控制的问题:
1:root具有最高的权限,若某个root权限的程序被控制,那么这支程序就可以在系统上进行任何资源的存取。
2:用户可以取得程序来变更文件资源的访问权限,若不小心将目录设定未777,那么对于任何人的权限都是rwx,那么也很危险。
——————
以 策略(policy)、规则(rule) 指定 特定程序 「读取」 特定文件:
为了避免DAC容易发生的问题,SELinux就导入了委任式访问控制,Mandatory Access Control 。
他可以针对特定的程序 和 特定的档案资源 来进行权限的管控!也就是说即使root用户,在使用不同的程序时,
所取得的权限也不一定是root,而是要看该程序的设定。如此以来,我们针对控制的「主体」变成了 程序,而非用户,
此外主体程序也不能任意使用系统档案资源,因为每个档案资源也有针对该主题程序而设定 可取用的权限!如此以来,系统管控粒度更细,但整个系统程序那么多,档案那么多,一项一项控制可就没完没了,所以SELinux也提供一些预设的政策Policy,并在该policy内提供多个规则rule,用户选择是否启用该控制规则!
————————————————————————
SELinux 运作模式
SELinux是透过 MAC的方式来管控 程序,控制的主体是「程序」,而目标则是该程序能否读取的「档案资源」;
主体Subject,SELinux主要管理的就是程序
目标Object,主体程序能否存取目标资源,一般就是文件系统。
策略/政策 Policy, 由于程序和文件数量庞大,因此SELinux 会依据某些服务来制订基本的存取安全性政策。这些政策内还会有详细的规则rule,来指定不同的服务开放某些资源的存取与否。在CentOS 5系列里面有两个主要的策略
1:targeted,针对网络服务限制较多,针对本机限制较少,也是预设的策略
2:strict,完整的SELinux限制,限制较为严格。
----
安全性上下文(Security Context)
主体能不能存取目标除了 策略poliy之外,主体和目标的安全性上下文security context,安全性上下文有点类似文件系统的rwx,而且它的内容和设定非常重要!如果设定错误,某些服务也无法存取文件系统资源,当然也会出现「权限不符」的错误。
安全性上下文存在于主体程序中和目标档案资源中。程序在内存内,所以安全性上下文可以存入是没问题。那档案的安全性上下文是记录在哪里呢?事实上,安全性上下文是放置到档案的 inode 内,因此主体程序想要诺取目标档案资源时,同样需要诺取 inode , 这 inode 内就可以比对安全性上下文以及 rwx 等权限值是否正确,而给予适当的读取权限依据。
查看档案的安全性上下文, 「ls -Z」
drwxr-xr-x root root root:object_r:user_home_t Desktop
-------
如上所示,安全性上下文主要用冒号分为三个字段,三个字段的意义是
Identify:role:type
身份标识:角色:类型
Identify:相当于帐号方面的身份识别!主要的身份识别则有如下三种:
root:标识root帐号身份,
system_u:标识系统程序方面的识别,通常就是程序
user_u:一般用户帐号相关的身份。
角色Role:
透过这个字段,我们可以知道这个数据是属于程序,文件资源还是代表使用者。一般角色有:
object_r:代表档案或者目录资源。
system_r:代表程序,一般使用者也会被指定为system_r。
类型type:最重要!
在预设的targeted 策略中,identify和role字段基本上不怎么重要。最重要的字段在于type字段。
基本上一个主体程序能不能读取到这个档案资源,与类型字段有关,而类型字段在档案和程序的定义不太相同。分别是
type:在档案资源object 上面类型type类型
domain:在主体程序subject上称为领域domain。
domain 需要和type搭配,该程序才可以顺利读取档案资源。
程序和文件 SELinux type字段的相关性
透过身份识别和角色定义,可知:
身份识别 角色 对应在targeted的意义
root system_r 代表root帐号登入系统所取得权限
system_u system_r 由于是系统帐号,因此是非交谈式的系统运作程序
user_u system_r 一般可登入用户的程序
————————————
主体和目标之间是否具有读写权限,与程序的domain和档案的type有关。以www服务器功能的httpd这支程序和/var/www/html这个目录来说明。
查看其安全性上下文可知
ll -Zd /usr/sbin/httpd /var/www/html
-rwxr-xr-x root root system_u:object_r:httpd_exec_t /usr/sbin/httpd
drwxr-xr-x root root system_u:object_r:httpd_sys_content_t /var/www/html
--------
# 两者的角色字段都是 object_r ,代表都是档案!而 httpd 属于 httpd_exec_t类型,
# /var/www/html 则属于 httpd_sys_content_t 这个类型!
——————————
httpd 领域(domain)能够读取html目录类型type,如上的对应关系在其对应的策略和规则中。
对于一般情况,1:策略内部需要 指定详细的domain/type 相关性;
2:若档案的type设定错误,即使rwx全开的777,也将导致主体程序无法读取目标档案资源。
——————————————————————
在CentOS 5.x的发行版本下本身就支持SELinux,支持三种模式
1:enforcing :强制模式,代表SELinux运作中,且已经正确开始限制domain/type了;
2:persissive:宽容模式,代表selinux运作中,不过仅会有告警讯息并不会实际限制domain/type的存取。
3:disable:关闭模式,selinux没有运作。
——————————————
获取selinux模式
getenforce
获取selinux的策略policy
sestatus [-vb]
-v:检查位于 /etc/sestatus.conf 内的档案和程序的安全性上下文;
-b:将目前策略的规则布尔值列出,即默写规则rule是否要启动(0/1)
---------------
SELinux status: enabled
SELinuxfs mount: /selinux <==SELinux 的相关档案数据挂载点
Current mode: enforcing <==目前的模式
Mode from config file:enforcing <==配置文件指定的模式
Policy version:21
Policy from config file:targeted <==目前的策略
----
如上配置是默认的策略,若改变了策略,那么需要重启。
在enforcing 模式,可能由于一些设定的问题导致SELinux让某些服务无法正常的运作,此时可以将enforing的模式改为permissive模式。让SELinux只会警告无法顺利联机的信息,而不是限制主体程序的读写权限。
让selinux在enforcing和permissive之间切换的方法
setenforce[0|1]
0:转成1permissive 宽容模式
1:enforcing模式
————————————
注意:在setenforce无法在disable的模式下进行切换哦!
————————————————————————————
pstree | grep httpd
root:system_r:httpd_t root 24089 0.2 1.2 22896 9256 ? Ss 16:06 0:00 /usr/sbin/httpd
root:system_r:httpd_t apache 24092 0.0 0.6 22896 4752 ? S 16:06 0:00 /usr/sbin/httpd
······
网络服务启动之后,ps -Z 选项可以查看程序的安全性上下文,而且发现此程序的domain是 httpd_t
我们在 /var/wwww/html/ 新建文件index.html,并查看其安全性上下文
ll -Z /var/www/html/index.html
-rw-r--r-- root root root:object_r:httpd_sys_content_t /var/www/html/index.html
权限是 apache 可以读取的标志,而 SELinux 则是 httpd_sys_content_t的类型 (type),也是httpd_t 能读取的;
为什么httpd_t可以读取呢?因为targeted 策略里面有设定。若html目录内文件的security context 的type不能被httpd的domain读取,
那么即使html的目录权限是777,那么也不能够被httpd程序读取;
——————————————————-
重设SELinux 的安全性上下文 security context
chcon [-R][-t type] [-u user][- role] 目标档案
chcon [-R] --reference=范例文件 目标档案
-R:连同该目录下的次目录也同时修改
-t :后面接security context的type字段,例如 httpd_sys_content_t;
-u :后面接身份识别:例如system_u;
-r : 后面接角色,例如system_r;
--reference=范例文件 : 以范例文档的security context 来修改 目标档案的 security context;
————————————————————
chcon是透过直接指定的方式来处理安全性上下文,系统默认的目录都有特殊的selinux安全性上下文,例如/var/www/html 原本就是httpd可以读取的目录,那么移动到此目录下的文件也应当具有正确的security context。那么有没有可以是预设的security context 还原的方式呢?那就是restorecon。
restorecon [-Rv] 目录/文件
-R:连同子目录一并修改
-v:显示过程。
——————————————————
SELinux 所需的服务
由于它是整合到核心上的功能,因此几乎不需要启动其他额外的服务来开启selinux。由于SELinux的安全性上下文的限制,若当之网络服务无法审理运行,其错误信息如何记录下来呢?
settroubleshoot
该服务可以将错误信息写入 /var/log/messages;
查看该服务是否开机启动
chkconfig --list setroubleshoot
setroubleshoot 0:off 1:off 2:off 3:on 4:on 5:on 6:off
linux在 3 和 5 的 运行级别上开启 on 即可。
若没有开启,可以使用如下命令开启
chkconfig setroubleshoot on
查看错误信息
cat /var/log/messages | grep setroubleshoot
···
messages. run sealert -l 6c028f77-ddb6-4515-91f4-4e3e719994d4
····
重点是sealert -l 可以提供更加完整的信息。
sealert -l 6c028f77-ddb6-4515-91f4-4e3e719994d4
SELinux is preventing the httpd from using potentially mislabeled files
···
Detailed Description:
···
Allowing Access:
···
If you want httpd to access this files, you need to relabel them using restorecon -v '/var/www/html/index.html'.You might want to relabel the entire directory using restorecon -R -v '/var/www/html'.
......
重点按照 allowing access 的提示去处理,完成对应的selinux的设定,即可。
auditd
将selinux的信息写入 /var/log/audit/audit.log
与上一个setroubleshoot服务类似,最好在设定开启启动模式。auditd会将 许多selinux信息记录下来,而不只是错误信息。由于其文档庞大,selinux提供了一个audit2why的指令来让我们查询错误信息。
audit2why < /var/log/audit/audit.log
将登录档内容读进来分析,并输出分析结果。
type=AVC msg=audit(1237799959.349:355): avc: denied { getattr } for pid=24094 comm="httpd" path="/var/www/html/index.html" dev=hda2 ino=654685 scontext=root:s ystem_r:httpd_t:s0 tcontext=root:object_r:user_home_t:s0 tclass=file Was caused by: Missing or disabled TE allow rule. Allow rules may exist but be disabled by boolean settings; check boolean settings. You can see the necessary allow rules by running audit2allow with this audit message as input.
用法和输出如上,比较有趣的是那个AVC,access vector cache 的缩写,目的是记录所有和selinux有关的存取统计资料,输出的信息也有错误发生的原因,type不符。
推荐 setroubleshoot
-------------------
selinux 的策略和rule 管理
查看targeted 策略,该策略提供多少相关规则? seinfo 命令
seinfo [-Atrub]
-A:列出SElinux的状态,规则布尔值,身份识别,角色,类别等信息
-t:列出selinux的所有类别type
-r:列出所有的role种类
-u:列出所有的身份识别user种类
-b:列出所有规则的布尔值
-------------
seinfo -b | grep httpd
Rule loading disabled
allow_httpd_mod_auth_pam
allow_httpd_bugzilla_script_anon_write
httpd_enable_ftp_server
···
如上可以看到和httpd相关的布尔值,若想找到httpd的selinux 的 security context,可以使用seinfo -t | grep httpd 查询
查询到相关的type和布尔值后,若想知道详细的规则,可以使用sesearch指令
sesearch [-a] [-s 主体类别] [-t 目标类别] [-b 布尔值]
-a :列出该类别或布尔值的所有相关信息
-t:接目标类别,例如 -t httpd_t
-b:接布尔值的规则,例如 -b httpd_enable_ftp_server
——————————————
例如 找出目标资源 httpd_sys_content_t的有关信息
sesearch -a -t httpd_sys_content_t
Found 74 av rules:
allow readahead_t httpd_sys_content_t : file { ioctl read getattr lock };
allow readahead_t httpd_sys_content_t : dir { ioctl read getattr lock
search };
···
「allow 主体程序安全性本文类别 目标档案安全性本文类别」
#如上说明这个类别可以被那个主体程序的类别所读取,以及目标档案资源的格式;从上面我们也可以查到
某个主体程序subjec 可以读取的目标资源object;httpd可以读取 httpd_sys_content_t;
——————————————
查看某个布尔值
sesearch -b httpd_enable_homedirs -a
Found 21 av rules:
allow httpd_t user_home_dir_t : dir { getattr search };
allow httpd_t cifs_t : file { ioctl read getattr lock };
allow httpd_t cifs_t : dir { ioctl read getattr lock search };
···
布尔值的设定里面规范了很多主体程序和目标档案资源的放行与否,其实实际规范这些规则就是这些布尔值。
主体程序能否对目标档案进行存取,与布尔值有关。布尔值可以将规则设定成启动或者关闭 1/0;
————————————————
由seinfo和sesearch的输出信息,实际的策略数据存放在/etc/selinux/targeted/policy/
------------
查看系统se布尔值,
getsebool [-a] [布尔值列表]
-a:列出系统上所有的布尔值列表,开闭情况
例如 getsebool -a
NetworkManager_disable_trans --> off
allow_console_login --> off
allow_cvs_read_shadow --> off
allow_daemons_dump_core --> on
···
修改se布尔值
setsebool [-P] 布尔值=[0|1]
-P:直接将设定值写入配置文件,该设定值程序重新读取会生效;
setsebool -P httpd_enable_homedirs=0
_________
查看目录默认的security context
semanage {login|user|port|interface|fcontext|translation} -l
semanage fcontext -{a|d|m} [-frst] file_spec
选项和参数:
fcontext :主要用在security context的用途, -l 为查询的意思;
-a :增加的意思,你可以增加一些目录的默认 security context 设定;
-m :修改的意思;
-d :删除的意思。
semanage fcontext -l
SELinux fcontext type Context
/var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
...
添加 public_content_t 类型给到指定的目录
semanage fcontext -a -t public_content_t "/srv/samba(/.*)?"
本文深入解析SELinux的概念、工作原理及配置方法。涵盖安全上下文、策略管理、布尔值设置等内容。

2369

被折叠的 条评论
为什么被折叠?



