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

  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.sh
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Desktop
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Documents
drwxr-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.syslog
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Music
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Pictures
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Public
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Templates
drwxr-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 的意义
    rootsystem_r代表供 root 账号登录时所取得的权限
    system_usystem_r由于为系统账号,因此是非交互式的系统运行程序
    user_usystem_r一般可登录用户的程序
    
    # 查看httpd程序与/var/www/html网页存储目录的安全性环境
    
    [root@CentOS ~]# ll Zd /usr/sbin/httpd /var/www/html
    ls: 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 ~]# getenforce
    Enforcing
    
    
    # 查看配置文件,得知 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/hosts
    dr-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 directory
    drwxrwxrwt. 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/kevin
    drwxr-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 ~]# seinfo
    
    Statistics for policy file: /etc/selinux/targeted/policy/policy.24
    Policy 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 -a
    abrt_anon_write --> off
    abrt_handle_event --> off
    allow_console_login --> on
    allow_cvs_read_shadow --> off
    allow_daemons_dump_core --> on
    allow_daemons_use_tcp_wrapper --> off
    allow_daemons_use_tty --> on
    allow_domain_fd_use --> on
    allow_execheap --> off
    allow_execmem --> on
    allow_execmod --> on
    
    
    # 查询 https_enable_homedirs 是否为 on,若不为 on,请启动它
    
    [root@CentOS ~]# getsebool httpd_enable_homedirs
    httpd_enable_homedirs --> off  #结果为 off,启动它
    [root@CentOS ~]# setsebool -P httpd_enable_homedirs=1
    [root@CentOS ~]# getsebool httpd_enable_homedirs
    httpd_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 start
    Starting httpd:                                            [  OK  ]
    [root@CentOS ~]# netstat -tlnp | grep httpd
    tcp        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 setroubleshoot
    Mar 31 04:29:27 CentOS yum[16651]: Installed: setroubleshoot-plugins-3.0.40-3.1.el6_8.noarch
    Mar 31 04:29:28 CentOS yum[16651]: Installed: setroubleshoot-server-3.0.47-12.el6_8.x86_64
    Mar 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.conf
    recipients_filepath = /var/lib/setroubleshoot/email_alert_recipients  #81行,这行要存在才行
    console = False    #147行,改成True
    
    
    # 修改配置文件
    
    [root@CentOS ~]# vim /var/lib/setroubleshoot/email_alert_recipients
    root@localhost
    your@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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值