- 访问控制类型
- SELinux
- 1. 源doamin 必须要有执行这个执行档的权限
- 让init_t域中的进程(0号进程、systemd)能够执行type为apache_exec_t的文件
- 2. 源domain 必须有权限切换到目标domain
- 允许init_t中的进程切换进入apache_t域
- 3. 执行档必须是目标domain的入口(Entry Point)
- 设置apache_t域入口(entrypoint)权限为执行apache_exec_t类型的文件
- 4. 执行domain切换
访问控制类型
- 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