☞SELinux

☞SELinux

概述

SELinux(Secure Enhanced Linux)是美国国家安全局(NSA)和SCC开发的Linux的一个强制访问控制的安全模块。2000年以GNU GPL发布,Linux内核2.6版本后集成在内核中。它能够限制权限,进程只能访问那些在他的任务中所需要文件。

Selinux是根据最小权限模型去限制进程在对象(如文件,目录,端口,网络接口等)上的访问或执行其他的操作的权限,这些限制可以在之后根据需要进行修改。简单来说,系统只给主体的基本功能所需要的权限

举例来说:如果系统上的Apache被发现存在一个漏洞,使得攻击者可以访问系统上的敏感文件(比如 /etc/passwd 来获得系统已存在用户) ,而修复该安全漏洞的 Apache 更新补丁尚未出现。此时 SELinux 可以起到安全效果,因为 /etc/passwd 文件不具有 Apache 的访问标签,所以 Apache 对于 /etc/passwd 的访问会被 SELinux 阻止。因此Selinux能有效的防范0day类的攻击。 
Tips:0day漏洞,是已经被发现(有可能未被公开),而官方还没有相关补丁的漏洞。

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

标准Linux SELinux
进程 真实有效的用户和组ID 安全上下文
文件 访问列表、文件用户和组ID 安全上下文
访问控制基础 进程用户/组ID和文件的访问模式,此访问模式基于文件的用户/组ID 在进程类型和文件类型之间允许的许可

了解SELinux

  • DAC、MAC 

    • Linux 上传统的访问控制标准是自主访问控制(DAC),如果一个用户被授权允许访问,意味着程序也被授权访问,那么恶意程序也将有同样的访问权。 DAC最根本的弱点是主体容易受到多种多样的恶意软件的攻击,使得恶意程序控制系统。

    • 强制访问控制(MAC)是基于策略规则决定控制的严格程度,策略被用来定义被限制的进程能够使用哪些资源,默认情况下,没有被明确允许的行为将被拒绝。

    • 只有同时满足了【标准Linux访问控制】和【SELinux访问控制】时,主体才能访问对象

  • 安全上下文 

    • 存放在Inode的扩展属性域的安全元素控制对象的访问

    • 所有文件和端口资源和进程都具备安全标签即安全上下文(security context)

    • USER:ROLE:TYPE[LEVEL[:CATEGORY]] 
      USER:类似Linux系统中的UID,提供身份识别,用来记录身份 
      • user_u :普通用户登录系统后的预设,在targeted policy中users不是很重要 
      • system_u :开机过程中系统进程的预设 
      • root :root 登录后的预设 
      ROLE:对象的角色 
      • 文件、目录和设备的role:通常是 object_r; 
      • 程序的role:通常是 system_r; 
      • 用户的role:targeted policy为system_r 
      • • 用户role类似系统中的GID,不同角色具备不同的的权限 
      • • 用户可以具备多个role,但是同一时间内只能使用一个role 
      TYPE:给subject和object划分为不同的组,给每个主体和系统中的客体定义一个类型;为进程运行提供最低的权限环境; 
      • type是SElinux security context 中最重要的信息,是 SELinux Type Enforcement的核心,预设值以 _t 结尾 
      • 当一个TYPE与执行中的
      进程相关联时,其type也称为domain,Domain标签能够执行的操作由安全策略里定义。 
      • 当一个文件为多服务共用时,其type为public_content_t 
      LEVEL:定义层次和分类,只用于mls策略中 
      • LEVEL:代表安全等级,默认为s0目前已经定义的安全等级为s0-s15,等级越来越高 
      • CATEGORY:代表分类,如FBI Secret,NSA secret,目前已经定义的分类为c0-c1023

    • 实际上下文 
      存放在文件系统中 
      ls -Z #检查文件、目录的安全上下文 
      ps -Z #检查进程的安全上下文,如 ps -eo user,label,pid,comm 或 ps axo … 
      id -Z #显示了你的shell的安全上下文

    • 期望上下文(默认):存放在二进制的SELinux策略库中 
      semanage fcontext -l

    • 文件的Security Contex规则 
      • rpm包安装的:会根据rpm包内记录来生成安全上下文; 
      • 手动创建的文件:会根据policy中规定的来设置安全上下文,如default_t; 
      • cp:会重新生成安全上下文; 
      • mv:安全上下文则不变;

  • SELinux工作流程 
    当一个subject(进程)试图访问一个object(文件),Kernel中的策略执行服务器将检查AVC (访问矢量缓存Access Vector Cache), 在AVC中,subject和object的权限被缓存(cached),如果基于AVC中的数据不能做出决定,则请求安全服务器,安全服务器查找“应用+文件”的安全环境。然后根据查询结果允许或拒绝访问,拒绝日志在
    /var/log/messages中 

  • ☞SELinux

  • SElinux 的状态 

    • Enforcing(强制模式):越权行为会被记录并且会被强制拒绝。

    • Permissive(宽容模式):越权行为只会被记录,不会被拒绝。

    • Disabled(关闭):禁用Selinux,访问不受控制;

  • 工作模式 

    • strict: centos5,每个进程都受到selinux的控制

    • targeted: 用来保护常见的网络服务,仅有限进程受到selinux控制,只监控容易被入侵的进程,rhel4只保护13个服务,rhel5保护88个服务

    • minimum:centos7,修改过的targeted,只对选择的网络服务

    • mls:提供MLS(多级安全)机制的安全性

    • minimum和mls稳定性不足,未加以应用

