chcon

chcon命令是修改对象(文件)的安全上下文,比如:用户、角色、类型、安全级别。也就是将每个文件的安全环境变更至指定环境。使用--reference选项时,把指定文件的安全环境设置为与参考文件相同。chcon命令位于/usr/bin/chcon

语法

chcon [选项]... 环境 文件...
chcon [选项]... [-u 用户] [-r 角色] [-l 范围] [-t 类型] 文件...
chcon [选项]... --reference=参考文件 文件...

选项

-h, --no-dereference:影响符号连接而非引用的文件。
    --reference=参考文件:使用指定参考文件的安全环境,而非指定值。
-R, --recursive:递归处理所有的文件及子目录。
-v, --verbose:为处理的所有文件显示诊断信息。
-u, --user=用户:设置指定用户的目标安全环境。
-r, --role=角色:设置指定角色的目标安全环境。
-t, --type=类型:设置指定类型的目标安全环境。
-l, --range=范围:设置指定范围的目标安全环境。

以下选项是在指定了-R选项时被用于设置如何穿越目录结构体系。如果您指定了多于一个选项,那么只有最后一个会生效。

-H:如果命令行参数是一个通到目录的符号链接,则遍历符号链接。
-L:遍历每一个遇到的通到目录的符号链接。
-P:不遍历任何符号链接(默认)。
--help:显示此帮助信息并退出。
--version:显示版本信息并退出。

实例

如果你想把这个ftp共享给匿名用户的话,需要开启以下:

chcon -R -t public_content_t /var/ftp

如果你想让你设置的FTP目录可以上传文件的话,SELINUX需要设置:

chcon -t public_content_rw_t /var/ftp/incoming

允许用户HHTP访问其家目录,该设定限仅于用户的家目录主页:

setsebool -P httpd_enable_homedirs 1
chcon -R -t httpd_sys_content_t ~user/public_html

如果你希望将samba目录共享给其他用户,你需要设置:

chcon -t samba_share_t /directory

共享rsync目录时:

chcon -t public_content_t /directories

seinfo

seinfo命令是用来查询SELinux的策略提供多少相关规则,一个主体进程能否读取到目标文件资源的重点是在于SELinux的策略以及策略内的各项规则,然后再通过该规则的定义去处理各项目标文件的安全上下文,尤其是“类型”部分。SELinux的策略与规则管理相关命令:seinfo命令、sesearch命令、getsebool命令、setsebool命令、semanage命令。

语法

seinfo(选项)

选项

-A:列出SELinux的状态、规则布尔值、身份识别、角色、类型等所有信息。
-t:列出SELinux所有类型(type)的种类。
-r:列出SELinux所有角色(role)的种类。
-u:列出SELinux所有身份识别(user)的种类。
-b:列出所有规则的种类(布尔值)。

实例

列出与httpd有关的规则:

seinfo -b | grep httpd

sesearch

使用seinfo命令可以查询SELinux的策略提供多少相关规则,如果查到的相关类型或者布尔值,想要知道详细规则时,使用sesearch命令查询。SELinux的策略与规则管理相关命令:seinfo命令、sesearch命令、getsebool命令、setsebool命令、semanage命令。

语法

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

找出主体进程为httpd_t且目标文件类型为httpd相关的所有信息:

sesearch -s httpd_t -t httpd_* -a

查看布尔值httpd_enable_homedirs设置了多少规则

sesearch -b httpd_enable_homedirs -a

getsebool

getsebool命令是用来查询SElinux策略内各项规则的布尔值。SELinux的策略与规则管理相关命令:seinfo命令、sesearch命令、getsebool命令、setsebool命令、semanage命令。

语法

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是开启

setsebool

setsebool命令是用来修改SElinux策略内各项规则的布尔值。setsebool命令和getsebool命令是SELinux修改和查询布尔值的一套工具组。SELinux的策略与规则管理相关命令:seinfo命令、sesearch命令、getsebool命令、setsebool命令、semanage命令。

语法

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

你可以让SElinux停止保护vsftpd的daemon方式动行:

setsebool -P ftpd_disable_trans 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

停止rsync的进程保护

setsebool -P rsync_disable_trans 1

允许系统使用kerberos:

setsebool -P allow_kerberos 1

系统工作在nis环境时:

setsebool -P allow_ypbind 1

semanage

semanage命令是用来查询与修改SELinux默认目录的安全上下文。SELinux的策略与规则管理相关命令:seinfo命令、sesearch命令、getsebool命令、setsebool命令、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

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命令来修改比较简单!

semanage命令的功能很多,这里主要用到的仅有fcontext这个选项的用法而已。如上所示,你可以使用semanage来查询所有的目录默认值,也能够使用它来增加默认值的设置!

restorecon

restorecon命令用来恢复SELinux文件属性即恢复文件的安全上下文。

语法

restorecon [-iFnrRv] [-e excludedir ] [-o filename ] [-f filename | pathname...]

选项

-i:忽略不存在的文件。
-f:infilename 文件 infilename 中记录要处理的文件。
-e:directory 排除目录。
-R/-r:递归处理目录。
-n:不改变文件标签。
-o/outfilename:保存文件列表到 outfilename,在文件不正确情况下。
-v:将过程显示到屏幕上。
-F:强制恢复文件安全语境。

实例

假设CentOS安装了apache,网页默认的主目录是/var/www/html,我们经常遇到这样的问题,在其他目录中创建了一个网页文件,然后用mv移动到网页默认目录/var/www/html中,但是在浏览器中却打不开这个文件,这很可能是因为这个文件的SELinux配置信息是继承原来那个目录的,与/var/www/html目录不同,使用mv移动的时候,这个SELinux配置信息也一起移动过来了,从而导致无法打开页面,具体请看下面的实例:

/*使用CentOS举例,如果默认没有安装apache,确保网络连接,使用下面的命令安装*/
[root@linux.9iphp.com ~]# yum install httpd

/*我们在root的家目录新建一个html文件*/
[root@linux.9iphp.com ~]# pwd
/root

[root@linux.9iphp.com ~]# vi index.html

/*随便输入一段文字,保存退出*/
welcome to linux.9iphp.com

/*将这个文件mv到网页默认目录下*/
[root@linux.9iphp.com ~]# mv index.html /var/www/html/

/*
 * 这个时候我们使用firefox浏览器输入127.0.0.1/index.html发现打不开,
 * 查看一下SELinux的日志文件,发现了下面这一段报错信息,从这个报错信息不难看出,
 * 进程httpd访问网页主目录中的index.html时被SELinux阻止,原因是因为,SELinux配置信息不正确,
 * 正确的SELinux配置信息应该是scontext=后面的部分,
 * 而index.html文件的SELinux配置信息却是tcontext=后面的部分,
 * 从tcontext=的第三段“admin_home_t”不难看出,这个文件的SELinux配置信息是root用户家目录的。
 */
type=AVC msg=audit(1378974214.610:465): avc:  denied  { open } for  pid=2359 comm="httpd" path="/var/www/html/index.html" dev="sda1" ino=1317685 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file

/*使用ls -Z也可以看出,文件和目录的SELinux信息不匹配*/
[root@linux.9iphp.com html]# ls -Z /var/www/html/
.... unconfined_u:object_r:admin_home_t:s0 index.html

[root@linux.9iphp.com html]# ls -Zd /var/www/html/
.... system_u:object_r:httpd_sys_content_t:s0 /var/www/html/

/*使用restorecon来恢复网页主目录中所有文件的SELinux配置信息(如果目标为一个目录,可以添加-R参数递归)*/
[root@linux.9iphp.com html]# restorecon -R /var/www/html/