备注:环境----阿里云服务器 centos 7.8
什么是SELinux?
1)selinux是安全增强型linux,提供强制访问控制级别,安全性能优于文件权限rwx/ugo和ACL实现的自主访问控制
2)当系统受到破坏时,selinux尽量控制影响,比如当FTP服务的系统账户受到危害时,这个账户危害其他服务的意图会受到阻止
1.1查看selinux的状态
# 查看selinux状态,包括三种状态 # enforcing - 强制模式 # permissive - 宽容模式,不阻止但将动作记录到日志中 # disabled - 禁用状态 getenforce1.2修改selinux状态,有两种方式
# 临时生效,系统重启后恢复到原来的状态 # 说明:只有在宽容或者强制模式下才能使用这种方式切换 # 0表示permissve,1表示enforcing,也可以将数字替换成相应单词 setenforce 0 # 永久生效,编辑selinux配置文件,下次重启系统后生效 # 可以将SELINUX的值修改为它上边列举的三种中任意一个 vim /etc/selinux/config
4.1什么是selinux上下文
1) selinux安全模型基于主题、对象、动作。主题是一个进程,如命令或者Apache中运行的应用;对象是文件、设备或者任何被主题访问的资源;动作就是主题对对象执行的操作;
2)selinux为对象分配不同上下文,其实就是一个标签,由selinux安全策略决定是否允许在对象上执行主题的动作。
4.1.1查看文件或者文件夹上下文
# 查看当前目录下所有文件的上下文 ls -Z # 查看当前目录的上下文 ls -dZ
4.1.2 selinux文件上下文有四个元素,selinux_type类型是重点
unconfined_uobject_radmin_home_ts0selinux userselinux roleselinux typesensitivity level4.1.3文件的上下文是怎么来的呢?下边创建、拷贝、移动文件来看看
总结
创建新文件会继承父文件夹的上下文复制文件会继承父文件夹的上下文移动文件会保留原来的上下文4.2修改文件上下文有两种方式chcon、restorecon(推荐)
4.2.1使用chcon修改,系统重启后会恢复到默认值
① 直接修改:chcon -R [-t type] [-u user] [-r role] 要修改的文件
② 照猫画虎:chcon -R --reference=参考文件 要修改的文件
可选参数说明:
-R递归修改-t指定安全上下文的类型字段 比如:admin_home_t-u指定身份 (比如:system_u)-r指定角色 (比如:system_r)-v为处理的每个文件输出结果--reference 根据指定的参考文件修改例一:
# 直接修改 chcon -v -t admin_home_t /root/2.txt
例二:
# 照猫画虎式修改 chcon --reference=/root/1.txt /root/2.txt
4.2.2.使用restorecon(推荐)恢复上下文
①首先使用semanage fcontent 命令管理默认上下文,可选参数如下
-aadd:添加-llist:列出所有-mmodify:修改-ddelete:删除-ttype:指定文件上下文的type值-eequal:参考目标修改②恢复 restorecon [-R] 要修改的文件名
例一:在/tmp中创建2.txt,将2.txt移动(mv)到 /root下进行实验
# 自定义2.txt默认文件上下文 # 其实是在 /etc/selinux/targeted/contexts/files/file_contexts.local中加了一条默认规则 semanage fcontext -a -t admin_home_t /root/2.txt # 恢复到默认的上下文 -R递归修改,-v显示处理过程 restorecon -R -v /root/2.txt例二:在/root下新建1.sh测试文件,移动(mv)到/etc/cron.d下进行实验
# 自定义默认上下文 semanage fcontext -a -e 0hourly 1.sh # 查看1.sh自定义的默认上下文 semanage fcontext -l | grep 1.sh # 恢复到默认上下文 restorecon -R -v 1.sh例三:在创建虚拟主机时用到了这种修改方式,请参看我的另一篇Apache配置虚拟主机,基于主机名的方式
# /home/www文件夹或者它下边的所有文件 # 自定义/home/www文件夹和文件夹下所有子文件的默认上下文 # ()代表整体,/代表子文件,.*代表所有文件,?代表括号所有内容匹配0次或者1次 semanage fcontext -a -t httpd_sys_content_t "/home/www(/.*)?" # 按照上边加的默认规则,递归修改 restorecon -R /home/www/云服务器Apache正常访问要求:安全组放通端口、防火墙放通8090、selinux安全上下文要满足
5.1将Apache访问端口由80端口改为非标准的8090,重启Apache
vim /etc/httpd/conf/httpd.conf # 将Apache监听端口改为8090 #Listen 80 Listen 8090 # 重启Apache systemctl restart httpd # 查看Apache状态 systemctl status httpd启动报错,报错截图如下:
5.2查看audit阻止的访问审计信息
# 在audit审计日志中过滤所有被拒绝访问的 avc(访问向量缓存)的消息 grep denied /var/log/audit/audit.log | grep avcaudit审计信息如下,意思是源端口selinux标签是httpd_t,而目标端口8090selinux端口标签是unreserved_port_t,不匹配,所以绑定8090端口失败
type=AVC msg=audit(1603162841.518:747): avc: denied { name_bind } for pid=1841 comm="httpd" src=8090 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket permissive=0
5.3解决方案,更改端口selinux上下文
# 查看以http开头的所有默认端口上下文 semanage port -l | grep ^http # 添加自定义端口的上下文 semanage port -a -t http_port_t -p tcp 8090 # 查看自定义端口上下文 semanage port -l -C
5.4云服务器安全组放通8090,放通防火墙8090端口,重启Apache进行测试
# 防火墙放通8090 firewall-cmd --add-port=8090/tcp --permanent # 重新加载防火墙规则 firewall-cmd --reload # 查看当前放通的端口 firewall-cmd --list-port # 重启Apache systemctl restart httpd # 查看Apache状态 systemctl status httpd说明:为服务配置selinux时,通常修改 /sys/fs/selinux/booleans虚拟文件的布尔值,它们的文件名称具有描述性
比如:httpd_enable_homedirs 布尔值允许或拒绝通过Apache服务器访问用户主目录,默认是禁止的
6.1查询selinux布尔值
# 查询selinux所有布尔值 semanage boolean -l # 查询以http开头的所有服务的布尔值 semanage boolean -l | grep ^http6.2修改selinux的Boolean值
# 查询布尔值 # user_exec_content允许selinux执行home或者tmp中可执行的脚本 getsebool user_exec_content # 修改布尔值,允许用户(selinux用户)执行自己目录和tmp中的可执行脚本,-P 永久生效 setsebool -P user_exec_content on # 也可以使用=数字的方式修改,-P 永久生效 setsebool -P user_exec_content=17.1查看与selinux相关的日志报错信息
tail -f /var/log/messages tail -f /var/log/audit/audit.log7.2安装sealert,分析日志审计文件
# 查询sealert所在包 yum provides sealert # 安装sealert支持包 yum install setroubleshoot-server -y # -a 指定要分析的日志文件 sealert -a /var/log/audit/audit.log下边截图是分析结果中的一段,前边改变Apache端口时的报错,多个插件给出了建议。比如,bind_ports这个分析插件有92.2%的信心解决这个问题,它建议执行:semanage port -a -t PORT_TYPE -p tcp 8090