【Linux】SELinux 介绍

admin / Linux / / 3721 字 · 约 16 分钟 / 465 次阅读 /

SELinux

1999 年夏天美国国家安全局(NSA)开始在 Linux 内核中实现 Flask 安全架构。次年 12 月,NSA 发布了这项研究的第一个版本,叫做安全增强的 Linux,即最早版本的 SELinux,SELinux 最迟是在 Linux2.2.x 内核中以一套内核补丁的形式发布的。 在 2001 年的核心高峰会上,NSA 以普通的 Linux 为基础架构提出了安全增强的 Linux 机制并使用较具有弹性的 MAC 和 Flask 架构,将安全等级提升为 B1,同时具有数据标记及强制的存取控制,号称当时最安全的 Linux 操作系统。SELinux 可以被用来限制程序为最小的权限,保证程序及数据的完整性及机密性。在已分散权限下,同时利用 SELinux 进一步发展其他相关系统,例如,以 SELinux 为基础所开发的分布式嵌入系统 MYSEA。

计算机安全级别
  • D 级别是最低的安全级别,对系统提供最小的安全防护。系统的访问控制没有限制,无需登陆系统就可以访问数据,这个级别的系统包括 DOS,WINDOWS98 等。
  • C1 级称为选择性保护级(Discrtionary Security Protection)可以实现自主安全防护,对用户和数据的分离,保护或限制用户权限的传播。
  • C2 级具有访问控制环境的权力,比 C1 的访问控制划分的更为详细,能够实现受控安全保护、个人帐户管理、审计和资源隔离。这个级别的系统包括 UNIX、LINUX 和 WindowsNT 系统。
  • B1 级称为标识安全保护(Labeled Security Protection)。
  • B2 级称为结构保护级别(Security Protection),要求访问控制的所有对象都有安全标签以实现低级别的用户不能访问敏感信息,对于设备、端口等也应标注安全级别。
  • B3 级别称为安全域保护级别(Security Domain),这个级别使用安装硬件的方式来加强域的安全,比如用内存管理硬件来防止无授权访问。
  • A 级称为验证设计级(Verity Design),是目前最高的安全级别,在 A 级别中,安全的设计必须给出形式化设计说明和验证,需要有严格的数学推导过程,同时应该包含秘密信道和可信分布的分析,也就是说要保证系统的部件来源有安全保证,例如对这些软件和硬件在生产、销售、运输中进行严密跟踪和严格的配置管理,以避免出现安全隐患。

SELinux 架构

  1. 身份

在 SELinux 中,身份的概念不同于传统 UNIX uid(user id),它们可以共存于一个系统。SELinux 中的身份是安全上下文的一部分,它会影响那个域可以进入。允许 su - 用户名命令不会改变 SELinux 中的身份。

1.

策略

> 策略是指可以设置的规则,决定了例如一个角色的用户可以访问什么;哪个角色可以进入哪个域和哪个域可以访问哪个类型等问题。
>

2.

> 所有进程都在域中运行,域直接决定了进程的访问。域基本上是一个进程可以进行操作的列表,或者说它决定了进程可以对哪些类型进行操作。域就好比一个标准的 UNIX uid。假设一个属于 root 的用户的可执行程序被设置了 setuid,那么这个系统上的所有用户只要可以执行这个程序或者命令,就有可能获得 root 的权限。但是在 SELinux 中,如果一个正在正在执行的进程想要转换到特权域中进行执行,若这个进程的角色被设置成不允许进入特权域,那么这个进程就不能执行。例如 sysadm_t 是系统管理域,user_t 是无特权用户域。init 允许在 init_t 域,named 允许在 named_t 域。
>

3.

类型

> 类型是分配给一个对象的并决定谁可以访问这个对象。类型是分配给目录、文件、套接字的。
>

4.

角色