配置SELinux

  • Selinux伪文件系统 

    • /selinux目录,这是一个伪文件系统,存放策略文件,类似于/proc 目录,我们不需要操作它

  • Selinux的配置文件 

    • /boot/grub/grub.conf 
      使用参数selinux=0禁用SELinux

    • /etc/sysconfig/selinux = /etc/selinux/config 
      SELINUX={enforcing|permissive|disabled} 
      SELINUXTYPE={targeted|mls}

  • ☞SELinux

  • 如果需要修改文件和目录的 SELinux 类型属性时可以使用三个命令:chcon、semanage fcontext 和 restorecon 命令 。说明:使用 chcon 对文件的类型进行重新标识,重启系统时将不保留标识。对于文件类型的永久性改变,需要采用 semanage 命令。

  • 查看当前SELinux信息 

    • getenforce #查看Current mode

    • setenforce 0|1 #0: 设置为permissive,1: 设置为enforcing

    • sestatus -v #查看status、Current mode、file mode、关键进程Process context(Init,mingetty,sshd)、关键文件File contexts(passwd,shadow,login,bash,agetty)

  • chcon – change file SELinux security context 

    • chcon [OPTION]… [-u USER] [-r ROLE] [-t TYPE] FILE…

    • chcon [OPTION]… –reference=RFILE FILE…

    • -R:递归

    • CentOS系统自带的chcon工具只能修改文件、目录的安全标签,不能修改端口进行修改

  • restorecon – restore file(s) default SELinux security contexts. 

    • restorecon[-R] /path/file #根据现有的策略库进行还原,通过chcon修改的type将被还原

  • semanage – SELinux Policy Management tool 

    • yum -y install policycoreutils-python

    • 管理文件的安全上下文(主要是Type) 
      【查看】semanage fcontext -l 
      • semanage fcontext -l | grep ‘/var/www’ 查看 /var/www 目录的上下文 
      【增加】semanage fcontext -a -t httpd_sys_content_t ‘/website(/.*)?’
      【删除】semanage fcontext -d -t Type ‘target’ 
      • semanage fcontext -d -t httpd_sys_content_t ‘/website(/.*)?’

    • 管理端口的安全上下文 
      【查看】semanage port -l 
      • semanage port -l | grep -w ‘22’ 
      • semanage port -l | grep ‘http’ 
      【增加】semanage port -a -t port_label-p tcp|udp PORT 
      • semanage port -a -t http_port_t -p tcp 8520 
      【删除】semanageport -d -t port_label-p tcp|udp PORT 
      • semanage port -d -t http_port_t -p tcp 8520 
      【修改】semanageport -m -t port_label-p tcp|udp PORT 
      • semanageport -m -t http_port_t-p tcp 8520 #把已经存在的端口给http

  • 管理boolean值 

    • 【查看】getsebool [-a] [boolean] #off还是on 
      • semanage boolean -l #(current , default),有一句简单的描述 
      • semanage boolean -l | grep httpd_enable_homedirs 
      • semanage boollean -l -C #修改过的布尔值 
      • getsebool -a | grep httpd_enable_homedirs 
      • getsebool httpd_enable_homedirs

    • 【设置】setsebool[-P] BOOLEAN [on|off] 
      • setsebool httpd_enable_homedirs on #重启丢失 
      • setsebool -P httpd_enable_homedirs on #永久生效,修改default

  • 日志管理 

    • 通过分析日志找到问题,并根据提示修改SELinux的设置

    • 安全审计日志 /var/log/audit/audit.log #包含了SELinux的错误信息

    • 系统整体日志 /var/log/messages

    • 日志分析工具安装 
      yum install setroublesshoot*(重启生效)

    • 图形化的分析工具 
      ☞SELinux

    • 命令行分析工具 
      • grep ‘setroubleshoot’ /var/log/messages 
      • sealert-l UUID #复制messages中的run 后面的sealert -l xxxx到shell执行 
      • sealert-a /var/log/audit/audit.log #扫描分析审计日志中的SELinux信息,列出问题和解决办法

  • SELinux的常见警告类型和解决办法 

    • 标签错误 
      SELinux 的核心概念就是
      label,无论是文件系统、目录、文件、文件描述符、端口、消息接口还是网络接口,一切对象都被贴上了标签,主体只能访问功能所需的对象。如 apache 进程被黑客入侵且取得了 uid=0 的管理员权限,但是SELinux策略限制了apache 所能访问的对象。 
      SELinux 弹出标签类型的警告可以使用图形化的 sealert 工具查看,根据提示解决问题。也可以在系统日志中过滤 setroubleshoot 找到问题,根据执行 sealert -l UUID获得解决办法,或者sealert -a 扫描 audit.log 审计日志,也可以找到解决办法。

    • 布尔值错误 
      SELinux 策略中记录了许多程序的默认运行范围,并且只赋予了基本功能所需的权限。当我们开启了程序的其他功能时,如打开 apache 访问私人网站的功能,SELinux会限制 boolen 为 off 的越权行为。 
      Apache 能够进入用户的网站目录,但是无法访问文件内容,SELinux 会在系统日志中记录相应的问题,并给出解决办法。

    • SELinux 策略或引用程序配置有问题 
      如果你没有修改过程序的配置却 SELinux 的警告,原因可能是 SELinux 策略有问题,这时可以查看系统日志或审计日志,使用 sealert 工具进行分析。 
      万般无奈之下可以 setenforce 0 停止 SELinux 
      也可以只对某个进程不启用 SELinux ,执行 semanage permissive -a httpd_t 则对httpd进程不启用 SELinux

    • 程序被入侵 
      SELinux 并非入侵检测系统,所以目前 SELinux 除错工具无法主动的甄别出入侵企图,不过当您发现警告内容包含有如下特征时,很有可能对应进程已被黑客攻破了: 
      尝试关闭 SELinux (/etc/selinux) 或者设定某个 SELinux 布尔值; 
      尝试载入内核模块、写入内核目录或者引导器镜像; 
      尝试读取 shadow_t 标签的文件,如 /etc/passwd 那里通常包含了用户信息; 
      尝试覆盖写入日志文件; 
      尝试连接不需要的随机端口或者邮件端口;

