一、SELinux基本概念
SELinux安全的基本概念
Security Enhance Linux
(SELinux)是一个额外的系统安全层。SELinux的主要目标是防止已遭泄露的系统服务访问用户数据。大多数Linux管理员都熟悉标准的用户/组/其他权限安全模式。这种基于用户和组的模型称为自由决定的访问控制。SELinux提供另一层安全,它基于对象并由更加复杂的规则控制,称为强制访问控制。
SELinux安全的基本概念
SElinux是用于确定那个进程可以访问哪些文件、目录和端口的一组安全规则。每个文件、进程和端口都具有特别的安全标签,称为SELinux上下文。上下文是一个名称,SELinux策略使用它来确定某个进程能否访问文件、目录或端口。除非显式规则授予访问权限,否则,默认情况下,策略不允许任何交互。如果没有允许规则,则不允许访问。
SELinux标签具有多种上下文:用户、角色、类型和敏感度。目标策略(即Red Hat Enterprise Linux中启用的默认策略)会根据第三个上下文(即类型上下文)来制定自己的规则。类型上下文名称通常以_t结尾。web服务器的类型上下文是http_t。通常位于/var/www/html中的文件和目录的类型上下文是httpd_sys_content_t。通常位于/tmp和/var/tmp中的文件和目录的类型上下文是tmp_t。web服务器端口类型上下文是http_port_t
二、SELinux模式
若出于故障排除目的的,可使用SElinux模式暂时禁用SELinux保护。需要重新启动系统才能彻底禁用SELinux,或是从禁用模式转为强制模式或许可模式
强制模式
在强制模式中,SELinux主动拒绝访问尝试读取类型上下文为tmp_t的文件的web服务器。在强制模式中,SElinux不仅记录而且提供保护。
许可模式
许可模式通常用于对问题进行故障排除。在许可模式中,即使没有显示规则,SELinux也会允许所有交互,而且会记录它在强制模式中拒绝的那些交互。可使用此模式来暂时允许访问SELinux正在限制的内容。无需重新启动即可在强制模式和许可模式之间相互转换。
在permissive和enforcing模式之间切换不需要重启系统
查看文件的selinux的上下文:
[root@foundation0 acl]# ll -Z test.txt
-rw-rw----+ root root unconfined_u:object_r:user_home_t:s0 test.txt
unconfined_u::身份标示identify
unconfined:不受限的进程用户
system_u:系统用户
object_r:角色role
object_r:
以上规则不会影响selinux的判断
user_home_t:类型type
user_home_t:决定是否受selinxu影响
#ps -eZ
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 4124 pts/2 00:00:00 bash
bash不受selinux限制
system_u:system_r:kernel_t:s0 4995 ? 00:00:00 kworker/0:0
system_u:system_r:kernel_t:s0 4315 ? 00:00:00 kworker/u128:2
这个进程受selinux限制
[root@foundation0 ~]# ps -eZ | grep cron
system_u:system_r:crond_t:s0-s0:c0.c1023 684 ? 00:00:01 crond
system_u:system_r:crond_t:s0-s0:c0.c1023 685 ? 00:00:00 atd
[root@foundation0 ~]# ll -Zd /usr/sbin/crond /etc/crontab /etc/cron.d /var/spool/cron
drwxr-xr-x. root root system_u:object_r:system_cron_spool_t:s0 /etc/cron.d
-rw-r--r--. root root system_u:object_r:system_cron_spool_t:s0 /etc/crontab
-rwxr-xr-x. root root system_u:object_r:crond_exec_t:s0 /usr/sbin/crond
drwx------. root root system_u:object_r:user_cron_spool_t:s0 /var/spool/cron
cron进程只能访问具有crond_t类型的文件或目录,其它文件或目录不能访问
查看selinux是否工作:
[root@foundation0 cron.d]# getenforce
Enforcing#selinux已启动
查看selinux的状态:
[root@foundation0 cron.d]# sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28
临时关闭selinux
[root@foundation0 cron.d]# setenforce 0
[root@foundation0 cron.d]# getenforce
Permissive#会发出警告,但不会阻止访问文件
临时开启selinux
[root@foundation0 cron.d]# setenforce 1
[root@foundation0 cron.d]# getenforce
Enforcing#启动selinux
SELinux配置文件位置:
[root@foundation0 cron.d]# ll /etc/sysconfig/selinux
lrwxrwxrwx. 1 root root 17 Sep 28 2014 /etc/sysconfig/selinux -> ../selinux/config
[root@foundation0 selinux]# pwd
/etc/selinux
[root@foundation0 selinux]# ls
config semanage.conf targeted
三、更改SELinux模式
更改当前SELinux模式
getenforce查看当前SELinux模式
setenforce修改当前的SELinux模式
[root@foundation0 html]# getenforce
Enforcing
[root@foundation0 html]# setenforce 0
[root@foundation0 html]# getenforce
Permissive
[root@foundation0 html]# setenforce 1
[root@foundation0 html]# getenforce
Enforcing
Ø 启动时将参数传递给内核enforcing=0 | 1,0许可模式,1强制模式
[root@foundation0 html]# vim /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="vconsole.keymap=us crashkernel=auto vconsole.font=latarcyrheb-sun16 rhgb quiet enforcing=0"
GRUB_DISABLE_RECOVERY="true"
~ grub2-mkconfig -o /boot/grub2/grub.cfg#应用使用配置文件/boot/grub2/grub.cfg生效
Ø 设置默认SELinux模式:
编辑配置文件/etc/selinux/config
SELINUX=0 | enforcing | permissive
[root@foundation0 html]# cat /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 - No SELinux policy is loaded.
SELINUX=enforcing#修改参数disabled|enforcing|permissive
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted#默认参数,不需要修改
注意:传递SELINUX=和enforcing=内核参数将会覆盖在/etc/selinux/config中指定的任何默认值
四、更改SELinux上下文
初始SELinux上下文
通常,文件父目录的SELinux上下文决定该文件的初始SELinux上下文。父目录的上下文会分配给新建文件。这适用于vim、cp和touch等命令。但是,如果文件是在其他位置创建并且权限得以保留(如使用mv或cp -a),那么原始SELinux上下文将不会发生更改。
实例:
ls -Zd /var/www/html
touch /var/www/html/index.html
ls -Z /var/www/html/index.html
[root@foundation0 html]# ls -Zd /var/www/html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
[root@foundation0 html]# touch index.html
[root@foundation0 html]# ls -Z ./index.html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 ./index.html
通过mv或cp -a复制过来的文件,上下文不会改变:
[root@foundation0 ~]# mv A.txt /var/www/html
[root@foundation0 ~]# ls -Z /var/www/html/A.txt
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /var/www/html/A.txt
[root@foundation0 ~]# cp -a b.txt /var/www/html
[root@foundation0 ~]# ls -Z /var/www/html/b.txt
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /var/www/html/b.txt
更改文件的SELinux上下文
更改文件SELinux上下文命令:chcon和restorecon。
Ø chcon:命令将文件按的上下文更改成已指定为该命令参数的上下文。-t选项经常只用于指定上下文的类型。
Ø restorecon:命令是更改文件或目录的SELinux上下文的首选方法。不同于chcon,使用此命令时,不会明确指定上下文。它使用SELinux策略中的规则来确定应该是那种上下文。
注意:
不应使用chcon来更改文件的SELinux上下文。在明确指定上下文时可能会出错。如果在系统启动时重新标记了其文件系统,文件上下文将会还原为默认上下文
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=范围:设置指定范围的目标安全环境。
手动修改:
[root@foundation0 html]# ll -Z a.txt
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 a.txt
[root@foundation0 html]# chcon -t net_conf_t a.txt
[root@foundation0 html]# ll -Z a.txt
-rw-r--r--. root root unconfined_u:object_r:net_conf_t:s0 a.txt
如果你想把这个ftp共享给匿名用户的话,需要开启以下:
chcon -R -t public_content_t /var/ftp
如果你想让你设置的FTP目录可以上传文件的话,SELINUX需要设置:
chcon -t public_content_rw_t /var/ftp/incoming
允许用户HTTP访问其家目录,该设定限仅于用户的家目录主页:
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
通过参考/srv/testftp/ftp002.txt的上下文来配置/srv/ftp003.txt的上下文
[root@foundation0 testftp]# touch /srv/ftp003.txt
[root@foundation0 testftp]# cd /srv/
[root@foundation0 srv]# ls
ftp003.txt testftp
[root@foundation0 srv]# ll -Z ftp003.txt
-rw-r--r--. root root unconfined_u:object_r:var_t:s0 ftp003.txt
[root@foundation0 srv]# chcon --reference=/srv/testftp/ftp002.txt /srv/ftp003.txt
[root@foundation0 srv]# ll -Z ftp003.txt
-rw-r--r--. root root unconfined_u:object_r:public_content_t:s0 ftp003.txt
定义SELinux默认文件上下文规则
semanager fcontext命令可用于显示或修改restorecon命令用来设置默认文件上下文的规则。它使用扩展正则表达式来指定路径和文件名。fcontext规则中最常用的扩展正则表达式是(/.*)?,这意味着:“(可选)匹配/后跟任意数量的字符”。它将会匹配的表达式前面列出的目录并递归地匹配该目录中的所有内容。
restorecon命令是policycoreutil软件包的一部分;
semanage是policycoreutil-python软件包的一部分。
定义SELinux默认文件上下文规则 强制对目录下的文件进行恢复父目录默认的权限:
restorecon
-R:递归的方式改变文件和目录的上下文标签
-v:显示改变过程
-F:强制设置文件的上下文
-i:忽略不存在的文件。
-f:infilename 文件 infilename 中记录要处理的文件。
-e:directory 排除目录。
-R/-r:递归处理目录。
-n:不改变文件标签。
-o/outfilename:保存文件列表到 outfilename,在文件不正确情况下。
-v:将过程显示到屏幕上。
-F:强制恢复文件安全语境。
[root@foundation0 html]# ls -Zd /var/www/html#这个目录的默认上下文是httpd_sys_content_t
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
[root@foundation0 html]# ls -lZd /var/www/html/*#目录下存在不同的上下文
-rw-r--r--. root root unconfined_u:object_r:net_conf_t:s0 /var/www/html/a.txt
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /var/www/html/b.txt
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html
[root@foundation0 html]# restorecon -RFv /var/www/html/#将与目录上下文不同的修改成与父目录一样的上下文
restorecon reset /var/www/html/index.html context unconfined_u:object_r:httpd_sys_content_t:s0->system_u:object_r:httpd_sys_content_t:s0
restorecon reset /var/www/html/b.txt context unconfined_u:object_r:admin_home_t:s0->system_u:object_r:httpd_sys_content_t:s0
restorecon reset /var/www/html/a.txt context unconfined_u:object_r:net_conf_t:s0->system_u:object_r:httpd_sys_content_t:s0
[root@foundation0 html]# ls -lZd /var/www/html/*
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/a.txt
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/b.txt
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html
案例:
假设CentOS安装了apache,网页默认的主目录是/var/www/html,我们经常遇到这样的问题,在其他目录中创建了一个网页文件,然后用mv移动到网页默认目录/var/www/html中,但是在浏览器中却打不开这个文件,这很可能是因为这个文件的SELinux配置信息是继承原来那个目录的,与/var/www/html目录不同,使用mv移动的时候,这个SELinux配置信息也一起移动过来了,从而导致无法打开页面,
具体请看下面的实例:
/*使用CentOS举例,如果默认没有安装apache,确保网络连接,使用下面的命令安装*/
[root@linuxde.net ~]# yum install httpd
我们在root的家目录新建一个html文件
[root@linuxde.net ~]# pwd /root
[root@linuxde.net ~]# vi index.html /*随便输入一段文字,
保存退出*/ welcome to www.linuxde.net /*
将这个文件mv到网页默认目录下*/
[root@linuxde.net ~]# 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@linuxde.net html]# ls -Z /var/www/html/ .... unconfined_u:object_r:admin_home_t:s0 index.html [root@linuxde.net html]# ls -Zd /var/www/html/
.... system_u:object_r:httpd_sys_content_t:s0 /var/www/html/ /*
使用restorecon来恢复网页主目录中所有文件的SELinux配置信息(如果目标为一个目录,可以添加-R参数递归)*/ [root@linuxde.net html]# restorecon -R /var/www/html/