SELinux

SELinux

Posted by nomadli on September 28, 2022

访问控制类型

  • DAC Discretionary Access Control,任意式读取控制 每个对象都会记录一个拥有者的信息。只要是对象的拥有,就可以获得该对象的完全控制权限。DAC允许拥有者完全权限。其他需要读取该对象的时候,必须授予适当的权限。但是每个对象仅有一组拥有者的信息,如果需要更复杂的读取控制能力,必须使用ACL。ACL是DAC的延伸,在ACL环境下,可以为不同的用户设置一组权限,对不同的用户设置不同的权限。
  • MAC Mandatory Access Control,强制性读取控制 为每一个对象添加一个安全的上下文。进程和用户除了具备传统的权限之外,还必须获得SELinux的授权,才能读取对象
    • 由TEAC TE Type Enforcement Access Control基于类型的强制访问控制语句组成
      • rule_name source_type target_type:object_class perm_set;
      • rule_name allow、allowaudit、dontaudit、neverallow
        • allow 赋予某项权限,默认通过不记录、不通过记录
        • auditallow 检查成功也记录,必须设置过allow才会通过
        • dontaudit 检查失败不做记录,不设置allow都会失败
        • neverallow 检查安全策略文件中是否有违反该项规则的allow语句
      • source_type 即domain modle 如logd、kernel、shell、sdcardd
      • target_type 即type属性 如rootfs、system_file、sdcardd_exec
      • object_class 即对象类型 如 dir s0 s1
      • perm_set 操作 如 mounton
      • source_type target_type perm_set 都可以设置多个或模糊匹配 {logd shell}多个 -logd 排除 log*或~log 匹配
      • 根据规则中的type进行权限审查,判断source_type(进程对象)对target_type(object)的某个class类型中某种permission是否具有访问权限
      • allow sdcardd rootfs:dir mounton; 允许sdcardd在rootfs下的目录挂载
  • RBAC Role-based Access Control,角色基础读取控制 以用户所属的角色进行读取权限判定的动作。
  • MLS Mulit-Live Security,多层次安全 以对象的机密等级来决定进程对该对象的读取权限

SELinux

  • 实现了MAC、RBAC、MLS、TEAC
  • /etc/selinux/config
    • SELINUX enforcing permissive(仅记录不限制) disabled
    • SELINUXTYPE 策略类型需先安装,targeted(保护常见网络服务)、minimum(最小策略)、MLS
  • sestatus -v -b 查看selinux状态
  • getenforce 查看selinux模式
  • setenforce 1(enforcing) 0(permissive) 设置模式
  • yum -y install selinux-policy-xxx selinux-policy-mls
  • 支持两种MAC控制(配置)模式: TEAC、MLS 不推荐RBAC
  • domain切换,一个进程是一个domain,fork一个进程并exec时会涉及到domain切换,例如apache ```shell

    1. 源doamin 必须要有执行这个执行档的权限

    让init_t域中的进程(0号进程、systemd)能够执行type为apache_exec_t的文件

    allow init_t apache_exec_t:file {read getattr execute};

2. 源domain 必须有权限切换到目标domain

允许init_t中的进程切换进入apache_t域

allow init_t apache_t:process transition;

3. 执行档必须是目标domain的入口(Entry Point)

设置apache_t域入口(entrypoint)权限为执行apache_exec_t类型的文件

allow apache_t apache_exec_t:file entrypoint;

4. 执行domain切换

type_transition init_t apache_exec_t:process apache_t;

- 进程在磁盘上创建文件默认继承父目录或磁盘格式的文件上下文,如要修改需要Object切换
```shell
# 1. process必须有在这个目录下添加文件的权限
# 让apache_exec_t对apache_root_t目录具备访问权限
allow apache_exec_t apache_root_t:dir { write search add_name };

# 2. process必须有在这个目录下创建以这个Security Context为Label的文件权限
# 允许apache_exec_t访问创建apache_html_t的文件
allow apache_exec_t apache_html_t:file { write create getattr };

#Object切换
type_transition apache_exec_t apache_root_t:file apache_html_t;
  • ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts today 查看日志
  • dmesg grep -i -e type=1300 -e type=1400 如果auditd未启动
  • 系统启动失败可以在linux启动参数中添加参数
    • enforcing=0 记录每次操作拒绝信息,但不禁止执行
    • selinux=0 停止加载selinux
    • autorelabel=1 以permissive模式启动,自动修复系统所有文件的上下文
  • yum install -y setools-console && seinfo -u 列出selinux所有用户类型
  • setsebool -P ssh_sysadm_login on 允许sysadm_u使用ssh登陆
  • newrole -l s1-s3 切换用户当前使用的等级
  • /etc/selinux/mls/contexts/securetty_types 设置安全终端
  • /etc/selinux/<targeted mls>/setrans.conf 设置多级别类型
    • s0:c0=Marketing\ns0:c1=Finance\n….
    • systemctl restart mcstrans cms转换服务
    • chcat -L 显示所有类别

