【Linux】SELinux 介绍


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

    类型

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

    角色

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

    role user_r user_passwd_t

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

    安全上下文

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

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

转换

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

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

    强制访问控制(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