- 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:在主体程序中成为域)
程序与文件 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/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.该主体程序也无法读取目标文件资源。
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 /
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
- 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/
- semanage:查询默认配置
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
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,再次测试网络服务