0%

SELinux 学习笔记

因为项目要求学习了一下 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
2
3
4
allow Rule | source_domain |  target_type  :  class  | permission
-----------▼---------------▼-------------------------▼------------
allow unconfined_t ext_gateway_t : process transition;

允许 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
    9
    sensitivity 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