SELinux下配置Apache服务

  • SELiniux给httpd定义的文件Type 

    • httpd_sys_content_t 定义http主体可以访问/var/www(/.*)? 目录及其文件,创建的文件或复制到的 /var/www/html的文件都有httpd_sys_content_t 类型的标记

    • httpd_sys_script_exec_t 主要用于设置 /var/www/cgi-bin/ 目录下的 cgi 脚本

    • httpd_sys_content_rw_t 使用 httpd_sys_content_rw_t 的类型标签读取和写脚本标记文件 httpd_sys_script_exec_t 的类型

    • httpd_sys_content_ra_t 使用 httpd_sys_content_ra_t 的类型标签将读取和附加标记的脚本文件 httpd_sys_script_exec_t 类型

  • 修改 DocumentRoot 到 /website 

    1. 查看默认的上下文 
      semanage fcontext -l | grep '/var/www' 
      显示/var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0

    2. 修改配置文件 /website 作为DocumentRoot 
      vi /etc/httpd/conf/httpd.conf 
      编辑DocumentRoot “/website” 
      【测试】:访问显示错误页面
      ☞SELinux

    3. 给 /website 目录增加httpd进程可访问的安全标签 
      chcon -Rv -t httpd_sys_content_t '/website' #一次性生效,立即生效 
      chcon -Rv --reference /var/www/html /website #参考原来的设置,一次性生效,在这种情况下,执行restorecon -R 命令将恢复为default_t 的标签 
      semanage fcontext -a -t httpd_sys_content_t '/website(/.*)?' 
      restorecon -Rv /website/ #此时 http 的标签已经是默认标签了,无需重启就生效了,访问也能正常显示

    4. 小结:SELinux限制了httpd进程可以访问的静态页面路径必须包含 httpd_sys_content_t 标签,否则修改了DocumentRoot设置将导致httpd不可访问

  • 让 Apache 侦听非标准端口 

    1. 查看允许的端口 
      semanage prot -l | grep http 
      显示http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000

    2. 修改conf文件默认侦听的端口 
      vim /etc/httpd/conf/httpd.conf 
      修改Listen 8520 
      【测试】httpd服务启动失败,错误提示没有权限使用该端口,如果是图形界面也会有相应的SELinux警报显示
      ☞SELinux

    3. SELinux策略添加httpd可访问的端口 
      semanage port -a -t http_port_t -p tcp 8520 #增加httpd的端口 
      查看
      semanage prot -l | grep http 
      显示http_port_t tcp 8520, 80, 81, 443, 488, 8008, 8009, 8443, 9000

    4. 再次启动httpd服务并测试能否访问:☞SELinux

  • 允许 Apache 访问创建私人网站 
    若是希望用户可以通过在 ~user/public_html/ 放置文件的方式创建自己的个人网站的话,那么需要在 Apache 策略中允许该操作执行 

    1. 用户自己创建 ~/public_html 目录 
      alice] echo “alice’s test page” > ~/public_html/index.html

    2. 修改conf文件,打开UserDir的访问 
      vi /etc/httpd/conf/httpd.conf 
      注释掉UserDir disabled 
      打开#UserDir public_html 
      【测试1】不给 apache 账户public_html 目录的访问权限,即不满足 DAC的条件
      ☞SELinux

    3. 增加 ~alice 访问控制权限,或 other 的 x 权限 
      setfacl -m u:apache:x ~alice 
      【测试2】给apache用户 ~alice 目录的访问权限,根据umask值public_html是可以被访问的。此时的结果表明httpd进程已经能够进入 ~alice/public_html/ 目录,但是访问不了网页文件,SELinux也有相应的报警,此时只满足DAC的条件
      ☞SELinux

    4. 修改SELinux的httpd_enable_homedirs布尔值 
      查看当前开关getsebool -a | grep httpd_enable_h 
      打开开关setsebool httpd_enable_homedirs on 
      【测试3】此时同时满足DAC和MAC条件,即apache用户可以访问 public_html 目录且SELinux允许httpd访问pbulic_html
      ☞SELinux

    5. 小结:httpd只有同时满足【标准Linux访问控制】【SELinux访问控制】的条件才能访问一个对象。

    6. Apache 的其他SELinux布尔量 
      • allow_httpd_anon_write 禁用时这个布尔变量允许的 httpd 到只有标记文件 public_content_rw_t 类型的读取访问。启用此布尔变量将允许的 httpd 写入到文件标记与一个公共文件目录包  含一个公共文件传输服务,如 public_content_rw_t 类型。 
      • allow_httpd_mod_auth_pam 启用此布尔变量允许 mod_auth_pam 模块访问 httpd。 
      • allow_httpd_sys_script_anon_write 这个布尔变量定义 HTTP 脚本是否允许写访问到文件标记在一个公共文件传输服务 public_content_rw_t 类型。 
      • httpd_builtin_scripting 这个布尔变量定义 httpd 的脚本的访问。在这个布尔变量启用,往往需要为 PHP 内容。 
      • httpd_can_network_connect 禁用时这个布尔变量防止从网络或远程端口发起连接的 HTTP 脚本和模块。打开这个布尔变量允许这种访问。 
      • httpd_can_network_connect_db 禁用时这个布尔变量防止发起一个连接到数据库服务器的 HTTP 脚本和模块。打开这个布尔变量允许这种访问。 
      • httpd_can_network_relay 打开这个当布尔变量的 httpd 正在使用正向或反向代理。 
      • httpd_can_sendmail 禁用时这个布尔变量防止发送邮件的 HTTP 模块。这可以防止垃圾邮件的攻击漏洞中发现的 httpd。打开这个布尔变量允许 HTTP 模块发送邮件。 
      • httpd_dbus_avahi 关闭时这个布尔变量拒绝服务的 avahi 通过 D-BUS 的 httpd 访问。打开这个布尔变量允许这种访问。 
      • httpd_enable_cgi 禁用时这个布尔变量防止 httpd 的执行 CGI 脚本。打开这个布尔变量让 httpd 的执行 CGI 脚本。 
      • httpd_enable_ftp_server 开放这个布尔变量会容许的 httpd 作为 FTP 服务器的 FTP 端口和行为。 
      • httpd_enable_homedirs 禁用时这个布尔变量阻止访问用户主目录的 httpd。打开这个布尔变量允许 httpd 访问用户主目录。 
      • httpd_execmem 启用时这个布尔变量允许 httpd 的执行程序需要的内存地址。建议不要启用这个布尔变量从安全角度来看,因为它减少了对缓冲区溢出,但是某些模块和应用程序(如 Java 和 Mono 应用)的保护需要这种特权。 
      • httpd_ssi_exec 这个布尔变量定义服务器端包含(SSI)的网页中的元素是否可以执行。 
      • httpd_tty_comm 这个布尔变量定义的 httpd 是否被允许访问的控制终端。这种访问通常是不需要的,但是,如配置 SSL 证书文件的情况下,终端访问所需的显示和处理一个密码提示。 
      • httpd_use_cifs 打开这个布尔变量允许 httpd 访问 CIFS 文件系统上标记的文件,如通过 Samba 挂载的文件系统,cifs_t 类型。 
      • httpd_use_nfs 打开这个布尔变量允许 httpd 访问 NFS 文件系统上的标记文件 nfs_t 类型,如文件系统,通过 NFS 挂载。

