☞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

(0)
hellochelloc
上一篇 2016-09-18 13:52
下一篇 2016-09-18 15:48

相关推荐

  • 2016-10-17作业

    1 生产环境发现一台服务器系统时间产生偏差,造成服务异常,请帮忙校正。 date命令查看系统时间,clock或者hwclock命令查看硬件时间, 将系统时间同步到硬件时间的方法hwclock -s   2 生产有一个数据同步脚本需要执行很长时间,怎样做到无人值守,在管理工具退出的情况下,脚本依然能正常运行。在生产环境的中创建SCREEN会话,会话的…

    Linux干货 2016-10-18
  • 8月5号 练习+作业

    1,找出ifconfig 命令结果中本机的所有IPv4 地址 [root@localhost ~]# ifconfig |tr -cs '[:digit:].' '\n' |sort -t. -k3 |tail&nbsp…

    Linux干货 2016-08-07
  • sed

    复制/etc/rc.d/rc.sysinit文件到/tmp目录中,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首家#; 2.复制/boot/grub/grub.conf至/tmp中,删除/tmp/grub.conf文件中的行首的空白字符 3.删除/tmp/rc.sysinit文件中的以#开头,且后面跟了一个至少一个空白字符的行行的#…

    Linux干货 2016-12-04
  • 98-mysql数据备份

    一. 数据备份基础知识

    2016-11-20
  • 关于大型网站技术演进的思考(三):存储的瓶颈(3)

    原文出处: 夏天的森林    存储的瓶颈写到现在就要进入到深水区了,如果我们所做的网站已经到了做数据库垂直拆分和水平拆分的阶段,那么此时我们所面临的技术难度的挑战也会大大增强。 这里我们先回顾下数据库的垂直拆分和水平拆分的定义: 垂直拆分:把一个数据库中不同业务单元的数据分到不同的数据库里。 水平拆分:是根据一定的规则把同一业务…

    Linux干货 2015-03-03
  • 马哥教育网络班22期第二周课程练习1-未闻花名

    1、Linux管理文件和目录的命令 命令 功能 命令 功能 pwd 显示当前目录 ls 查看目录下的内容 cd 改变所在目录 cat 显示文件的内容 grep 在文件中查找某字符 cp 复制文件 touch 创建文件 mv 移动文件 rm 删除文件 rmdir 删除目录 1.1 pwd命令 该命令的英文解释为print working directory(打…

    Linux干货 2016-08-22

评论列表(1条)

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

    写的不错,赞一个。