> 角色决定了哪些域可以使用。有关哪些域可以被哪些角色使用可以预先定义在策略的配置文件中,如果一个策略数据库中定义了一个角色不可以使用一个域,那它将会被拒绝。 如果允许一个属于 uesr_r 角色的用户执行 passwd 命令,那么必须在相关的策略配置文件中进行设置:
>

role user_r user_passwd_t

> 这样设置了一个属于 user_r 角色的用户被允许进入 user_passwd_t 这个域,也就是说他可以执行 passwd 命令
>

5.

安全上下文

> 它包括所有事情属性的描述,有文件、目录、进程、TCP Sockets 和上面介绍的内容。可以使用 id 命令可以查看当前用户的上下文
>

chsid(改变安全 ID)和 chcon 命令(改变安全上下文)不能再/proc 文件系统中使用。 文件的安全上下文会根据创建这个文件进程的域而改变。通常情况下,一个文件或目录的安全上下文是从父目录那里继承的,当然也可以通过策略的改变来改变这种设置。

1.

转换

> 是否发生转换,主要根据上下文来进行判断。有两种主要的转换:执行了一个被限定了类型的程序是会发生进程域的转换;二是在特殊的目录下创建文件时会发生文件类型的转换。
>

2.

自主访问控制(DAC)

> DAC 是一种允许经过授权的用户改变课题的访问控制属性的访问控制机制,由此明确指出其他用户是否有权访问这个客体。例如,文件所有者拥有指定文件的访问权限,只授予可以信任的用户访问文件的权限。
>

3.

强制访问控制(MAC)

> 它是强行加给访问主体的,即系统强制主体服从访问控制策略。
>

SELinux 系统流程

提供策略语言供系统管理者来制定安全策略,并由核心层进行存取控制检查。SELinux 将系统核心与安全策略捆绑在一起,并通过系统呼叫方式检查是否有存取权限。

SELinux 特点

  1. MAC(Mandatory Access Control):对访问的控制彻底化,对所有文件、目录、端口的访问都是基于策略设置的
  2. RBAC(Role Base Access Control):对于用户只赋予最小权限。对于用户来说,被划分成一些 role,即使是 root 用户,如果不在 sysadm_t 里,也不能执行 sysadm_t 中的管理操作。
  3. TE(Type Enforcement):对进程只赋予最小的权限。特点是对文件赋予一个 type 的标签,对于进程赋予一个叫domain的标签
  4. domain 迁移:防止权限升级

SELinux 的决策进程

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/9649ddd9-3875-4432-a46b-da2489eb659f/LSaWa6m.png

当一个主体(subject)(可能是一个应用程序)要访问一个客体(object)(如一个文件)时,内核中的安全策略强制服务器检查 AVC(Access Vetor Cache,访问向量缓存),其中缓存中保存着主/客体的权限。如果 AVC 中的数据不足以进行决策的话,该请求会继续并到达安全服务器,该服务器会查看这个应用程序的上下文以及那个矩阵中的文件。根据查看的结果,访问权限可能被授予,也可能被拒绝。如果被拒绝会将信息记录在/var/log/messeges 文件中。主体和客体的安全上下文是由所安装的安全策略决定的。

SELinux 的布尔值和上下文配置

policy 概述

把 policy 想象成使用者要执行程序,或者进程要启动时,系统会依照 policy 所制定的内容检查使用者或进程相应的权限,如果全部权限都符合策略,系统就会允许这个操作。

目标策略的 booleans 属性设置

SELinux 中内建了许多 booleans 参数,SELinux 的 booleans 属性操作的两个常用命令

1. getsebool -a
# 取得所有booleans属性的状态
2. setsebool
格式setsebool [-P] boolean value
setsebool -P http_enable_homedirs 1
    单独为某服务关闭SELinux机制
# setsebool -P [program 服务名称]_disable_trans=1
# setsebool -P dhcp_disable_trans=1 #关闭dhcp的SELinux检查机制

目标策略的 contexts 属性设置

它可以用来设置每个用户、进程、文件及目录的属性,可针对某个进程的某个行为进行严格的读写限制。

1.SELinux 上下文格式