获取帮助

[root@cent6]~>yum install selinux-policy-doc
[root@cent6]~>makewhatis

[root@cent7]~>yum install selinux-policy-devel 
[root@cent7]~>mandb

[root@cent7]~>man -k _selinux

httpd_php_selinux (8) - Security Enhanced Linux Policy for the httpd_ph...
httpd_rotatelogs_selinux (8) - Security Enhanced Linux Policy for the h...
httpd_selinux (8)    - Security Enhanced Linux Policy for the httpd pro...
httpd_suexec_selinux (8) - Security Enhanced Linux Policy for the httpd...
httpd_sys_script_selinux (8) - Security Enhanced Linux Policy for the h...

[root@cent7]~>man 8 httpd_selinux

以上是对 SELinux 功能和基本配置的介绍,对于 Linux 系统的网络服务,如 Apache 、Smaba、NFS、vsftp、MySQL、Bind DNS 服务等都受到SELinux 策略的严格限制,SELinux 仅开放了最基本的运行需求,当这些服务进程需要访问更多的对象时需要配置 SELinux 策略。至于连接外部网络、运行脚本、访问用户目录、共享文件等,必须经过一定的 SELinux 策略调整才能充分发挥网络服务器的作用。 
很多用户一直觉得 SELinux 的安全级别设置十分麻烦,因此有人装完系统就禁用 SELinux 但这是不安全的行为。因此系统管理员要权衡易用性和安全性的关系,在不同应用场景达到二者的平衡。


原创文章,作者:helloc,如若转载,请注明出处:http://www.178linux.com/47463

评论列表(1条)

  • 马哥教育
    马哥教育 2016-09-23 10:36

    写的不错,赞一个。