SELinux入门学习

备注:环境----阿里云服务器 centos 7.8

什么是SELinux

1)selinux是安全增强型linux,提供强制访问控制级别,安全性能优于文件权限rwx/ugo和ACL实现的自主访问控制

2)当系统受到破坏时,selinux尽量控制影响,比如当FTP服务的系统账户受到危害时,这个账户危害其他服务的意图会受到阻止

一、selinux状态

1.1查看selinux的状态

# 查看selinux状态,包括三种状态
# enforcing - 强制模式
# permissive - 宽容模式,不阻止但将动作记录到日志中
# disabled - 禁用状态
getenforce

1.2修改selinux状态,有两种方式

# 临时生效,系统重启后恢复到原来的状态
# 说明:只有在宽容或者强制模式下才能使用这种方式切换
# 0表示permissve,1表示enforcing,也可以将数字替换成相应单词
setenforce 0
# 永久生效,编辑selinux配置文件,下次重启系统后生效
# 可以将SELINUX的值修改为它上边列举的三种中任意一个
vim  /etc/selinux/config

 

二、安装selinux安全管理工具semanage 

# 我用阿里云服务器7.8,默认selinux禁用,semanage未安装
# 查询semanage所在的包
yum  provides  semanage

# 安装semanage支持包
yum  install  -y  policycoreutils-python

三、查询selinux映射用户、selinux用户,这部分一般不改 

# 查看当前selinux映射用户
semanage   login  -l

# 查询selinux用户
semanage user  -l

四、selinux管理文件安全上下文

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_ts0
selinux  userselinux  roleselinux  typesensitivity  level

4.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/

 五、selinux对端口的管理

云服务器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  avc

audit审计信息如下,意思是源端口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的布尔值管理

说明:为服务配置selinux时,通常修改 /sys/fs/selinux/booleans虚拟文件的布尔值,它们的文件名称具有描述性

比如:httpd_enable_homedirs 布尔值允许或拒绝通过Apache服务器访问用户主目录,默认是禁止的

6.1查询selinux布尔值

# 查询selinux所有布尔值
semanage boolean  -l

# 查询以http开头的所有服务的布尔值
semanage boolean  -l   | grep  ^http

 6.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=1

七、selinux排错工具

7.1查看与selinux相关的日志报错信息

tail -f  /var/log/messages

tail -f  /var/log/audit/audit.log

7.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

说明:selinux较为复杂,本文是在初步理解的基础上总结得来,在后期深入学习后会进行补充修正,如有疑问或者指教请留言,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值