一、SELinux简介
SELinux(Secure Enhanced Linux)安全增强的Linux是由美国国家安全局NSA针对计算机基础结构安全开发的一个全新的Linux安全策略机制。SELinux可以允许系统管理员更加灵活的来定义安全策略。
SELinux是一个内核级别的安全机制,从Linux2.6内核之后就将SELinux集成在了内核当中,因为SELinux是内核级别的,所以我们对于其配置文件的修改都是需要重新启动操作系统才能生效的。
现在主流发现的Linux版本里面都集成了SELinux机制,CentOS/RHEL都会默认开启SELinux机制。
二、SELinux基本概念
我们知道,操作系统的安全机制其实就是对两样东西做出限制:进程和系统资源(文件、网络套接字、系统调用等)。
在之前学过的知识当中,Linux操作系统是通过用户和组的概念来对我们的系统资源进行限制,我们知道每个进程都需要一个用户才能执行。
在SELinux当中针对这两样东西定义了两个基本概念:域(domin)和上下文(context)。
域就是用来对进行进行限制,而上下文就是对系统资源进行限制。
我们可以通过 ps -Z 这命令来查看当前进程的域的信息,也就是进程的SELinux信息:
[root@xiaoluo ~]# ps -Z LABEL PID TTY TIME CMD unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 2503 pts/0 00:00:00 su unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 2511 pts/0 00:00:00 bash unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 3503 pts/0 00:00:00 ps
通过 ls -Z 命令我们可以查看文件上下文信息,也就是文件的SELinux信息:
[root@xiaoluo ~]# ls -Z -rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Desktop -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
在稍后我们来探讨一下这些字段所代表的含义。
三、策略
在SELinux中,我们是通过定义策略来控制哪些域可以访问哪些上下文。
在SELinux中,预置了多种的策略模式,我们通常都不需要自己去定义策略,除非是我们自己需要对一些服务或者程序进行保护
在CentOS/RHEL中,其默认使用的是目标(target)策略,那么何为目标策略呢?
目标策略定义了只有目标进程受到SELinux限制,非目标进程就不会受到SELinux限制,通常我们的网络应用程序都是目标进程,比如httpd、mysqld,dhcpd等等这些网络应用程序。
我们的CentOS的SELinux配置文件是存放在 /etc/sysconfig/ 目录下的 selinux 文件,我们可以查看一下里面的内容:
[root@xiaoluo ~]# cat /etc/sysconfig/selinux # 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 - No SELinux policy is loaded. SELINUX=enforcing # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted // 我们的CentOS使用的策略就是目标策略
四、SELinux模式
SELinux的工作模式一共有三种 enforcing、permissive和disabled
①enforcing 强制模式:只要是违反策略的行动都会被禁止,并作为内核信息记录
②permissive 允许模式:违反策略的行动不会被禁止,但是会提示警告信息
③disabled 禁用模式:禁用SELinux,与不带SELinux系统是一样的,通常情况下我们在不怎么了解SELinux时,将模式设置成disabled,这样在访问一些网络应用时就不会出问题了。
上面也说了SELinux的主配置文件是 /etc/sysconfig/selinux
[root@xiaoluo ~]# cat /etc/sysconfig/selinux # 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 - No SELinux policy is loaded. SELINUX=enforcing // 我们看到SELinux默认的工作模式是enforcing # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted
我们SELinux默认的工作模式是enforcing,我们可以将其修改为 permissive或者是disabled
我们如果要查看当前SELinux的工作状态,可以使用 getenforce 命令来查看:
[root@xiaoluo ~]# getenforce Enforcing
当前的工作模式是 enforcing,我们如果要设置当前的SELinux工作状态,可以使用 setenforce [0|1] 命令来修改,setenforce 0表示设置成 permissive,1表示enforcing
【注意:】通过 setenforce 来设置SELinux只是临时修改,当系统重启后就会失效了,所以如果要永久修改,就通过修改SELinux主配置文件
[root@xiaoluo ~]# setenforce 0 [root@xiaoluo ~]# getenforce Permissive [root@xiaoluo ~]# setenforce 1 [root@xiaoluo ~]# getenforce Enforcing
[root@xiaoluo ~]# ls -Z -rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Desktop -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
我们可以通过 ls -Z 这个命令来查看我们文件的上下文信息,也就是SELinux信息,我们发现其比传统的 ls 命令多出来了 system_u:object_r:admin_home_t:s0 这个东西,我们现在就来分析一下这段语句所代表的含义
system_u:object_r:admin_home_t:s0 这条语句通过:划分成了四段,第一段 system_u 代表的是用户,第二段 object_r 表示的是角色,第三段是SELinux中最重要的信息,admin_home 表示的是类型,最后一段 s0 是跟MLS、MCS相关的东西,暂时不需要管
①system_u 指的是SElinux用户,root表示root账户身份,user_u表示普通用户无特权用户,system_u表示系统进程,通过用户可以确认身份类型,一般搭配角色使用。身份和不同的角色搭配时有权限不同,虽然可以使用su命令切换用户但对于SElinux的用户并没有发生改变,账户之间切换时此用户身份不变,在targeted策略环境下用户标识没有实质性作用。
②object_r object_r一般为文件目录的角色、system_r一般为进程的角色,在targeted策略环境中用户的角色一般为system_r。用户的角色类似用户组的概念,不同的角色具有不同的身份权限,一个用户可以具备多个角色,但是同一时间只能使用一个角色。在targeted策略环境下角色没有实质作用,在targeted策略环境中所有的进程文件的角色都是system_r角色。
③admin_home 文件和进程都有一个类型,SElinux依据类型的相关组合来限制存取权限。
五、SELinux的策略与规则管理相关命令
SELinux的策略与规则管理相关命令:seinfo命令、sesearch命令、getsebool命令、setsebool命令、semanage命令。
1、setinfo命令
语法seinfo(选项)选项-A:列出SELinux的状态、规则布尔值、身份识别、角色、类型等所有信息。-t:列出SELinux所有类型(type)的种类。-r:列出SELinux所有角色(role)的种类。-u:列出SELinux所有身份识别(user)的种类。-b:列出所有规则的种类(布尔值)。实例列出与httpd有关的规则:seinfo -b | grep httpd
来自: http://man.linuxde.net/seinfo
语法seinfo(选项)选项-A:列出SELinux的状态、规则布尔值、身份识别、角色、类型等所有信息。-t:列出SELinux所有类型(type)的种类。-r:列出SELinux所有角色(role)的种类。-u:列出SELinux所有身份识别(user)的种类。-b:列出所有规则的种类(布尔值)。实例列出与httpd有关的规则:seinfo -b | grep httpd
来自: http://man.linuxde.net/seinfo
语法seinfo(选项)选项-A:列出SELinux的状态、规则布尔值、身份识别、角色、类型等所有信息。-t:列出SELinux所有类型(type)的种类。-r:列出SELinux所有角色(role)的种类。-u:列出SELinux所有身份识别(user)的种类。-b:列出所有规则的种类(布尔值)。实例列出与httpd有关的规则:seinfo -b | grep httpd
来自: http://man.linuxde.net/seinfo
语法
seinfo(选项) 来自: http://man.linuxde.net/seinfo
seinfo(选项) 来自: http://man.linuxde.net/seinfo
setinfo (选项)
选项
-a:列出该类型或布尔值的所有相关信息
-A:列出SELinux的状态、规则布尔值、身份识别、角色、类型等所有信息。 -t:列出SELinux所有类型(type)的种类。 -r:列出SELinux所有角色(role)的种类。 -u:列出SELinux所有身份识别(user)的种类。 -b:列出所有规则的种类(布尔值)。
来自: http://man.linuxde.net/seinfo-a:列出该类型或布尔值的所有相关信息
-t:后面还要接类型,例如 -t httpd_t -b:后面还要接布尔值的规则,例如 -b httpd_enable_ftp_serve
实例
列出与httpd有关的规则:
setinfo -b |grep httpd
2、sesearch命令
语法seinfo(选项)选项-A:列出SELinux的状态、规则布尔值、身份识别、角色、类型等所有信息。-t:列出SELinux所有类型(type)的种类。-r:列出SELinux所有角色(role)的种类。-u:列出SELinux所有身份识别(user)的种类。-b:列出所有规则的种类(布尔值)。实例列出与httpd有关的规则:seinfo -b | grep httpd
来自: http://man.linuxde.net/seinfo
语法seinfo(选项)选项-A:列出SELinux的状态、规则布尔值、身份识别、角色、类型等所有信息。-t:列出SELinux所有类型(type)的种类。-r:列出SELinux所有角色(role)的种类。-u:列出SELinux所有身份识别(user)的种类。-b:列出所有规则的种类(布尔值)。实例列出与httpd有关的规则:seinfo -b | grep httpd
来自: http://man.linuxde.net/seinfo
语法seinfo(选项)选项-A:列出SELinux的状态、规则布尔值、身份识别、角色、类型等所有信息。-t:列出SELinux所有类型(type)的种类。-r:列出SELinux所有角色(role)的种类。-u:列出SELinux所有身份识别(user)的种类。-b:列出所有规则的种类(布尔值)。实例列出与httpd有关的规则:seinfo -b | grep httpd
来自: http://man.linuxde.net/seinfo
语法
seinfo(选项) 来自: http://man.linuxde.net/seinfo
seinfo(选项) 来自: http://man.linuxde.net/seinfo
sesearch [-a] [-s 主体类型] [-t 目标类型] [-b 布尔值]
选项
-A:列出SELinux的状态、规则布尔值、身份识别、角色、类型等所有信息。 -t:列出SELinux所有类型(type)的种类。 -r:列出SELinux所有角色(role)的种类。 -u:列出SELinux所有身份识别(user)的种类。 -b:列出所有规则的种类(布尔值)。 来自: http://man.linuxde.net/seinfo
-A:列出SELinux的状态、规则布尔值、身份识别、角色、类型等所有信息。
-t:列出SELinux所有类型
-r:列出SELinux所有角色(role)的种类。 -u:列出SELinux所有身份识别(user)的种类。 -b:列出所有规则的种类(布尔值)。
实例
找出目标文件资源类型为httpd_sys_content_t的有关信息:
sesearch -a -t httpd_sys_conten_t
找出主体进程为httpd_t且目标文件类型为httpd相关的所有信息
sesearch -s httpd_t -t httpd_* -a
3、getsebool命令
语法
getsebool [-a] [布尔值条款]
选项
-a:列出目前系统上面的所有布尔值条款设置为开启或关闭值。
实例
查询本系统内所有的布尔值设置状况:
getsebool -a NetworkManager_disable_trans --> off allow_console_login --> off allow_cvs_read_shadow --> off allow_daemons_dump_core --> on ....(底下省略)....
查询httpd_enable_homedirs是否为关闭,若没关闭,请关闭它:
getsebool httpd_enable_homedirs setsebool -P httpd_enable_homedirs=0 //0是关闭 1是开启
4、setsebool命令
语法
setsebool [-P] 布尔值=[0|1]
选项
-P:直接将设置值写入配置文件,该设置数据将来会生效的。
实例
允许vsvtp匿名用户写入权限:
setsebool -P allow_ftpd_anon_write=1
如果你希望你的ftp用户可以访问自己的家目录的话,需要开启:
setsebool -P ftp_home_dir 1
如果你希望将vsftpd以daemon的方式运行的话,需要开启:
setsebool -P ftpd_is_daemon 1
HTTP被设置允许cgi的设置:
setsebool -P httpd_enable_cgi 1
允许用户HHTP访问其家目录,该设定限仅于用户的家目录主页:
setsebool -P httpd_enable_homedirs 1 chcon -R -t httpd_sys_content_t ~user/public_html
允许httpd访问终端:
setsebool -P httpd_tty_comm 1
关闭Selinux的关于httpd进程守护的保护:
setsebool -P httpd_disable_trans 1 service httpd restart
关于named、master更新selinux设定:
setsebool -P named_write_master_zones 1
关闭named的进程守护保护:
setsebool -P named_disable_trans 1 service named restart
Selinux将本机的NFS共享设置成只读:
setsebool -P nfs_export_all_ro 1
SElinux将本机的NFS共享设置成可读可写:
setsebool -P nfs_export_all_rw 1
如果你想要将远程NFS的家目录共享到本机,需要开启:
setsebool -P use_nfs_home_dirs 1
如果samba服务器共享目录给多个域,则需要:
setsebool -P allow_smbd_anon_write=1
samba服务器要共享家目录时:
setsebool -P samba_enable_home_dirs 1
如果你需在本机上使用远程samba服务器的家目录:
setsebool -P use_samba_home_dirs 1
关闭selinux关于samba的进程守护的保护:
setsebool -P smbd_disable_trans 1 service smb restart
允许rsync其他用户写入时:
setsebool -P allow_rsync_anon_write=1
允许系统使用kerberos:
setsebool -P rsync_disable_trans 1
系统工作在nis环境时:
setsebool -P allow_ypbind 1
5、semanage命令
语法
semanage {login|user|port|interface|fcontext|translation} -l semanage fcontext -{a|d|m} [-frst] file_spec
选项
--l:查询。 fcontext:主要用在安全上下文方面。 -a:增加,你可以增加一些目录的默认安全上下文类型设置。 -m:修改。 -d:删除。
实例
查询一下/var/www/html的默认安全性本文的设置:
semanage fcontext -l SELinux fcontext type Context ....(前面省略).... /var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0 ....(後面省略)....
如上面例子所示,我们可以查询的到每个目录的安全性本文!而目录的设定可以使用正则表达式去指定一个范围。那么如果我们想要增加某些自定义目录的安全性本文呢?举例来说,我想要色设置/srv/samba成为public_content_t内联代码的类型时,应该如何设置呢?
用semanage命令设置/srv/samba目录的默认安全性本文为public_content_t:
chcon -t public_content_rw_t /var/ftp/incoming
允许用户HHTP访问其家目录,该设定限仅于用户的家目录主页:
mkdir /srv/samba ll -Zd /srv/samba drwxr-xr-x root root root:object_r:var_t /srv/samba
如上所示,默认的情况应该是var_t这个咚咚的!
semanage fcontext -l | grep '/srv' /srv/.* all files system_u:object_r:var_t:s0 /srv/([^/]*/)?ftp(/.*)? all files system_u:object_r:public_content_t:s0 /srv/([^/]*/)?www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0 /srv/([^/]*/)?rsync(/.*)? all files system_u:object_r:public_content_t:s0 /srv/gallery2(/.*)? all files system_u:object_r:httpd_sys_content_t:s0 /srv directory system_u:object_r:var_t:s0 //看这里!
上面则是默认的/srv底下的安全性本文资料,不过,并没有指定到/srv/samba。
semanage fcontext -a -t public_content_t "/srv/samba(/.*)?" semanage fcontext -l | grep '/srv/samba' /srv/samba(/.*)? all files system_u:object_r:public_content_t:s0
cat /etc/selinux/targeted/contexts/files/file_contexts.local # This file is auto-generated by libsemanage # Please use the semanage command to make changes /srv/samba(/.*)? system_u:object_r:public_content_t:s0 #写入这个档案
restorecon -Rv /srv/samba* #尝试恢复默认值 ll -Zd /srv/samba drwxr-xr-x root root system_u:object_r:public_content_t /srv/samba/ #有默认值,以后用restorecon命令来修改比较简单!