鸟哥的服务器《六》SELinux管理原则

来源:互联网 发布:系统优化软件2017 编辑:程序博客网 时间:2024/06/18 05:06
  1. SELinux的工作模式
    SELinux通过MAC的方式管理程序,控制的主体是程序,而目标是该程序能否读取的文件程序
    主体:SELinxu主要管理的就是程序,process
    目标:主体程序访问的目标资源一般就是文件系统。
    策略:依据某些访问来制定基本的方婉儿安全性策略。targetd:针对网络服务限制较多,针对本机限制较少,是默认的策略。mls:完整的SELinux限制,较为严格。
    安全性环境:主体与目标的安全性环境必须一致才能够属于顺利访问目标。

2 . 安全性环境
可以将安全性环境看成SELinux内必备的rwx
安全性环境是放置到文件的inode内的

```# 查看根目录的安全性环境[root@CentOS ~]# ls -Z-rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg-rwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 closedaemon.shdrwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Desktopdrwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Documentsdrwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Downloads-rw-r--r--. root root system_u:object_r:admin_home_t:s0 install.log-rw-r--r--. root root system_u:object_r:admin_home_t:s0 install.log.syslogdrwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Musicdrwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Picturesdrwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Publicdrwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Templatesdrwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Videos# 三个字段:# Identify:role:type# 身份识别:角色:类型```三个字段:Identify:role:type身份识别:相当于账号方面的身份识别。(root:超级用户,system_u:系统程度方面的识别,user_u:一般用户)角色:代表程序、文件资源还是用户。(object_r:文件或目录等文件资源,system_r:代表程序)类型:一个主题能不能读到文件资源,与类型字段有关。(type:在文件资源中成为类型,Domain:在主体程序中成为域)
  1. 程序与文件 SELinux Type 字段的相关性

    身份识别 角色 该对应在 targeted 的意义 root system_r 代表供 root 账号登录时所取得的权限 system_u system_r 由于为系统账号,因此是非交互式的系统运行程序 user_u system_r 一般可登录用户的程序
    # 查看httpd程序与/var/www/html网页存储目录的安全性环境[root@CentOS ~]# ll Zd /usr/sbin/httpd /var/www/htmlls: cannot access Zd: No such file or directory-rwxr-xr-x. 1 root root 356256 Jan 12 12:10 /usr/sbin/httpd/var/www/html:total 0# 两者都是 brject_r,代表文件。而 httpd 属于 httpd_exec_t 类型。# /var/www/html 属于 httpd_content_t 类型# 策略内需要制定详细的domain/type 相关性,若文件的type设置错误,那么即使设置为rwx全开的777.该主体程序也无法读取目标文件资源。
  2. SELinux 的启动、关闭与查看
    目前SELnux支持三种模式
    (1)enforcing:强制模式,代表SELinux运行中,且已经正确的开始限制domain/type了
    (2)permissive: 宽容模式,代表SELinux运行中,不过仅会有警告详细并不会实际限制domain/type的访问
    (3)disabled:关闭,SELinux并没有实际运行

    # 查看 SELinux 模式[root@CentOS ~]# getenforceEnforcing# 查看配置文件,得知 SELinux 的策略[root@CentOS ~]# vim /etc/selinux/config SELINUX=enforcing  SELINUXTYPE=targeted# 改变策略需要重启,因为SELinux是整合到内核中的。# 如果从disable 转到启动 SELinux 的模式时,由于系统必须针对文件写入安全性环境的信息,开机过程需要花费时间写入,写完之后还需要在此启动一次。# 让 SELinux 模式在 Enforcing 与 Permissive 之间切换[root@CentOS ~]# setenforce [0|1]0:转成permissive模式1:转成enforce强制模式# 将 SELinux 在 enforcing 与 permissive 之间切换与查看[root@CentOS ~]# setenforce 0[root@CentOS ~]# getenforce Permissive[root@CentOS ~]# setenforce 1[root@CentOS ~]# getenforce Enforcing# 还原所有 SELinux 的类型[root@CentOS ~]# restorecon -Rv /
  3. SELinux Type 的修改

    # 将 /etc/hosts 复制到 root  用户目录,并查看相关的 SELinux 类型变化[root@CentOS ~]# cp /etc/hosts /root[root@CentOS ~]# ls -dZ /etc/hosts /root/hosts /root-rw-r--r--. root root system_u:object_r:net_conf_t:s0  /etc/hostsdr-xr-x---. root root system_u:object_r:admin_home_t:s0 /root-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /root/hosts# 将 /etc/hosts 移动到 /tmp 下,并查看相关的 SELinux 类型变化[root@CentOS ~]# ls -dZ /etc/hosts /tmp/hosts /tmp/ls: cannot access /etc/hosts: No such file or directorydrwxrwxrwt. root root system_u:object_r:tmp_t:s0       /tmp/-rw-r--r--. root root system_u:object_r:net_conf_t:s0  /tmp/hosts# 单纯的复制时,type字段会继承自目标目录,如果是移动,回来连同类型一起移动

    1 . chcom:将类型改为最原始的类型
    参数:
    -R:连同该命令下的子目录也同时修改
    -t:后面接安全性环境的类型字段
    -u:后面接身份识别
    -r:后面接角色
    –reference-范例文件:拿整个文件当范例来修改后续接的文件类型

    [root@CentOS ~]# chcon [-R] [-t type] [-u user] [-r role] 文件[root@CentOS ~]# chcon [-R] --reference=范例文件 文件# 将刚刚的 /tmp/hosts 类型改为 etc_t 的类型[root@CentOS ~]# chcon -t net_conf_t /tmp/hosts [root@CentOS ~]# ll -Z /tmp/hosts -rw-r--r--. root root system_u:object_r:net_conf_t:s0  /tmp/hosts# 以 /var/spool/mail 为依据,将 /tmp/hosts 修改成为该类型[root@CentOS ~]# ll -dZ /var/spool/mail/drwxrwxr-x. root mail system_u:object_r:mail_spool_t:s0 /var/spool/mail/[root@CentOS ~]# chcon --reference=/var/spool/mail /tmp/hosts [root@CentOS ~]# ll -Z /tmp/hosts -rw-r--r--. root root system_u:object_r:mail_spool_t:s0 /tmp/hosts

    2 . restorecon:恢复为原来的 SELinux Type
    参数:
    -R:连同子目录一起修改
    -v:将过程显示到屏幕上

    [root@CentOS ~]# restorecon [-Rv] 文件或目录# 将刚刚的 /tmp/hosts 移动至 /root 并以默认的安全性环境改正过来[root@CentOS ~]# mv /tmp/hosts /root/[root@CentOS ~]# ll -Z /root/hosts -rw-r--r--. root root system_u:object_r:mail_spool_t:s0 /root/hosts[root@CentOS ~]# restorecon -Rv /root/restorecon reset /root/hosts context system_u:object_r:mail_spool_t:s0->system_u:object_r:admin_home_t:s0  #表示 hosts 由 mail_spool_t 改为 admin_home_t
    1. semanage:查询默认配置
      restorecon 怎么会知道每个目录记载的默认的 SELinux Type 类型呢,记录在 /etc/selinux/targeted/contexts,使用semanage 这个命令来查询与修改
      参数:
      fcontext:只要用在安全性环境方面,-l:查询
      -a:增加
      -m:修改
      -d:删除
    [root@CentOS ~]# semanage {login | user | port | interface | fcontext | translation} -l[root@CentOS ~]# semanage fcontext -{a|d|m} [frst] file_spec# 查询一下 /var/www/ 的默认安全性环境设置[root@CentOS ~]# yum install policycoreutils-python[root@CentOS ~]# semanage fcontext -l | grep '/var/www'
    # 增加一些自定义的目录的安全性环境# 利用 semanage 设置 /srv/kevin 目录的默认安全性环境为 public_content_t[root@CentOS ~]# mkdir /srv/kevin[root@CentOS ~]# ll -Zd /srv/kevindrwxr-xr-x. root root unconfined_u:object_r:var_t:s0   /srv/kevin  #默认是var_t[root@CentOS ~]# semanage fcontext -l | grep '/srv'  /srv                                               directory          system_u:object_r:var_t:s0   #默认的 /srv 下面的安全性环境数据,不过,并没有指定到 /srv/kevin[root@CentOS ~]# semanage fcontext -l | grep '/srv/kevin'/srv/kevin(/.*)?                                   all files          system_u:object_r:public_content_t:s0 [root@CentOS ~]# cat /etc/selinux/targeted/contexts/files/file_contexts.local# This file is auto-generated by libsemanage# Do not edit directly./srv/kevin(/.*)?    system_u:object_r:public_content_t:s0  #写入的这个文件# 尝试修复默认值[root@CentOS ~]# restorecon -Rv /srv/kevin*restorecon reset /srv/kevin context unconfined_u:object_r:var_t:s0->unconfined_u:object_r:public_content_t:s0[root@CentOS ~]# ll -Zd /srv/kevin/drwxr-xr-x. root root unconfined_u:object_r:public_content_t:s0 /srv/kevin/
  4. SELinux 策略内的规则布尔值修订
    1 . seinfo:策略查阅
    参数:
    -A:列出状态’规则布尔值、身份识别、角色、类型等所有信息
    -t:列出类型
    -r:列出角色
    -u:累出身份识别
    -b:列出所有规则布尔值

    [root@CentOS ~]# seinfo [-Atrub][root@CentOS ~]# yum install setools-console# 列出 SELinux 在此策略下的统计状态[root@CentOS ~]# seinfoStatistics for policy file: /etc/selinux/targeted/policy/policy.24Policy Version & Type: v.24 (binary, mls)   Classes:            81    Permissions:       238   Sensitivities:       1    Categories:       1024   Types:            3916    Attributes:        295   Users:               9    Roles:              12   Booleans:          236    Cond. Expr.:       276   Allow:          320384    Neverallow:          0   Auditallow:        141    Dontaudit:      273303   Type_trans:      42419    Type_change:        38   Type_member:        48    Role allow:         19   Role_trans:        386    Range_trans:      6258   Constraints:        90    Validatetrans:       0   Initial SIDs:       27    Fs_use:             23   Genfscon:           84    Portcon:           473   Netifcon:            0    Nodecon:             0   Permissives:        90    Polcap:              2# 列出 httpod 有关的规则(booleans)有哪些[root@CentOS ~]# seinfo -b | grep httpd   httpd_manage_ipa   httpd_run_stickshift   httpd_use_fusefs   httpd_use_openstack   allow_httpd_mod_auth_pam   httpd_setrlimit   httpd_enable_ftp_server# 列出 httpod 有关的安全性环境类别有哪些[root@CentOS ~]# seinfo -t | grep httpd   httpd_php_tmp_t   httpd_var_lib_t   httpd_var_run_t   httpd_apcupsd_cgi_content_t   httpd_collectd_script_t# 查到相关类别或者是布尔值后,想知道详细的规则,就需要seseach这个命令了。

    2 . getsebool:布尔值的查询与修改
    参数:
    -a:列出目前系统上的所有布尔值条款设置为开启或关闭值
    -P:直接将值设置写入配置文件,该设置数据未来会生效的

    # 查询本系统内所有的布尔值设置状况[root@CentOS ~]# getsebool -aabrt_anon_write --> offabrt_handle_event --> offallow_console_login --> onallow_cvs_read_shadow --> offallow_daemons_dump_core --> onallow_daemons_use_tcp_wrapper --> offallow_daemons_use_tty --> onallow_domain_fd_use --> onallow_execheap --> offallow_execmem --> onallow_execmod --> on# 查询 https_enable_homedirs 是否为 on,若不为 on,请启动它[root@CentOS ~]# getsebool httpd_enable_homedirshttpd_enable_homedirs --> off  #结果为 off,启动它[root@CentOS ~]# setsebool -P httpd_enable_homedirs=1[root@CentOS ~]# getsebool httpd_enable_homedirshttpd_enable_homedirs --> on
  5. SELinux 入指纹机记录所需的服务
    1 . setroubleshoot:将错误写入 /var/log/messages
    这个服务会将关于 SELinux 的错误信息与客服方法记录到/var/log/messages 与 /var/log/setroubleshoot/* 中,所以一定要启动服务才行(安装即可)

    # 安装好srtroubleshoot-server之后,需要重启auditd[root@CentOS ~]# yum install setroubleshoot setroubleshoot-server[root@CentOS ~]# /etc/init.d/auditd restart  #整合到auditd当中了

    setroubleshoot的运作方式:
    (1)先由 auditd 去呼叫 audispd 服务
    (2)然后 audispd 服务区启动 sedispatch 程序
    (3)sedispatch 再将原本的 auditd 信息转成 setroubleshoot 的信息,进一步存储

    # 启动 WWW 服务,WWW 服务是由 httpd 服务提供的[root@CentOS ~]# /etc/init.d/httpd startStarting httpd:                                            [  OK  ][root@CentOS ~]# netstat -tlnp | grep httpdtcp        0      0 :::80                       :::*                        LISTEN      16816/httpd    # 模拟 WWW 服务出现状况[root@CentOS ~]# echo  "My first selinux check" > index.html[root@CentOS ~]# ll index.html -rw-r--r--. 1 root root 23 Mar 31 04:40 index.html[root@CentOS ~]# mv index.html /var/www/html/# 查看 http://localhost/index.html[root@CentOS ~]# yum install links[root@CentOS ~]# links http://localhost/index.html -dump# 通过setroubleshoot 的功能查看 /ver/log/messages的内容[root@CentOS ~]# cat /var/log/messages | grep setroubleshootMar 31 04:29:27 CentOS yum[16651]: Installed: setroubleshoot-plugins-3.0.40-3.1.el6_8.noarchMar 31 04:29:28 CentOS yum[16651]: Installed: setroubleshoot-server-3.0.47-12.el6_8.x86_64Mar 31 04:29:29 CentOS yum[16651]: Installed: setroubleshoot-3.0.47-12.el6_8.x86_64# 想要更完整的说明需要靠 sealert 配合真的到的错误代码处理[root@CentOS ~]# sealert -l  错误码# 后续会提示解决办法,比如[root@CentOS ~]# restorecon -Rv '/var/www/html/index.html' 

    2 . 用E-mail 或在命令列上面直接提供setroubleshoot错误信息
    让setroubleshoot主动发送错误信息到指定E-mail,查阅:/etc/setroubleshoot/setroubleshoot.conf

    # 修改配置文件/etc/setroubleshoot/setroubleshoot.confrecipients_filepath = /var/lib/setroubleshoot/email_alert_recipients  #81行,这行要存在才行console = False    #147行,改成True# 修改配置文件[root@CentOS ~]# vim /var/lib/setroubleshoot/email_alert_recipientsroot@localhostyour@email.address# 重启服务[root@CentOS ~]# /etc/init.d/auditd restart

    3 . SELinux 错误克服的总结
    无法了解问题出在哪里,建议处理方法:
    (1) 在服务与rwx权限都没问题明确无法成功使用网络服务时,先使用 setenforce 0 设置宽容模式
    (2) 再次使用网络服务,这样就能用,表示 SELinux出现问题。如果还不能用,建议找其他方法,下面的操作不适合。
    (3) 分析 /var/log/messages 内的信息,找到 sealert -l 相关信息并且执行
    (4) 找到 Allow Access 的关键词,再次测试网络服务
    (5) 处理完毕后重新 setenforce 1,再次测试网络服务

0 0
原创粉丝点击