code学习

Linux之SElinux服务详解

SElinux -> Linux安全访问策略 -> 强制性 (security安全)

是Linux操作系统的一个额外的强制性的安全访问规则。用于确定哪个进程可以访问哪些文件、目录和端口的一组安全规则。保护的对象是服务、服务对应的文件/目录、服务对应的端口;其中,服务的实例(实际运行当中的一个例子)就是进程,所以进程也受selinux的保护。可以被看作是与标准权限系统并行的权限系统,如果selinux开启,以root身份运行进程,访问文件不光要受用户对文件访问权限的限定,还要受进程对文件selinux上下文类型的限定,否则,就算是root用户运行的进程,也不一定能访问某个文件。

1).selinux 的三种模式(状态):

enforcing  ->  强制模式  ->  拒绝非法访问并录入日志;
 permissive  ->  许可模式(警告模式)  ->  暂时允许非法访问并录入日志;(debug)
 disabled  ->  禁用模式  ->  允许非法访问且不录入日志。
           

2).selinux 模式的切换:

getenforce  ->  获取selinux状态
 临时切换:
 setenforce 0  -> 临时关闭selinux策略  ->  enforcing-permissive
 setenforce 1  -> 临时开启selinux策略  ->  permissive-enforcing
 永久切换:
 #vim  /etc/sysconfig/selinux 
 vim  /etc/selinux/config ->
 SELINUX=enforcing/permissive/disabled  ->  reboot生效
           

3).selinux 上下文 -> 在linux系统里面,每个文件、进程、端口都具有特别的安全标签,这个标签就是selinux上下文,它是selinux安全策略用来判断某个进程能否访问文件、目录或端口的工具。

A). 内容: 
用户:角色:类型:敏感度   ->  类型是重点
-> 用户 -> 系统用户 (system_u);root及普通用户组成的未指定用户(unconfined_u)
-> 角色 -> 系统角色(system_r);未指定角色(unconfined_r);对象角色(object_r)
-> 类型 -> 以_t结尾,每一个服务都有三个方面的类型 ->  服务本身,服务对应的文件,服务对应的端口 -> 服务和对应的文件,它们的selinux上下文类型得是一一对应的,服务与对应的端口也是要一一对应的;但是,这不代表selinux上下文类型不能改,原则上是可以改的,只不过要做重新的类型配对。
-> 敏感度 -> s0,指的是安全等级,有0、1、2三种,数值越大,灵敏度越高
B). 查看selinux上下文:
查看文件的selinux上下文方法一  -> ll  -Z  filename
查看文件的selinux上下文方法二  -> semanage  fcontext  -l | grep  filename  ->  filename要写文件的绝对路径  ->eg:  semanage fcontext -l|grep /etc/ssh ->不一定能查看所有文件,所以还是方法一跟保险
查看进程的selinux上下文  -> ps  -auxZ -> eg: ps  -auxZ | grep sshd
查看所有(开放或不开放)端口的selinux上下文  -> semamage  port -l | grep 端口号   ->  semanage  port  -l | grep  22
查看当前已经开放的端口的selinux上下文  ->  netstat  -pantZ
           

4).修改selinux上下文类型:

A).文件  ->  
a). 临时修改:
chcon  -t  上下文类型  filename  ->  将selinux设置成disabled后reboot,然后再设置成enforcing后reboot,修改会失效,将还原成原始默认类型  -> 不推荐使用
chcon  -t  httpd_sys_content_t  /opt/testfile
sed  -i  's/SELINUX=enforcing/SELINUX=disabled/g'  /etc/selinux/config
#reboot
sed  -i  's/SELINUX=disabled/SELINUX=enforcing/g'  /etc/selinux/config
#reboot
ll  -dZ  /opt/testfile
b). 永久修改:
semanage  fcontext  -a -t  上下文类型  ‘/filename(/.*)?’-> 注意:这里的filename要写绝对路径
restorecon  -RFv  /filename  -> 强制递归刷新上下文类型并显示刷新过程
semanage  fcontext  -a  -t  httpd_sys_content_t  '/opt/test(/.*)?'
restorecon  -RFv  /opt/test/
B).端口  ->  给一个端口添加selinux上下文类型
semanage  port  -a -t  端口上下文类型  -p  tcp/udp  端口号
semanage port -a -t ssh_port_t -p tcp 22022
semanage port -l|grep ssh
->  端口不用强刷
           

5).selinux布尔值 -> 当selinux开启时,系统默认会设置很多服务功能的开关,而且默认都是关闭的,sebool就是那个开关

a). 查看  ->  getsebool  -a  (|  grep  布尔值)
b). 设置开启或关闭  ->  setsebool  bool名  on/off
c). semanage  boolean  -l  (|  grep  布尔值)->  查看布尔值是否永久开启(括号中右边那个值),并显示该布尔值状态的简短描述
           

注意:

a).文件会默认继承父文件夹的selinux类型;

b).文件被cp到新的文件夹下,会自动继承新文件夹的selinux上下文类型,但mv不会这样,仍会保留原上下文类型;

c).如果修改了某服务的配置文件位置,则必须重新修改该文件的selinux上下文类型,以重新匹配服务,否则服务无法访问该配置文件。

继续阅读