为了保障linux系统的安全,除了firewalld防火墙外,linux系统管理员通常会控制用户和组的权限,这种基于用户和组的安全模型称之为主动访问控制,而SELinux提供了一个额外的系统安全层,它是基于对象的安全模型,对象可以是文件、目录或端口,这样安全模型称之为强制访问控制。
SELinux提供了一组基于进程是否可以访问文件、目录或端口的安全策略。
security enhanced linux–安全加强的linux。是由美国国家安全局开发的以及历史。selinux之前是基于自主存取控制方法DAC,只要符合权限即可,通过suid和sgid特殊权限存在有一定的安全隐患,甚至一些错误的配置就会引发巨大的漏洞,被轻易攻击。
selinux是基于强制存取控制方法MAC,应用程序或用户必须同时符合DCA既要对应selinux的MAC才能正常操作,否则遭到拒绝。
DAC和MAC的比较
DAC:自主访问控制,主体是用户,访问目标文件,由文件本身权限决定的
MAC:强制访问控制,主体是程序,访问目标文件,由文件权限和策略决定。
SELinux一共有三种模式,分别是Enforcing、Permissive和Disabled。
模式 | 功能说明 |
---|---|
enforcing | 强制模式,主动拒绝SELinux策略限制的访问行为,同时会对访问行为进行记录 |
permissive | 许可模式,暂时允许SELinux策略正在限制的访问行为,同时会对访问进行记录。该模式一般用于故障排除。 |
disabled | 禁用模式,完全禁用SELinux |
强制模式与许可模式之间可以相互切换,无需重新启动操作系统。若将模式从强制模式或许可模式更变设置为禁用模式时,此时需要重新启动操作系统才能彻底禁用SELinux;同样,若将模式从禁用模式变更设置为强制模式或许可模式时,此时也需要重新启动操作系统才能真正变更模式设置。
命令"setenforce
"命令的设置只会改变SELinux当前的模式,并不会影响操作系统启动后SELinux所处的模式。配置文件/etc/selinux/config中SELINUX参数值的修改只会影响操作系统启动后SELinux所处的模式,并不会影响SELinux当前的模式。
Linux系统中每个文件、目录和端口都具有特别的安全标签,该标签称之为SELinux上下文。SELinux安全策略就是通过SELinux上下文用来确定进程是否可以访问文件、目录或端口。
SELinux标签具有多种上下文,依照顺序依次为用户、角色、类型和敏感度。RHEL中的默认策略会根据第三个上下文,即类型值上下文来制定规则。类型值的特征非常明显,通常以"_t"结尾。如web服务器的DocumentRoot目录/var/www/html中的文件或目录的类型为"httpd_sys_content_t"。
初始SELinux上下文
SELinux上下文的更改
命令 | 功能描述 |
---|---|
chcon | 将文件或目录的SELinux上下文更改为指定的类型,选项”-t”用于指定上下文类型 |
restorecon | 更改文件或目录的SELinux上下文的首选方式。它使用SELinux策略中的规则来确定文件或目录默认的上下文 |
查看文件的context值:
ll -Z /abc/aa
查看目录的context值:
ll -ldZ /abc/
安全上下文三部分组成:用户u、角色r和类型识别符t
chcon -t tmp_t redhat # 更改redhat的context值为tmp_t
restorecon -v redhat # 恢复redhat的context值
# 更改路径context值也会发生变化。
# 永久修改context值
semanage fcontext -a -t tmp_t "/abc(/.*)?"
restorecon -RFv /abc/
标签换乱时,touch /.autorelabel 重打标签
或将selinux配置文件中改为disabled重启再改回来。
getsebool -a # 查看所有bool开关
setsebool -P # 修改布尔开关
例子:
临时修改(服务器重启后,失效)
setsebool ftpd_full_access on
永久修改:
setsebool -P ftpd_full_access on
端口标记
添加
semanage port -a -t [端口类型] -p 【tcp/udp】 【端口号】
添加端口标签
semanage port -a -t http_port_t -p tcp 8910
查询端口标签
semanage port -a | grep 8910
修改端口标签
semanage port -m -t pegasus_http_port_t -p tcp 8910
删除端口标签
semanage port -d -t pegasus_http_port_t -p tcp 8910
e port -m -t pegasus_http_port_t -p tcp 8910
删除端口标签
semanage port -d -t pegasus_http_port_t -p tcp 8910