因为项目要求学习了一下 SELinux,学习笔记记录如下。
Overview
- Linux 的强制访问控制(MAC)
- 执行管理员定义的安全策略
- 涵盖所有进程、客体、操作
- 基于安全上下文
- 将程序限制在某个域内,保证它仅拥有能完成工作的最小权限。如果程序需要访问资源,需要查询策略是否允许。
强制访问控制(MAC)
Linux 默认自主访问控制(DAC):主体是用户,允许用户进行策略决策
MAC:操作系统通过查询主客体的安全属性来判断主体能否对客体进行某种操作。
对于 SELinux:
- 主体:进程
- 客体:系统资源(文件、套接字等)
- 安全属性:安全上下文
- 安全服务根据安全策略来授权访问
SELinux 的安全机制
- 基于角色的访问控制(RBAC)
- 类型增强(TE):进程在域中运行,操作由策略控制
- 多级安全(MLS)
- 防泄密(禁止上读和下写)
- 多类别安全(MCS)
安全上下文
- 所有主体与客体都有一个安全上下文,用于判断主体的操作是否放行
user:role:type [:range]
user
:SELinux 用户,可与多个 Role 关联role
:角色,可与多个类型关联type
:类型- 与主体关联时,表示进程可访问的域
- 与客体关联时,表示用户对该客体的访问权限
range
:也叫 level,用于 MLS- 敏感度(Sensitivity)
- 组别(category)
客体类别和操作
客体类别:文件、套接字、进程
- 进程:执行、繁殖、获取进程属性
- 文件:创建、打开、读写、关闭、执行
- 套接字
- 进程间通信
- 网络
- 系统
- 安全
- 能力
- 用户态客体
- 其他
安全上下文的生成与变化
- 初始值
- 继承自父进程
- 第一个进程的上下文是
SECINITSID_KERNEL
对应的上下文
- 改变上下文
- 进程
- 系统调用
execve
- 写
/proc/self/attr/current
文件
- 系统调用
- 文件:修改文件扩展属性
security.selinux
- 进程
SELinux 策略
- 基本定义:用户、角色、类型、多级安全
- 安全上下文定义:初值、来源
- 安全上下文转换:角色转换、类型转换(域转换)、多级安全转换
- 访问控制:允许源域对目的域上的类进行某操作
1 | allow Rule | source_domain | target_type : class | permission |
允许 unconfined_t
域下运行的进程在网关程序执行时将其转换为 ext_gateway_t
域
域转换
- 指在域
a
下的一个进程启动另一个在域b
下运行的进程(具有不同的安全上下文)。 type_transition unconfined_t secure_services_exec_t : process ext_gateway_t;
- 指
unconfined_t
域下的进程在执行secure_services_exec_t
类型的文件时,进程必须转换为ext_gateway_t
域(如果策略允许的话) allow unconfined_t ext_gateway_t : process transition;
allow unconfined_t secure_services_exec_t : file { execute read getattr };
allow ext_gateway_t secure_services_exec_t : file entrypoint;
- 指
MLS 与 MCS
定义
- 定义:1 个敏感度 + 多个组别 = 等级(level)
1
2
3
4
5
6
7
8
9sensitivity s0;
sensitivity s1;
dominance { s0 s1 } # s1 dominates s0
category c0;
category c1;
level s0:c0.c1;
level s1:c0.c1; - MCS 没有敏感度,或者说只有一个敏感度
关系
- Level 1 支配 Level 2
- 1 的敏感度大于等于 2,1 的组别包含或等于 2
- Level 1 被 Level 2 支配
- 1 的敏感度小于等于 2,1 的组别等于或被 2 包含
- Level 1 等于 Level 2
- 敏感度与组别均相等
- Level 1 与 Level 2 无关
虚拟文件系统
TBD
核心组件
- 主体
- 客体管理器
- 安全服务
- 访问向量缓存
SELinux 执行模式
- Enforcing
- Permissive
- Disabled