SELinux简介
在SELinux带给Linux的主要价值:提供了一个灵活的,可配置的MAC机制
Security-Enhanced Linux(SELinux)由以下两部分组成:
- Kernel SELinux模块(/kernel/security/selinux)
- 用户态工具
安全增强型Linux(SELinux)开始是由NSA(国家安全局)启动并加入到Linux系统中的一套核心组件及用户工具,可以让应用程序运行在其所需的最低权限上。SELinux提供了一种灵活的强制访问控制(MAC)系统,且内嵌于Linux Kernel中。SELinux定义了系统中每个“用户”,“进程”,“应用”和“文件”的访问和转变的权限,然后他使用一个安全策略来控制这些实体(用户、进程、应用和文件)之间的交互,安全策略将指定如何严格或宽松地进行检查。
SELinux对系统用户(system users)是透明的,只有系统管理员(root)需要考虑在他的服务器中如何制定严格的策略。策略可以根据需要是严格的或宽松的。只有同时满足了“标准Linux访问控制”和“SELinux访问控制”时,主体才能访问客体。
DAC和MAC的关键区别(root用户)
- 未启用SELinux的Linux系统是使用自主访问控制模型(DAC)的,用户可以自己请求更高的权限,由此恶意软件几乎可以访问任何它想访问的文件,而如果你授予其root权限,那它几乎无所不能了。
- 在SELinux中没有root这个概念,安全策略是由管理员来定义的,任何软件都无法取代它。这意味着那些潜在的恶意软件所能造成的损害可以被控制在最小。一般情况下只有非常注重数据安全的企业级用户才会使用SELinux。强制访问控制模型(MAC)原本就是为军队开发的。
- SELinux实现了一个更灵活的MAC形式,叫做类型强制和一个非强制的多层安全模型。DAC最根本的弱点是主体容易受到多种多样的恶意软件的各攻击,MAC就是避免这些攻击的出路。
SELinux的运行机制
当一个subject(主体,如:一个应用)视图访问一个object(客体,如:一个文件),Kernel中的策略执行服务器将检查AVC(Access Vector Cache),在AVC中,subject和object的权限被缓存(cached)。如果基于AVC中的数据不能做出决定,则请求安全服务器,安全服务器在一个矩阵中查找“应用+文件”的安全环境。然后根据查询结果允许或拒绝访问,拒绝消息细节写入/var/log/messages。
SELinux伪文件系统
/sys/fs/selinux 伪文件系统类似于/proc/伪文件系统;它存储了SELinux系统的状态。系统管理员和用户不需要操作这部分(通常借助相关命令修改其状态)
SELinux配置文件
- 位于/etc/selinux(该目录存放主配置文件和所有策略文件)下
- /etc/sysconfig/selinux是/etc/selinux/config主配置文件的符号链接
- /etc/sysconfig/selinux中包含如下配置选项:
- 打开或关闭SELinux
- 设置系统执行哪一个策略(policy)
- 设置系统如何执行策略(policy)
- /etc/sysconfig/selinux中的配置选项
- SELINUX=enfocing,定义SELinux运行状态
- Enforcing:SELinux安全策略置于强制模式
- Permissive:SELinux安全策略置于告警模式
- Disabled:SELinux完全被禁用。SELinux内核和伪文件系统脱钩,处于未注册状态
- SELINUXTYPE=targeted,定义SELinux策略模型
- Targeted,类型强制(TE,Type Enforcement)访问控制,基于目标策略进行保护
- Minimum,Targeted策略模型的修改版本。仅针对选定的过程实施保护。
- MLS:多层次安全保护模型(MLS,Multi-Level Security)
SELinux命令工具
-
setenforce 0/1 修改SELinux运行模式
-
getenforce 查看SELinux模式
-
sestatus -v 显示系统的详细信息
-
chocon 修改对象(文件)的安全上下文。比如用户:角色:类型:安全级别
-
用法:
- chcon [选项]… 环境 文件…
- chcon [选项]… [][][-u 用户] [-r 角色] [-t 类型] [-l 范围] [-t 类型] 文件…
- chcon [选项]… --reference=参考文件 文件…
-
SELinux的策略与规则管理相关命令有:getsebool命令、setsebool命令、semanage命令
-
setsebool命令,用于修改SELinux策略内各项规则的布尔值
- 语法:setsebool [-P] 布尔值 = [0|1]
- 选项:-P:直接将设置值写入配置文件,该设置数据将来会生效的
- eg:setsebool -P allow_ftpd_ampm_write=1
-
getsebool命令,用来查询SELinux策略内各项规则的布尔值
- 语法:getsebool [-a] [布尔值条款]
- 选项:-a:列出当前系统所有布尔值条款设置值
- eg: getsebool -a
-
semanmage命令,用来查询与修改SELinux默认目录的安全上下文
深入理解SELinux中的安全上下文
- 安全上下文是一个简单的、一致的访问控制属性,在SELinux中,类型标识符是安全上下文的主要组成部分,由于历史原因,一个进程的类型通常被称为一个域(domain),“域”和“域类型”意思都一样,我们不必苛刻地去区分或避免使用术语域;通常,我们认为域、域类型、主题类型和进程类型都是同义的,即都是安全上下文中的“TYPE”
- SELinux对系统中的许多命令做了修改,通过添加一个“-Z”选项现实客体和主体的安全上下文
- 主体:系统根据PAM子系统中的pam_selinux.so模块设定登录者运行程序的安全上下文
- 客体文件的Security Context规则如下:
- rpm包安装的:会根据rpm包内记录来生成安全上下文
- 手动创建的文件:会根据policy中的规定来设置安全上下文
- cp:会重新生成安全上下文
- mv:安全上下文则不变
- 安全上下文的格式
- 在SELinux中,访问控制属性叫做安全上下文。所有客体(文件、进程间通讯管道、套接字、网络主机等)和主体(进程)都有与其关联的安全上下文,一个安全上下文由三部分组成:用户、角色和类型标识符。常常用下面的格式指定或显示安全上下文:USER:ROLE:TYPE[LEVEL]
- 安全上下文中的用户和角色标识符对类型强制访问控制策略没什么影响
- 对于进程,用户和角色标识符显得更有意义,因为它们把控制类型和用户标识符联合,这样就会与Linux用户账号关联起来
- 对于客体,用户和角色标识符几乎很少使用,为了规范管理,客体的角色常常是object_r,客体的用户常常是创建客体的进程的用户标识符,它们在访问控制上没什么用
- 标准Linux安全(DAC)中的用户ID和SELinux安全上下文中的用户标识符分别用于标准(DAC)的和安全增强(MAC)的访问控制机制;两者之间的任何一个相互关联都是通过登陆进程按照规范严格规定的,而不是通过SELinux策略直接强制实施的。