Planet X

SELinux初探

SELinux的定义

​ SELinux(Security-Enhanced Linux 是Linux的一个强制访问控制(MAC)安全模块,由NSA(The National Security Agency) 和SCC(Secure Computing Corporation)开发,是 Linux 上最杰出的新安全子系统。它通过LSM(Linux Security Modules)框架被集成到Linux Kernel 2.6.x中。

​ 笔者对SELinux最简单直观的理解是:一个进程的主体只能访问到它完成任务所需要的最少的文件,只能执行它完成任务所需的最少的操作,不再授予任何任何更高的权限。

访问控制方法的比较

自主访问控制 DAC

​ 基于 UNIX® 的系统使用一种自主访问控制(discretionary access control,DAC)的形式。此方法通常根据对象所属的分组来限制对对象的访问。例如,Linux 中的文件有一个所有者、一个分组和一个权限集。权限定义谁可以访问给定文件、谁可以读取它、谁可以向其写入,以及谁可以执行它。(即在Linux中对某个文件使用ls -l 命令看到的 -rwxrwxrwx)

​ 存在的问题:

  • 文件目录的所有者可以对文件进行所有的操作,这给系统整体的管理带来不便
  • SUID程序的权限升级:如果设置了SUID权限的程序有漏洞的话,
    就很容易被攻击者所利用
强制访问控制 MAC

​ 使用最小特权原则 :程序只能执行完成任务所需的操作。限制主体或发起者访问或对对象(客体)执行某种操作的能力。主体通常指用户,或代表用户意图运行进程或设备,对象可能是文件、目录、TCP/UDP端口、共享内存段、I/O设备等。主体和对象各自具有一组安全属性。每当主体尝试访问对象时,都会由操作系统内核强制施行授权规则——检查安全属性并决定是否可进行访问。任何对象对任何对象的任何操作都将根据一组授权规则(也称策略)进行测试,决定操作是否允许。

基于角色的访问控制 RBAC

​ 在 RBAC 中,权限是根据安全系统所授予的角色来提供的。角色的概念与传统的分组概念不同,因为一个分组代表一个或多个用户。一个角色可以代表多个用户,但它也代表一个用户集可以执行的权限。

SELinux将MAC和RBAC都添加到了Linux中。

安全上下文

​ 所有操作系统访问控制都是以关联的客体和主体的某种类型的访问控制属性为基础的。在SELinux中,访问控制属性叫做安全上下文。所有客体和主体都有与其关联的安全上下文,一个安全上下文由三部分组成:用户(USER)、角色(ROLE) 和类型标识符(TYPE)。常常用下面的格式指定或显示安全上下文:

USER:ROLE:TYPE [ LEVEL [:CATEGORY] ]

USER (用户)

  • User Identity:类似Linux系统中的UID,提供身份识别,用来记录身份;安全上下文的一部分;
  • 三种常见的 user:
    • user_u :普通用户登录系统后的预设;
    • system_u :开机过程中系统进程的预设;
    • root :root 登录后的预设;
  • 在 targeted policy 中 users 不是很重要;在strict policy 中比较重要,所有预设的 SELinux Users 都是以 “_u” 结尾的,root 除外。

ROLE (角色)

  • 文件、目录和设备的role:通常是 object_r;
  • 程序的role:通常是 system_r;
  • 用户的role:targeted policy为system_r; strict policy为sysadm_r、staff_r、user_r;用户的role,类似系统中的GID,不同角色具备不同的的权限;用户可以具备多个role;但是同一时间内只能使用一个role;
  • 使用基于RBAC(Roles Based Access Control) 的strict和mls策略中,用来存储角色信息

TYPE (类型标识符)

  • type用来将主体和客体划分为不同的组,给每个主体和系统中的客体定义了一个类型;
    • 当一个类型与执行中的进程相关联时,其type也称为domain;
  • 为进程运行提供最低的权限环境;
  • type是SElinux security context 中最重要的部位,是 SELinux Type Enforcement 的心脏,预设值以_t结尾;
  • 需要特别指出的是,因为SELinux的主要访问控制特性是类型强制,安全上下文中的类型标识符决定了访问权。

Tips:SELinux只是在标准Linux基础上增加了类型强制(TE: Type Enforcement),这就意味着标准Linux和SELinux访问控制都必须满足先要能访问一个客体,例如:如果我们对某个文件有SELinux写入权限,但我们没有该文件的w许可,那么我们也不能写该文件。

Linux安全模块(LSM)

​ 在很久以前,有很多类似于SELinux的安全访问控制模型和框架被研究和开发出来,用以增强Linux系统的安全性,但是由于没有一个系统能够获得统治性的地位而进入Linux内核成为标准;并且这些系统都大多以各种不同的内核补丁的形式提供,使用这些系统需要有编译和定制内核的能力,对于没有内核开发经验的普通用户,获得并使用这些系统是有难度的。

​ Linux内核的创始人Linus Torvalds指出Linux内核确实需要一个通用的安全访问控制框架,但他指出最好是通过可加载内核模块的方法,这样可以支持现存的各种不同的安全访问控制系统。因此,Linux安全模块(LSM)应运而生。

​ Linux安全模块(LSM)是Linux内核的一个轻量级通用访问控制框架。它使得各种不同的安全访问控制模型能够以Linux可加载内核模块的形式实现出来,用户可以根据其需求选择适合的安全模块加载到Linux内核中,从而大大提高了Linux安全访问控制机制的灵活性和易用性。目前已经有很多著名的增强访问控制系统移植到Linux安全模块(LSM)上实现,包括POSIX.1e capabilities,安全增强Linux(SELinux),域和类型增强(DTE),以及Linux入侵检测系统(LIDS)等等。

​ SElinux就是通过LSM框架集成到Linux系统中的:

SELinux and LSM

SELinux的体系结构

FLASK架构

​ 整个安全性体系结构称为 Flask。

​ 在 Flask 体系结构中,安全性策略的逻辑通用接口一起封装在与操作系统独立的组件中。

​ 这个单独的组件称为安全性服务器(虽然它只是个内核子系统而已)。该服务器的 SELinux 实现定义了一种混合的安全性策略,由类型实施 (TE)、基于角色的访问控制 (RBAC) 和可选的多级别安全性 (MLS) 组成,所以广泛用于军事安全性中。

通用接口用于获得安全性策略决策。

FLASK结构图

SELinux运行机制

​ 当一个subject(如: 一个应用)试图访问一个object(如:一个文件),Kernel中的策略执行服务器将检查AVC (Access Vector Cache), 在AVC中,subject和object的权限被缓存(cached)。如果基于AVC中的数据不能做出决定,则请求安全服务器,安全服务器在一个矩阵中查找“应用+文件”的安全环境。然后根据查询结果允许或拒绝访问,拒绝消息细节位于/var/log/messages中。

SELinux的相关操作

SELinux 配置文件

​ 在Ubuntu系统下,/etc/selinux/是存放所有策略文件和主要配置文件的目录。

​ 配置文件位于:/etc/selinux/config

​ 编辑配置文件,其中包含如下配置选项:

  • 打开或关闭SELinux及设置SELinux的状态(permissive|enforcing)

    SELINUX=enforcing|permissive|disabled

    ​ • enforcing — The SELinux security policy is enforced.

        • permissive — The SELinux system prints warnings but does not enforce policy.
    
        • disabled — SELinux is fully disabled. 
    
  • 设置系统执行哪一个策略(targeted|strict )

    SELINUXTYPE=targeted|strict

    ​ • targeted — 只有目标网络daemons保护

    ​ • strict — 对SELinux执行完全的保护。为所有的subjects和objects定义安全环境,且每一个Action由策略执行服务器处理。提供符合Role-based-Access Control(RBAC)之policy,具备完整的保护功能,保护网络服务、一般指令及应用程序

  • 控制如何设置本地定义(users|booleans)

    SETLOCALDEFS=0|1

    ​ • 1:这些定义由load_policy控制,load_policy来自于文件/etc/selinux/

    ​ • 0:由semanage控制

SELinux工具(命令)

sestatus -v

​ 显示系统的详细状态

getenforce

​ 显示SELinux当前状态(disabled|enforcing|permissive)

setenforce

​ 修改SELinux运行模式

​ • setenforce 1 — SELinux以强制(enforcing)模式运行

    • setenforce 0 — SELinux以警告(permissive)模式运行

​ 为了关闭SELinux,可以修改配置文件,改为disabled

getsebool -a

​ 查看所有布尔值

​ 后接相应的布尔值变量名可以查看单个布尔值

setsebool

​ 设置布尔值,参数-P,永久性设置。

​ 例如:setsebool -P ftpd_disable_trans 1

文件操作
ls -Z

​ 查看安全上下文。例如:

1
2
jerry@ubuntu:~$ ls -Z a.txt
system_u:object_r:file_t:s0 a.txt
chcon
    更改文件的标签。例如:
1
2
3
jerry@ubuntu:~$ chcon -t etc_t a.txt
jerry@ubuntu:~$ ls -Z a.txt
system_u:object_r:etc_t:s0 a.txt
restorecon
    当这个文件在策略里有定义时,可以恢复原来的文件标签。
cp
    可以跟 -Z 在拷贝的时候指定目的地文件的安全上下文
find
    可以跟 –context 查特定的type的文件
ps -Z
    查看当前正在运行的进程的安全上下文(进程domain的确认)
id -Z
    显示你的shell的安全上下文
模块操作
checkmodule
    编译模块
semodule_package
    创建新的模块
semodule
    可以显示、加载、删除模块
semanage
    这是一个功能强大的策略管理工具,有了它即使没有策略的源代码,也可以管理安全策略。

参考资料