• 搜索
  • 夜间模式
    ©2015-2025  Ethan's Blog Theme by OneBlog
    搜索
    标签
    # Amule # Gargoyle # LUCI # VIM # Python # Nginx # 反代 # Ansible # Apache # LNMP
  • 首页>
  • Linux>
  • 正文
  • SELinux小记

    2020年03月28日 60 阅读 0 评论 4073 字

    SELinux简介

    全称Security Enhanced Linux,中文Linux安全增强。传统DAC(Discretionary Access Control)自主接入控制在权限设置不当时容易造成风险,而SELinux使用了MAC(Mandatory Access Control)委任权限控制方法,针对特定的程序域特定的档案进行权限管控,使得权限自由变小,因此即便你是root账户,你在运行某些程序的时候获取到的权限也一定root,由此增强了安全性;比如你的网站目录权限设置不正确导致被服务器入侵,但是由于SELinux的存在,入侵者可以做的操作少之又少,大大减少了你的服务器被彻底攻陷的概率。
    这样说起来SELinux很好才对,可是他也会造成烦恼,对SELinux不够了解根本不知道如何解决问题,所以很多人选择直接把SELinux关闭。而我,选择学习,记录一下学习内容,以便查询。

    构成

    SELinux默认提供一些预设的Policy,而在Policy中又有一些列的Rules。他主要有以下名词:主体(Subject)、目标(Object)、政策(Policy)、安全性文本(Security Context)。

    • Subject
      因为SELinux管理的就是程序,所以可以将其认为subject就是需要管理的程序进程
    • Object
      程序存取的目标就是档案系统,所以可以认object就是档案系统
    • Policy
      对程序做出权限限制全靠他,其中包含一系列Rules,Policy下又包含三种策略

      targeted:针对网络服务限制较多,针对本机限制较少,是默认的政策;
      minimum:由 target 修订而来,仅针对选择的程序来保护!
      mls:完整的 SELinux 限制,限制方面较为严格。建议使用默认的 targeted 政策即
      可
    • 安全性文本
      类似于文件的rwx属性,如果这个参数设定不正确,那么你可能无法正常读取档案。比如samba共享默认的安全性文本为samba_share_t,如果你设置为user_home_t,那么会导致你无法进入共享的文件夹。
      使用ls -Z可以看到当前文件的安全性文本。

    -rw-r--r--. fuckyou users system_u:object_r:samba_share_t:s0 mrbs-1.7.4.1.tar.gz

    如上system_u:object_r:samba_share_t:s0部分就是安全性文本,这分为三个部分,包含身份识别(Identify)、角色(Role)、类型(Type),其中Type为最重要的,他确定了一个程序能否正常读取到档案资源

    Idenfify

    代表类型:

    • unconfined_u
      代表不受限的用户,也即是该档案是由不受限制的程序所产生的
    • system_u
      代表系统用户,也即是系统本身产生的档案

    Role

    代表角色:

    • object_r
      代表的是文件或者目录
    • system_r
      代表的是程序

    Type

    在在默认使用targeted策略时,Identity和Role基本不影响文档的存取,能影响的只有Type位,而Type在文档与程序上的定义不同,在文档上称为Type;在程序上称为domain;domain和Type需要搭配起来,该程序才能正常进行文档存取。例如使用ps -eZ | grep smbd可以看到smb对应的domain。

    以samba为例,smb对应的domain为system_u:system_r:smbd_t:s0 13669 ? 00:00:00 smbd;SELinux会对某些程序的domain做出预定义的规则。

    规则及其SELinux type

    规则查看getsebool -a命令
    例如getsebool -a | grep samba即可看到所有samba的规则,但是规则很多,要知道具体某条规则是干嘛的,需要使用seinfo等工具。

    yum -y install setools-console-*

    seinfo [-trub]

    --all:列出SELinux的状态、规则布尔值、身份识别、角色、类别
    -u:列出SELinux的所有身份识别(user)种类
    -r:列出SELinux的所有角色(role)种类
    -t:列出SELinux的所有类别(Type)种类
    -b:列出所有的规则种类布尔值

    seinfo -u可以查看当前所有的身份; seinfo -r可以查看当前所有的角色。

    使用semanage boolean -l | grep samba_create_home_dirs可以查看当前规则的具体作用;

    使用sesearch -A -s smbd_t 即可查看snmbd_t这个域可以存取文件的SELinux type

    使用sesearch -A -b samba_create_home_dirs可以列出这个规则中程序能够读取的文件SELinux type

    规则布尔值

    当使用getsebool获取某个规则的布尔值后,如果要修改该规则的布尔值,则使用setsebool -P samba_create_home_dirs 1。

    一定要加上-P参数,才能将修改写入配置文件。

    安全文本修改

    通过 sesearch 来找到主体程序与文件的关系后,如果出现SELinux导致无法正常存取文档的时候,那么我们就要检查安全文本是否正确,不正确就要修改。

    例如使用chcon -t samba_share_t /home/Downloads修改/home/Downloads目录的安全文本类型为samba_share_t,如果该文件夹类型不为samba_share_t,即使你将其作为samba共享文件夹,权限设置正确,你也无法进入该目录浏览文件。

    -R :参数可以递归修改

    -t :参数后面接安全性文本的类型字段

    -u :后面接身份识别类型

    -r :后面接角色识别类型

    -v :如若有变化,则将变化详细结果列出来

    使用restorecon命令可以将目录及文件恢复成默认的SELinux type,但是仅限于默认type为正确的时候可用,否则即使使用此命令也无法修复SELinux造成的权限问题。

    修改默认SELinux type

    semanage fcontext命令可以查询、删除、增加、修改相应的type

    semanage 参数如下:

    -a 增加,一些默认没有设置type目录可以自行增加

    -m 修改当前type

    -d 删除type

    下面使用自创建并加入samba共享的目录进行演示,首先使用semanage fcontext -l | grep "^/home/Downloads",发现并没用输出结果,但是我们知道其默认type应该是samba_share_t,但是使用restorecon -Rv进行重置type的时候其类型并不匹配,于是我选择自行增加

    semanage fcontext -a -t samba_share_t "/home/Downloads(/.*)?"
    semanage fcontext -l | grep '^/home/Downloads'

    上述命令完成后可以看到已经有一条针对/home/lonny/Downloads(/.*)?的默认type了,当我们再次使用restorecon -Rv命令的时候即可看到其默认恢复的type是正确的了。

    SELinux排错

    上面是解决SELinux导致问题的方法,但是当出现问题时,要用什么指令修改什么,这个还是需要进行排错以后才能确定,排错之前需要用到的组件有auditd及setroubleshootd,一定要安装否则不会有日志,安装后要重启服务器。

    yum -y install setroubleshoot setroubleshoot-server

    首先,通过getenforce查看SELinux的状态,通过setenforce 0切换SELinux到Permissive模式,这个模式SELinux会执行该执行的流程,但是不会拦截行为,如果切换到这个模式,你之前出现的问题不再重现,那么肯定是SELinux导致的,这个时候在日志中应该有相关的记录,使用setenforce 1切换回Enforcing模式。

    最便捷找到问题的方法 cat /var/log/message | grep "SELinux",只要有日志记录就一定有输出,上面会给出导致问题的原因以及解决的方法,基本只要复制粘贴完成即可。但是要注意的是其给的命令不一定每次都是正确,比如我自行创建并添加到samba共享的目录下后面创建的子目录无法访问,排查时使用SELinux给的命令进行修复后发现还是提示没用权限进不去,后面才发现type类型不对,需要自定义默认type,然后使用restorecon -Rv命令进行修复。

    本文著作权归作者 [ Ethan ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。
    — END —
    Copyright©2015-2025  All Rights Reserved.  Load:0.010 s
    Theme by OneBlog V3.6.3
    夜间模式

    开源不易,请尊重作者版权,保留基本的版权信息。