system_u:object_r:selinux_config_t:s0

2.安全上下文属性操作命令

# ls -alZ
# 查看目录的上下文属性
# ps -eZ
# 查看进程的上下文属性

3.设置上下文属性命令

# restorecon -v -R /home
#重写目录下所有文件的上下文
# chcon user_u:object_r:public_content_rw_t -R /home
# 手动更改home目录的上下文

SELinux 和网络服务配置

SELinux 安全防护措施集中在各种网络服务的访问控制上。对于 apache、samba、FTP、NFS、MySQL 数据库来说,SELinux 仅开放了最基本的运行需求。

Apache 与 SELinux

Apache 默认运行在受限的 httpd_t 域中。

# ps -eZ |grep httpd

unconfined_u:system_r:httpd_t:s0 2429 ?        00:00:00 httpd

# SELinux上下文相关的httpd进程是
unconfined_u:system_r:httpd_t:s0。进程都运行在httpd_t域,文件类型都必须设置正确,让httpd访问。

例如,httpd可以读取的文件类型为httpd_sys_content_t,但不能修改;httpd可以读写的文件类型httpd_sys_content_rw_t。必须设置某些bool值开启某些行为,允许httpd进行访问,允许httpd访问NFS和CIFS文件系统。

(1). 修改某个文件夹作为 Apache 的根文档目录。

# mkdir /www
# chcon -R -t httpd_sys_content_t /www
# 修改
    DocumentRoot "/www"
# 如果要彻底修改/www 的文件类型属性,使用semanage fcontext和restorecon命令:
    semanage fcontext -a -t httpd_sys_content_t "/www(/.*)?"
    restorecon -R -v /www/

(2). 共享 NFS 和 CIFS 文件系统

# setsebool -P httpd_use_nfs on
# setsebool -P httpd_use_cifs on

(3). 修改端口号

# 使用命令修改
# semanage port -a -t http_port_t -p tcp 12345
# 查看并确认
# semanage port -l | grep http
    http_port_t     tcp     12345, 80, 443, 488, 8008, 8009, 8443

Samba 与 SELinux

samba 默认情况下只能读写 samba_share_t 类型的文件,不能读写 httpd_sys_content_t 类型的文件。

# 开放samba_enable_home_dirs布尔值变量
# setsebool -P samba_enable_home_dirs on

Vsftpd 与 SELinux

默认情况下 vsftpd 服务器的 vsftpd 守护进程都是在受限的 ftpd_t 域中运行的

# setsebool -P ftp_home_dir on
# 修改ftp主目录/myftp的文件属性为public_content_t
# semanage fcontext -a -t public_content_t /myftp
# restorecon -R -v /myftp
# 修改ftp子目录的文件属性为public_content_rw_t
# semanage fcontext -a -t public_content_rw_t "/myftp/pub(/.*)?"
# restorecon -R -v /myftp/pub
# 开放布尔值
# setsebool -P ftp_home_dir on
# setsebool -P allow_anon_write on

NFS 和 SELinux

NFS 服务器受限在 nfs_t 域中运行的,并且与其他网络服务隔离

# 将本机的NFS共享目录设置可读可写
# setsebool -P nfs_export_all_rw on
# 将远程NFS服务器的目录共享到本地
# setsebool -P use_nfs_home_dirs on

MySQL 和 SELinux

MySQL 服务受限在 mysqld_t 域中运行。

# 修改数据库存储位置
# mkdir /opt/mysql
# cp -a /var/lib/mysql/* /opt/mysql
# chowm mysql:mysql /opt/mysql
# semanage fcontext -a -t mysql_db_t "/opt/mysql(/.*)?"
# restorecon -R -v /opt/mysql
# vim /etc/my.com
    datadir=/opt/mysql

DNS 和 SELinux

admin

admin

云原生架构 · 全栈开发

感谢阅读本文!记录系统架构思考与实战复盘。专注于 Python、Django、PostgreSQL 与云原生容器化工程实践。