Identify:role:type
身份识别:角色:类型 关于这三个参数的说明: ·身份识别 (Identify): 相当于帐号方面的身份识别! root:表示 root 的帐号身份 system_u:表示系统程序方面的识别,通常就是程序; user_u:代表的是一般使用者帐号相关的身份。 ·角色 (Role): 通过角色栏,我们可以知道这个资料是属于程序、文件资料还是代表使用者。一般的角色有: object_r:代表的是文件或者目录; system_r:代表的就是程序或者一般使用者也会被指定成为 system_r ! 【重点】在预设的 targeted 政策中, Identify 与 Role 栏位基本上是不重要的!重要的在于这个类型 (type) 栏位! 基本上,一个主体程序能不能读取到这个文件资源,与类型栏位有关!而类型栏位在文件与程序的定义不太相同。 ·类型(type)很重要,它有两种叫法,但实为同一物! type:在文件资源 (Object) 上面称为类型 (Type); DAC中的rwx domain:在主体程序 (Subject) 则称为领域 (domain) 了! MAC中的权限 【重要】domain 需要与 type 搭配,则该程序才能够顺利的读取文件资源啦! [root@master oracle]# ll -Zd /usr/sbin/httpd -rwxr-xr-x root root system_u:object_r:httpd_exec_t /usr/sbin/httpd 【说明】:既然说type很重要,/usr/sbin/httpd的type是什么呢?就是httpd_exec_t 这说明httpd程序对该文件有执行权限!相当于文件上的x权限!! 三、SELinux 的启动、关闭与查看1,并非所有的 Linux distributions 都支持 SELinux 的目前 SELinux 支持三种模式,分别如下: ·enforcing:强制模式,代表 SELinux 运作中,且已经正确的开始限制 domain/type 了; ·permissive:宽容模式:代表 SELinux 运作中,不过仅会有警告讯息并不会实际限制 domain/type 的存取。这种模式可以运来作为 SELinux 的 debug 之用; ·disabled:关闭,SELinux 并没有实际运作。 2,查看SELinux的模式# getenforce Enforcing <==就显示出目前的模式为 Enforcing 3,查看 SELinux 的政策 (Policy)?[root@master oracle]# sestatusSELinux status: enabled <==是否启动 SELinux
SELinuxfs mount: /selinux <==SELinux 的相关文件资料挂载点
Current mode: enforcing <==目前的模式
Mode from config file: enforcing <==设定档指定的模式
Policy version: 21
Policy from config file: targeted <==目前的政策为何? 4,通过配置文件调整SELinux的参数[root@www ~]# vi /etc/selinux/configSELINUX=enforcing <==调整 enforcing|disabled|permissiveSELINUXTYPE=targeted <==目前仅有 targeted 与 strict 5,SELinux 的启动与关闭【重要常识】上面是预设的政策与启动的模式!你要注意的是,如果改变了政策则需要重新开机;如果由 enforcing 或 permissive 改成 disabled ,或由 disabled 改成其他两个,那也必须要重新开机。这是因为 SELinux 是整合到核心里面去的, 你只可以在 SELinux 运作下切换成为强制 (enforcing) 或宽容 (permissive) 模式,不能够直接关闭 SELinux 的! 同时,由 SELinux 关闭 (disable) 的状态到开启的状态也需要重新开机啦!所以,如果刚刚你发现 getenforce 出现 disabled 时, 请到上述文件修改成为 enforcing 吧! 【重点】如果要启动SELinux必须满足以下两个点: 所以,如果你要启动 SELinux 的话,请将上述的 SELINUX=enforcing 设定妥当,并且指定 SELINUXTYPE=targeted 这一个设定, 并且到 /boot/grub/menu.lst 这个文件去,看看核心有无关闭 SELinux 了呢?[root@www ~]# vi /boot/grub/menu.lst
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-92.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quiet selinux=0
initrd /initrd-2.6.18-92.el5.img
# 如果要启动 SELinux ,则不可以出现 selinux=0 的字样在 kernel 后面! 【问题】通过上面的学习我们知道,如果将启动着的SELinux改为禁用,需要重启电脑,我们不想重启电脑又不想开启SELinux该怎么办呢? 【答案】将强制模式改为宽松模![root@www ~]# setenforce [0|1]
选项与参数:
0 :转成 permissive 宽容模式;
1 :转成 Enforcing强制模式
范例一:将 SELinux 在 Enforcing 与 permissive 之间切换与查看
[root@www ~]# setenforce 0
[root@www ~]# getenforce
Permissive
[root@www ~]# setenforce 1
[root@www ~]# getenforce
Enforcing 6,查看已启动程序的type设定[root@master oracle]# ps aux -Z LABEL USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND system_u:system_r:init_t root 1 0.0 0.4 2060 520 ? Ss May07 0:02 init [5 system_u:system_r:kernel_t root 2 0.0 0.0 0 0 ? S< May07 0:00 [migra] system_u:system_r:kernel_t root 11 0.0 0.0 0 0 ? S< May07 0:00 [kacpi] system_u:system_r:auditd_t root 4022 0.0 0.4 12128 560 ? S<sl May07 0:01 auditd system_u:system_r:auditd_t root 4024 0.0 0.4 13072 628 ? S<sl May07 0:00 /sbin/a system_u:system_r:restorecond_t root 4040 0.0 4.4 10284 5556 ? Ss May07 0:00 /usr/sb 说明:其实这些东西我们都不用管,都是SELinux内置的。只要学会在强制和宽松模式间转换就行了! 1.1 SElinux概述 SELinux(Security-Enhanced Linux) 是美国国家安全局(NAS)对于强制访问控 制的实现,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。大部分使用 SELinux 的人使用的都是SELinux就绪的发行版,例如 Fedora、Red Hat Enterprise Linux (RHEL)、Debian 或 Gentoo。它们都是在内核中启用 SELinux 的,并且提供一个可定制的安全策略,还提供很多用户层的库和工具,它们都可以使用 SELinux 的功能。 1.1.1 SElinux特点 1.MAC 对访问的控制彻底化,对所有的文件、目录、端口的访问都是基于策略设定的,可由管理员时行设定。 2.RBAC 对于用户只赋予最小权限。用户被划分成了一些role(角色),即使是 root用户,如果不具有sysadm_r角色的话,也不是执行相关的管理。哪里role可以执行哪些domain,也是可以修改的。 3. 安全上下文 当启动selinux的时候,所有文件与对象都有安全上下文。进程的安全上下文是域,安全上下文由用户:角色:类型表示。 (1)系统根据pam子系统中的pam_selinux.so模块设定登录者运行程序的安全上下文 (2)rpm包安装会根据rpm 包内记录来生成安全上下文, (3)如果是手工他建的,会根据policy中规定来设置安全上下文, (4)如果是cp,会重新生成安全上下文。 (5)如果是mv,安全上下文不变。 1.1.2 安全上下文格式 安全上下文由 user:role:type三部分组成,下面分别说明其作用: 1.user identity:类似 linux系统中的UID,提供身份识别,安全上下文中的一部分。 三种常见的user: user_u-: 普通用户登录系统后预设; system_u-: 开机过程中系统进程的预设; root-: root登录后预设; 在targeted policy中users不是很重要; 在strict policy中比较重要,的有预设的selinux users都以 "_u"结尾,root除外。 2.role 文件与目录的role,通常是object_r; 程序的role,通常是system_r; 用户的role,targeted policy为system_r; strict policy为sysadm_r,staff_r,user_r 用户的role,类似于系统中的GID,不同的角色具备不同的权限;用户可以具备多个role;但是同一时间内只能使用一role; role是RBAC的基础; 3.type type: 用来将主体与客体划分为不同的组,组每个主体和系统中的客体定义了一个类型;为进程运行提供最低的权限环境。 当一个类型与执行的进程关联时,该 type也称为domain,也叫安全上下文。 域或安全上下文是一个进程允许操作的列表,决字一个进程可以对哪种类型进行操作。 1.1.3 SElinux配置文件 vi /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - SELinux is fully disabled. SELINUX=enforcing #SELINUX=disabled # SELINUXTYPE= type of policy in use. Possible values are: # targeted - Only targeted network daemons are protected. # strict - Full SELinux protection. SELINUXTYPE=targeted #SELINUX有「disabled」「permissive」,「enforcing」3种选择。 1.模式的设置 enforcing: 强制模式,只要selinux不允许,就无法执行 permissive:警告模式,将该事件记录下来,依然允许执行 disabled:关闭selinux;停用,启用需要重启计算机。 2.策略的设置 targeted:保护常见的网络服务,是selinux的默认值; stric: 提供RBAC的policy,具备完整的保护功能,保护网络服务,一般指令及应用程序。 策略改变后,需要重新启动计算机。 也可以通过命令来修改相关的具体的策略值,也就是修改安全上下文,来提高策略的灵活性。 3.策略的位置 /etc/selinux/<策略名>/policy/ 1.2 SElinux命令介绍 1.2.1 查询SElinux状态命令 1.查询selinux状态 [root@redhat ~]# sestatus SELinux status: enabled SELinuxfs mount: /selinux Current mode: enforcing Mode from config file: enforcing Policy version: 21 Policy from config file: targeted 2.查询selinux激活状态 [root@redhat ~]# selinuxenabled [root@redhat ~]# echo $? 0 如果为-256为非激活状态。 1.2.2 切换SElinux类型 1.切换成警告模式 [root@redhat ~]# setenforce 0或setenforce permissive [root@redhat ~]# sestatus SELinux status: enabled SELinuxfs mount: /selinux Current mode: permissive Mode from config file: enforcing Policy version: 21 Policy from config file: targeted 或 [root@redhat ~]# getenforce Permissive 2.切换成强制模式 [root@redhat ~]# setenforce 1 [root@redhat ~]# getenforce Enforcing 注:使用setenforce切换enforcing与permissive模式不需要重启计算机。 1.2.3 检查安全上下文 1.检查帐号的安全上下文 [root@redhat ~]# id -Z root:system_r:unconfined_t:SystemLow-SystemHigh 2.检查进程的安全上下文 [root@redhat home]# ps -Z LABEL PID TTY TIME CMD root:system_r:unconfined_t:SystemLow-SystemHigh 2383 pts/0 00:00:00 bash root:system_r:unconfined_t:SystemLow-SystemHigh 2536 pts/0 00:00:00 ps 3.检查文件与目录的安全上下文 [root@redhat home]# ls -Z drwx------ tom tom system_u:object_r:user_home_dir_t tom 1.2.4 修改文件/目录安全上下文与策略 1.chcon命令 chcon -u [user] 对象 -r [role] -t [type] -R 递归 示例: chcon -R -t samba_share_t /tmp/abc 注:安全上下文的简单理解说明,受到selinux保护的进程只能访问标识为自己只够访问的安全上下文的文件与目录。 例如:上面解释为使用smb进程能够访问/tmp/abc目录而设定的安全上下文。 2.getsebool命令 获取本机selinux策略值,也称为bool值。 getsebool -a 命令同sestatus -b [root@redhat files]# getsebool -a NetworkManager_disable_trans --> off allow_cvs_read_shadow --> off allow_daemons_dump_core --> on allow_daemons_use_tty --> off allow_execheap --> off allow_execmem --> on allow_execmod --> off allow_execstack --> on allow_ftpd_anon_write --> off /*是否允许ftp匿名访问*/ allow_ftpd_full_access --> off ... httpd_disable_trans --> off /*只要有disable_trans关闭保护*/ 说明:selinux的设置一般通过两个部分完成的,一个是安全上下文,另一个是策略,策略值是对安全上下文的补充。 3.setsebool命令 setsebool -P allow_ftpd_anon_write=1 -P 是永久性设置,否则重启之后又恢复预设值。 示例: [root@redhat files]# setsebool -P allow_ftpd_anon_write=1 [root@redhat files]# getsebool allow_ftpd_anon_write allow_ftpd_anon_write --> on 说明:如果仅仅是安全上下文中设置了vsftpd进程对某一个目录的访问,配置文件中也允许可写,但是selinux中策略中不允许可写,仍然不可写。所以基于selinux保护的服务中,安全性要高于很多。 1.3 SElinux应用 selinux的设置分为两个部分,修改安全上下文以及策略,下面收集了一些应用的安全上下文,供配置时使用,对于策略的设置,应根据服务应用的特点来修改相应的策略值。 1.3.1 SElinux与samba 1.samba共享的文件必须用正确的selinux安全上下文标记。 chcon -R -t samba_share_t /tmp/abc 如果共享/home/abc,需要设置整个主目录的安全上下文。 chcon -R -r samba_share_t /home 2.修改策略(只对主目录的策略的修改) setsebool -P samba_enable_home_dirs=1 setsebool -P allow_smbd_anon_write=1 getsebool 查看 samba_enable_home_dirs -->on allow_smbd_anon_write --> on /*允许匿名访问并且可写*/ 1.3.2 SElinux与nfs selinux对nfs的限制好像不是很严格,默认状态下,不对 nfs的安全上下文进行标记,而且在默认状态的策略下,nfs的目标策略允许nfs_export_all_ro nfs_export_all_ro nfs_export_all_rw 值为0 所以说默认是允许访问的。 但是如果共享的是/home/abc的话,需要打开相关策略对home的访问。 setsebool -P use_nfs_home_dirs boolean 1 getsebool use_nfs_home_dirs 1.3.3 SElinux与ftp 1.如果ftp为匿名用户共享目录的话,应修改安全上下文。 chcon -R -t public_content_t /var/ftp chcon -R -t public_content_rw_t /var/ftp/incoming 2.策略的设置 setsebool -P allow_ftpd_anon_write =1 getsebool allow_ftpd_anon_write allow_ftpd_anon_write--> on 1.3.4 SElinux与http apache的主目录如果修改为其它位置,selinux就会限制客户的访问。 1.修改安全上下文: chcon -R -t httpd_sys_content_t /home/html 由于网页都需要进行匿名访问,所以要允许匿名访问。 2.修改策略: setsebool -P allow_ftpd_anon_write = 1 setsebool -P allow_httpd_anon_write = 1 setsebool -P allow_<协议名>_anon_write = 1 关闭selinux对httpd的保护 httpd_disable_trans=0 1.3.5 SElinux与公共目录共享 如果ftp,samba,web都访问共享目录的话,该文件的安全上下文应为: public_content_t public_content_rw_t 其它各服务的策略的bool值,应根据具体情况做相应的修改。 1.3.6 SElinux配置总结 以上内容的selinux的配置实验还需要进行相关验证,以便在实际环境中能够直接应用,相关的内容还需要继续补充。 对于多于牛毛的策略,可以用过滤还查看一个服务相当开启哪些策略。 ====================================================================