一、SELinux说明
SELinux全名是Security Enhanced Linux ,是linux的一个安全模块,Linux在没有嵌入SELinux之前,在国际上的安全评级是4星,后来美国国家安全局和红帽协同其它社区一起开发了SELinux,让Linux的安全评级达到了5。
Linux上传统的权限是通过对用户进行限制,这种方式能起到很好的系统安全管理,后来人们也发现系统却常常被程序的漏洞所破坏。同时在企业权限管理不严格的地方,系统也常常会被有意或无意的破坏,而SELinux的开启有效的阻止了这类问题对系统的伤害。
Selinux是用于确定哪个程序可以访问:哪些文件、目录和端口的一组安全规则。Selinux 通过给程序、文件和端口配上各自的标签,如果程序和文件的标签能配上,那程序能访问文件,如果端口标签和程序的标签能配上,通过端口就能访问程序。
比如apache程序的拥有人是apache用户,在开启selinux后,apache程序只能访问/var/www/html下的文件,如果apache这个程序被人黑进去利用了,那破坏也只能破坏/var/www/html目录,相反如果没有selinux,apache程序如果被人劫持了,那所有拿些开放了其他人(o)权限的文件,都有被劫持的风险。每个程序、文件和端口都有特别的安全标签,这些标签统称为selinux上下文。selinux标签有多种上下文,rhel中默认是使用“类型上下文”来制定自己的规则,“类型上下文”通常以_t结尾。以apache程序为例,apache进程的标签是httpd_t ,apache进程能访问的文件/目录的标签是httpd_sys_content_t, 能开放给apache做端口的标签是http_port_t, 通俗点讲就是在开启selinux的系统里,要给apache访问的文件必须打上httpd_sys_content_t标签,而apache的监听端口必须有http_port_t标签。
二、命令结合-Z参数可以查看selinux属性
- ps axZ
- ps -ZC httpd
- ls -Zd /home
- ls -Z /var/www
三、SElinux模式
- 强制模式(enforcing)
记录SElinux的所有日志,并严格执行规则
- 许可模式(permissive)
记录SElinux的所有日志,但不作任何拦截
- 禁用模式(disabled)
不记录也不拦截
四、更改SELinux的模式
- 获取当前SELinux模式 getenforce
- 更改当前的SELinux模式
setenforce 1 把当前模式设为强制模式
setenforce 0 把当前模式设为许可模式
PS:只有在默认SELinux开启的状态下,才能进行上面的设置
- 更改默认的SELinux模式
vim /etc/selinux/config
SELINUX=enforcing
重启生效
- 详细查看当前selinux状态
sestatus
五、更改SELinux安全上下文
初始SELinux上下文,通常,文件父目录的SELinux安全上下文决定该文件的初始SELinux上下文,父目录的上下文会分配给新建文件。用vim、touch、cp获得的新文件会继承父目录的安全上下文。用mv、cp -a获得的文件新文件将保持其原有的安全上下文。
5.1 使用chon命令修改SELinux安全上下文
- 用法:
chcon [选项]... 环境 文件...
或: chcon [选项]... [-u 用户] [-r 角色] [-l 范围] [-t 类型] 文件...
或: chcon [选项]... --reference=参考文件 文件...
- 主要参数:
-h, --no-dereference affect symbolic links instead of any referenced file
--reference=参考文件 使用指定参考文件的安全环境,而非指定值
-R, --recursive 递归处理所有的文件及子目录
-v, --verbose 为处理的所有文件显示诊断信息
-u, --user=用户 设置指定用户的目标安全环境
-r, --role=角色 设置指定角色的目标安全环境
-t, --type=类型 设置指定类型的目标安全环境
-l, --range=范围 设置指定范围的目标安全环境
- 以下选项是在指定了 -R 选项时被用于设置如何穿越目录结构体系。如果您指定了多于一个选项,那么只有最后一个会生效。
-H 如果命令行参数是一个通到目录的符号链接,则遍历符号链接
-L 遍历每一个遇到的通到目录的符号链接
-P 不遍历任何符号链接(默认)
--help 显示此帮助信息并退出
--version 显示版本信息并退出
- chcon 命令可以将文件的安全上下文更改成指定的安全上下文
mkdir /virtual
ls -Zd /virtual
chcon -t httpd_sys_content_t /virtual
ls -Zd /virtual
- restorecon恢复文件的安全上下文
这个命令是更改目录/目录的SELinux的首选方法,使用这个命令时无需指定安全上下文,它使用SELinux中安全策略中的默认规则来确定给文件/目录那种安全上下文。
ls -Zd /virtual
restorecon -RFvv /virtual
ls -Zd /virtual
发现用chcon更改的规则又回去了,这就是为什么chcon不被推荐,chcon虽然修改了文件的安全上下文,但没有修改默认规则,虽然改成功了,重启也还在,但是只要启动了重写标记,文件的标记就会被改成默认的。那怎么来更改这个安全策略中的默认规则呢,看下面。
5.2 使用semanage命令修改SELinux默认安全上下文(推荐)
semanage fcontext 命令可用于显示或修改文件或目录默认的安全上下文,这里说的默认的安全上下文,就是上面restorecon运行时使用的默认安全上下文,也是重写标记时使用的安全上下文。
- 用法:
安装方式:yum -y install policycoreutils-python
semanage fcontext|port [-S store] -{a|d|m|l|n|D} [-frst] file|port
- 主要参数:
-a:添加
-d:删除
-m:修改
-l:列举
-n:不打印说明头
-D:全部删除
-f:文件
-s:用户
-t:类型
-r:角色
5.2.1设置文件/目录SELinux默认安全上下文
echo 'selinux file1’ > /virtual/file.txt
semanage fcontext -a -t httpd_sys_content_t '/virtual(/.*)?'
restorecon -RFvv /virtual 恢复修改后默认安全上下文
ls -Zd /virtual
ls -Z /virtual
5.2.2设置端口的SELinux默认安全上下文
semanage port -a -t "http_port_t" -p tcp 8909 --系统给端口做标记
semanage port -l | grep http_port_t --查看8909端口是否被标记放通
注:semanage命令使用扩展正则表达式来指定路径和文件名,fcontext规则中最常用的的扩展正则表达式是(/.*)? , 它将会匹配表达式前面列出的目录并递归的匹配该目录中所有的内容.如果不知道表达式怎么写,可以使用semanage fcontext -l 查看已有规则的写法。
5.3通过更改SELinux布尔值管理SELinux策略
SELinux有很多很多的策略,我们在这里讲的策略可以简单的理解成“针对某些服务功能的特殊设定”,而布尔值可以理解成更改这些策略行为的开关,也就是启用或者禁用这个策略。比如,用户通过apache访问家目录这个功能,SELinux就有条专门的策略,这个策略通过布尔值打开后,不用给家目录打安全上下文标签就可以访问.再比如,匿名用户访问ftp文件夹这个功能,SELinux也有条专门的策略,这个策略通过布尔值打开后,不用经过别的特殊设置,SELinux就放开匿名访问ftp文件夹的权限。
getsebool命令用于显示SELinux布尔值, setsebool 命令用于临时修改SELinux布尔值,semanage boolean -l 命令用于显示布尔值是否为永久生效
- getsebool -a 查看系统所有SELinux策略
- getsebool httpd_enable_homedirs 查看httpd_enable_homedirs的策略的布尔值
- setsebool httpd_enable_homedirs on 设置httpd_enable_homedirs的策略开启
- semanage boolean -l 查看布尔值的当前值和永久值,
- semanage boolean -l | grep httpd_enable_homedirs 发现http_enable__homedirs的当前值是开启了布尔值,但是永久值却是关闭的,也就是重启系统后,这个布尔值是关闭的。
- setsebool -P httpd_enable_homedirs on 使用-P选项让这个布尔值永久生效,这个命令的执行结果是当前和永久都设置成启用。
- semanage boolean -l | grep httpd_enable_homedirs 验证
- semanage boolean -l -C 仅列出和默认不同的布尔值条目,也就是看看拿些布尔值被修改过了。
六、如保查看进程标签对应什么文件(夹)标签
yum install setools-console* 装完可以使用sesearch命令
sesearch -A -s httpd_t | grep content
sesearch -A -s crond_t | grep spool
sesearch -A -t httpd_sys_content_t
sesearch -A -b httpd_enable_homedirs
七、图形化管理和查看SELinux的标签管理
yum install policycoreutils-gui
system-config-selinux
八、故障排除
在开着SELinux强制模式的系统环境中,某个服务受阻,如果怀疑是受了SELinux的影响,可以先把SELinux设置到许可模式下,在看看服务的运行状态,如果确定是SELinux问题,可以进行下一步。如果知道文件的安全上下文或策略布尔值,建议验证,如果不知道,走一下步。
开启详细日志管理,安装setroubleshoot-server, 这个服务可以监听/var/log/audit/audit.log中的审核信息,并发送简短摘要到/var/log/messages
在/var/log/messages中,查找 sealert -l ......命令,并把它放在系统里运行。每个selinux冲突都有一个唯一标识符(UUID),通过使用sealert -l UUID可以查看这个事件的报告。