【linux】SELinux | AppArmor | Seccomp

SELinux

Kernel2.6之后引入,由美国国家安全局开发,作为一个强制访问控制架构。

SELinux主要是红帽以及它的衍生发行版linux 的一个工具;Ubuntu/SUSE以及它的衍生发行版本使用的是AppArmor。但也可以在ubuntu上安装SELinux。

Linux上传统的访问控制标准是自主访问控制Discretionary Access Control(DAC)。在这种形式下,一个软件或守护进程以User ID(UID)或Set owner User ID(SUID)的身份运行,并且拥有该用户的目标(文件、套接字、以及其它进程)权限。这使得恶意代码很容易运行在特定权限之下,从而取得访问关键的子系统的权限。

另一方面,强制访问控制Mandatory Access Control(MAC)基于保密性和完整性强制信息的隔离以限制破坏。该限制单元独立于传统的Linux安全机制运作,并且没有超级用户的概念。

如何工作

相关概念:

  • 主体Subjects
  • 客体Objects
  • 策略Policy
  • 模式Mode

当一个主体Subject(如一个程序)尝试访问一个目标Object(如一个文件),SELinux安全服务器从策略数据库Policy DB中运行一个检查。基于当前的模式mode,如果SELinux安全服务器授予权限,该主体就能够访问该目标。如果SELinux安全服务器拒绝了权限,就会在/var/log/messages中记录一条拒绝信息。

模式

SELinux有三个模式。这些模式将规定SELinux在主体请求时如何应对。这些模式是:

  • enforcing 策略强制执行,基于SELinux策略规则授予或拒绝主体对目标的访问;
  • permissive 不强制执行,不实际拒绝访问,但会有拒绝信息写入日志
  • disabled 禁用SELinux

可以通过命令getenforce查看SELinux设置的模式,默认为Enforcing。
可以通过命令setenforce临时修改模式,setenforce 1 => enforcingsetenforce 0 => permissive。还可以修改/etc/selinux/config文件的SELINUX=
重启操作系统才能生效

策略

SELinux的策略有两种:

  • targeted,只有目标网络进程受保护(dhcpd httpd named ntpd portmap snmpd squid syslogd)
  • strict,对所有进程完全的SELinux保护

同样在etc/selinux/config中修改SELINUXTYPE=

cat /etc/selinux/config 

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

SELinux需要一个好的策略才能发挥最好的效果,如果策略写的太宽松会发挥不了作用,太严格又会引来很多麻烦。美国国家安全局将策略的指定交由Linux的发行商来做,红帽自己指定的一个基本的策略,一共包括25个系统服务:ypbind,dhcpd,httpd,mysqld,named,nscd,ntpd,pegasus,portmap,postgresql,snmpd,squid,syslogd,winbind,use_nfs_home_dirs。

策略的内容在/etc/selinux/targeted目录下,包括三个主要文件:

  • booleans:存放targeted policy中每个限制的布尔值;
  • contexts/:存储targeted policy中的security contexts;
  • policy/:存放二进制policy文件policy.31。

检查SELinux状态

sestatus -v
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      31

Process contexts:
Current context:                unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Init context:                   system_u:system_r:init_t:s0
/usr/sbin/sshd                  system_u:system_r:sshd_t:s0-s0:c0.c1023

File contexts:
Controlling terminal:           unconfined_u:object_r:user_devpts_t:s0
/etc/passwd                     system_u:object_r:passwd_file_t:s0
/etc/shadow                     system_u:object_r:shadow_t:s0
/bin/bash                       system_u:object_r:shell_exec_t:s0
/bin/login                      system_u:object_r:login_exec_t:s0
/bin/sh                         system_u:object_r:bin_t:s0 -> system_u:object_r:shell_exec_t:s0
/sbin/agetty                    system_u:object_r:getty_exec_t:s0
/sbin/init                      system_u:object_r:bin_t:s0 -> system_u:object_r:init_exec_t:s0
/usr/sbin/sshd                  system_u:object_r:sshd_exec_t:s0

ls -Z # 查看文件的selinux上下文信息
ps- Z # 进程的selinux域信息
restorecon -R /var/www # 恢复一个文件的模式selinux上下文
chcon --reference=/etc/named.conf.org /etc/named.fon # 修改一个文件的selinux上下文

总的来说,SELinux策略比较复杂,但是对于docker十分友善,因为Docker SELinux模块已经帮我们做了哪些复杂的SELinux策略,用户只需要在Docker daemon启动的时候加上--selinux-enabled=true选项就可以了。可以使用-security-opt选项来对指定的文件做限制。使用方法待补充

AppArmor

AppAromor的主要作用是设置某个可执行程序的访问控制权限,可以限制程序读写某个文件、目录,打开读写网络端口等。AppArmor安全策略可以完全定义个别应用程序所能访问的系统资源与各自的特权。

Docker daemon在启动的过程中会去判断当前内核是否支持AppArmor,若支持,就创建默认的Apparmor配置文件/etc/apparmor.d/docker,并应用这个配置文件。启动容器时,在初始化过程中Docker会使用相应的AppArmor配置作用于容器。也可以使用--security-opt选项来指定作用于容器的AppArmor配置文件。

目前在支持SELinux的系统上,Docker的SELinux不是默认打开的,需要手动加上--selinux-enabled=true,而支持AppAromor的系统上,默认时打开的。

Seccomp

Seccomp时linux内核提供的安全特性,以白名单或黑名单的方式限制进程进行系统调用。Seccomp