安全上下文

  • 拥有上下文的object有两种, subject即domain即进程、Object即文件
  • 上下文表示USER:ROLE:TYPE[:LEVEL]
  • USER
    • unconfiged_u(未限制用户)
    • user_u(普通用户)
    • system_u(系统账户)
    • root(超级用户)
  • ROLE
    • unconfiged_r(未限制角色)
    • staff_r(内部用户角色)
    • user_r(其他或不分类的用户角色)
    • object_r(文件、设备或其他被动被访问的对象)
    • secadm_r(允许做安全管理的用户角色)
  • TYPE
    • unconfiged_t(未限制类型)
    • default_t(默认类别)
    • mn_t(代表挂载点的类型,/mnt中的文件类型属于这个类别)
    • boot_t(作为开机文件的类型,/boot中的文件多数属于这个类别)
    • bin_t(作为二进制执行文件,/bin中的文件多数属于这个类别)
    • sbin_t(作为系统管理类型的文件,/sbin中的文件属于这个类别)
    • device_t(代表设备文件,/dev中的文件属于这个类别)
    • lib_t(链接库类别,/lib中的文件属于这个类别)
    • var_t(代表存储于/var中的文件类别)
    • usr_t(代表存储于/usr中的文件类别)
    • etc_t(存储于/etc中的文件类别)
    • tty_device_t(代表终端或控制台设备)
    • su_exec_t(具备su功能的执行文件)
    • java_exec_t(JAVA相关的执行文件)
    • public_content_t(公共内容类型文件,比如FTP、NFS等服务器中的文件)
    • shadow_t(代表存储密码数据的文件类别)
    • http_t(作为HTTP服务器文件的类别)
  • LEVEL s0-s15 s0安全等级最低、s15安全等级最高
  • CATEGORY c0-c1023 分类
  • yum install -y semanage
    • semanage login -l 查看linux用户与selinux用户的映射关系
    • semanage import 导入selinux的所有规则
    • semanage export 导出selinux的所有规则
  • id -Z 查看用户的上下文信息,useradd -Z staff_u xx 指定selinux用户,默认unconfined_u
  • semanage login -m -s user_u -r s0 __default__将没有指定映射的用户映射到user_u
  • usermod -G wheel -Z sysadm_u xx将某用户关联到sysadm_u并添加进wheel组
  • visudo -f /etc/sudoers.d/xxx 允许某用户sudo
    • xxx ALL=(ALL) TYPE=sysadm_t ROLE=sysadm_r ALL
  • ps axZ 查看进程安全上下文
  • ls -Z ./ 查看文件安全上下文
  • chcon 修改文件的SELinux安全上下文
    • -h, –no-dereference 影响符号连接而非引用的文件。
    • –reference=参考文件:使用指定参考文件的安全环境,而非指定值。
    • -R, –recursive:递归处理所有的文件及子目录。
    • -v, –verbose:为处理的所有文件显示诊断信息。
    • -u, –user=用户:设置指定用户的目标安全环境。
    • -r, –role=角色:设置指定角色的目标安全环境。
    • -t, –type=类型:设置指定类型的目标安全环境。
    • -l, –range=范围:设置指定范围的目标安全环境。
  • matchpathcon 检查修改文件默认上下文
    • matchpathcon -V /var/www/html/* 检查并提示错误
    • matchpathcon -Rv /var/www/html/* 自动修复
  • fixfiles 修复rpm软件包上下文 chcon -u system_u -t auditd_log_t /var/log/audit
  • restorecon 修复文件上下文
  • fixfiles -F onboot或touch /.autorelabel liunx 重启修复系统所有文件的上下文,先设置为permissive模式,防止重启失败
  • yum install -y selinux-policy-targeted、libselinux-utils 和 policycoreutils

策略类型

  • yum -y install setools-console setools-libs 查看工具
  • seinfo /etc/selinux/targeted/policy/policy.(version) 查看策略统计信息
    • -x 为每个组件匹配表达式显示更多详细信息
    • –stats 显示策略的统计信息
    • -l 显示约束语句时显示换行符
    • -A 列出SELinux的状态、规则布尔值、身份识别、角色、类型等所有信息
    • -t 列出SELinux所有类型(type)的种类
    • -r 列出SELinux所有角色(role)的种类
    • -u 列出SELinux所有身份识别(user)的种类
    • -b 列出所有规则的种类(布尔值)
  • sesearch -A -s httpd_t -t etc_t /etc/selinux/targeted/policy/policy.xx
    • 查看httpd策略读取etc类型的所有规则
    • -a 列出该类型或布尔值的所有相关信息
    • -t 后面还要接类型,例如 -t httpd_t
    • -b 后面还要接布尔值的规则,例如 -b httpd_enable_ftp_server
    • -d 不搜索类型的属性
    • -R 使用正则表达式匹配
    • -n 问每个规则显示行号(如果有)
    • -S 搜索规则的语义而不是语法
    • -C 为条件规则显示条件表达式
    • -A 搜索允许规则
    • –neverallow 搜索neverallow规则
    • –auditallow 搜索auditallow规则
    • –dontaudit 搜索dontaudit规则
    • -T 搜索type_transition、type_member和type_change规则
    • –role_allow 搜索角色允许规则
    • –role_trans 搜索role_transition规则
    • –range_trans 搜索range_transition规则
    • –all 搜索所有规则类型
    • sesearch -A –source=x –target=x –class=x –perm=x,y
  • getsebool -a 列出系统中所有开关规则的开启状态
  • getsebool httpd_can_network_connect 查看某开关是否开启
  • setsebool [-P 永久生效] httpd_can_network_connect on off 设置某开关状态
  • semodule 查看管理策略模块
    • -l 显示安装的模块
    • -R 重装策略模块
    • -B 建立和承诺改装策略模块
    • -I <策略模块> 安装一个新的模块
    • -u <策略模块> 升级策略模块
    • -e <策略模块> 激活策略模块
    • -d <策略模块> 禁用策略模块
    • -b <策略模块> 安装新的基础模块
    • -r <策略模块> 删除策略模块
  • yum -y install policycoreutils-gui 图形管理工具

配置预制服务

  • yum install -y policycoreutils-python-utils setroubleshoot-server
  • semanage port -l grep http 查看当前http服务的端口设置
  • semanage port -a -t http_port_t -p tcp 8081 添加8081到http端口
  • semanage fcontext -a -e /var/www /var/www2 将www目录上下文复制到www2
  • semanage fcontext -a -t httpd_sys_content_t “/xx/(/.*)?” && restorecon -R -v /xx
  • semanage boolean -l 查看所有支持的boolean配置
  • getsebool -a 列出当前boolean配置
  • setsebool httpd_use_nfs on 允许http读取nfs磁盘类型
  • ms模式下 semanage user -m -L s1 -r s1-s15 _staff_u 设置staff_u允许级别及默认级别
    • genhomedircon 生成用户目录权限上下文,restorecon -R -F -v /home/ 更新
  • semodule -DB 临时将所有拒绝信息设置为记录审计日志
  • semodule -B 启用拒绝信息不记录审计
  • sealert -l “*” 查看selinux警告,或者用ausearch
  • auditctl -w /etc/shadow -p w -k shadow-write 启用或禁用审计记录绝对路径
  • setroubleshoot缓存 /var/lib/setroubleshoot/setroubleshoot.xml

自定义策略模块

  • yum install -y selinux-policy-devel policycoreutils-devel
  • sample /usr/share/selinux/devel/
  • sepolicy 策略命令行工具,可启动gui界面
    • sepolicy -h 查看命令帮助
    • sepolicy xxx -h 详细帮助用法
    • sepolicy generate 可自动生成指定类型的模块模板
  • audit2allow 可以针对被阻止的程序创建自定义策略模块
    • ausearch -m AVC -ts recent audit2allow -R 显示最近阻止的访问需要添加什么
    • grep -r “xx” /usr/share/selinux/devel/include/ grep .if 查看提示的函数定义的文件,决定是否使用,推荐的命令可能不对
    • 或者使用TEAC语法添加到*.te文件中
  • yum install -y udica 容器规则生成工具
    • docker podman inspect xxx > yyy.json 将容器描述导出为json
    • udica -j yyy.json zzz
    • 执行输出的建议:semodule -i zzz.cil /x/udica/templates/{base_container.cil,net_container.cil,home_container.cil}
    • 停止容器,重新添加–security-opt label=type:zzz.process 启动容器
  • xxx.te 包含模块专用的声明和规则
  • xxx.if 模块接口,其它模块访问本模块的类型和属性
  • xxx.fc 模块有关文件的上下文标记
  • xxx.spec 项目配置文件
  • xxx.sh 调用/usr/share/selinux/devel/Makefile 执行模块安装或更新
  • semodule -i xxx.pp 加载模块
  • semodule -r xxx 卸载模块
  • semodule -l 显示所有加载模块
  • git@github.com:eparis/kubernetes-selinux.git 例子
  • domain 为主动单元即进程对象, type为被动单元即文件对象
  • fs_use_xattr yaffs2 u:object_r:labeledfs:s0;

本地策略模块

  • vi xx.cil
  • (allow cupsd_lpd_t cupsd_var_run_t (sock_file (read))) 此为CIL语言 ```shell #这是m4语言,效果相等 module local_cupslpd-read-cupssock 1.0;

require { type cupsd_var_run_t; type cupsd_lpd_t; class sock_file read; }

#============= cupsd_lpd_t ============== allow cupsd_lpd_t cupsd_var_run_t:sock_file read; ```

  • semodule -i xx.cil
  • sesearch -A –source=cupsd_lpd_t –target=cupsd_var_run_t –class=sock_file –perm=read