SELinux(Security-Enhanced Linux)是美国国家安全局在Linux开源社区的帮助下开发的一个强制访问控制(MAC,Mandatory Access Control)的安全子系统。RHEL 7系统使用SELinux技术的目的是为了让各个服务进程都受到约束,使其仅获取到本应获取的资源。
SELinux服务有三种配置模式,具体如下。

  • enforcing:强制启用安全策略模式,将拦截服务的不合法请求。
  • permissive:遇到服务越权访问时,只发出警告而不强制拦截。
  • disabled:对于越权的行为不警告也不拦截。

然在禁用SELinux服务后确实能够减少报错几率,但这在生产环境中相当不推荐。

  1. [root@localhost ~]# vim /etc/selinux/config
  2. # This file controls the state of SELinux on the system.
  3. # SELINUX= can take one of these three values:
  4. # enforcing - SELinux security policy is enforced.
  5. # permissive - SELinux prints warnings instead of enforcing.
  6. # disabled - No SELinux policy is loaded.
  7. SELINUX=enforcing
  8. # SELINUXTYPE= can take one of three values:
  9. # targeted - Targeted processes are protected,
  10. # minimum - Modification of targeted policy. Only selected processes are protected.
  11. # mls - Multi Level Security protection.
  12. SELINUXTYPE=targeted

SELinux服务的主配置文件中,定义的是SELinux的默认运行状态,可以将其理解为系统重启后的状态,因此它不会在更改后立即生效。可以使用getenforce命令获得当前SELinux服务的运行模式

  1. [root@localhost ~]# getenforce
  2. Enforcing

可以用setenforce [0|1]命令修改SELinux当前的运行模式(0为禁用,1为启用)。注意,这种修改只是临时的,在系统重启后就会失效

我们比较一下自己创建的acpache目录和原本的目录的安全上下文

  1. [root@localhost ~]# ls -Zd /var/www/html
  2. drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
  3. [root@localhost ~]# ls -Zd /home/wwwroot/
  4. drwxr-xr-x. root root unconfined_u:object_r:home_root_t:s0 /home/wwwroot/

在文件上设置的SELinux安全上下文是由用户段、角色段以及类型段等多个信息项共同组成的。其中,
用户段system_u代表系统进程的身份,
角色段object_r代表文件目录的角色,
类型段httpd_sys_content_t代表网站服务的系统文件

semanage

用于管理SELinux的策略
semanage [选项] [文件]
使用semanage命令时,经常用到的几个参数及其功能如下所示:

  • -l参数用于查询;
  • -a参数用于添加;
  • -m参数用于修改;
  • -d参数用于删除。

可以向新的网站数据目录中新添加一条SELinux安全上下文,让这个目录以及里面的所有文件能够被httpd服务程序所访问到

  1. [root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/
  2. [root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/*
  3. [root@localhost ~]# restorecon -Rv /home/wwwroot/
  4. restorecon reset /home/wwwroot context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:user_home_dir_t:s0
  5. restorecon reset /home/wwwroot/index.html context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0

注意,执行上述设置之后,还无法立即访问网站,还需要使用restorecon命令将设置好的SELinux安全上下文立即生效。在使用restorecon命令时,可以加上-Rv参数对指定的目录进行递归操作,以及显示SELinux安全上下文的修改过程。最后,再次刷新页面,就可以正常看到网页内容了

使用getsebool命令查询并过滤出所有与HTTP协议相关的安全策略。其中,off为禁止状态,on为允许状态。

  1. [root@localhost ~]# getsebool -a | grep http
  2. httpd_anon_write --> off
  3. httpd_builtin_scripting --> on
  4. httpd_can_check_spam --> off
  5. httpd_can_connect_ftp --> off
  6. httpd_can_connect_ldap --> off
  7. httpd_can_connect_mythtv --> off
  8. httpd_can_connect_zabbix --> off
  9. httpd_can_network_connect --> off
  10. httpd_can_network_connect_cobbler --> off
  11. httpd_can_network_connect_db --> off
  12. httpd_can_network_memcache --> off
  13. httpd_can_network_relay --> off
  14. httpd_can_sendmail --> off
  15. httpd_dbus_avahi --> off
  16. httpd_dbus_sssd --> off
  17. httpd_dontaudit_search_dirs --> off
  18. httpd_enable_cgi --> on
  19. httpd_enable_ftp_server --> off
  20. httpd_enable_homedirs --> off
  21. httpd_execmem --> off
  22. httpd_graceful_shutdown --> on
  23. httpd_manage_ipa --> off
  24. httpd_mod_auth_ntlm_winbind --> off
  25. httpd_mod_auth_pam --> off
  26. httpd_read_user_content --> off
  27. httpd_run_ipa --> off
  28. httpd_run_preupgrade --> off
  29. httpd_run_stickshift --> off
  30. httpd_serve_cobbler_files --> off
  31. httpd_setrlimit --> off
  32. httpd_ssi_exec --> off
  33. httpd_sys_script_anon_write --> off
  34. httpd_tmp_exec --> off
  35. httpd_tty_comm --> off
  36. httpd_unified --> off
  37. httpd_use_cifs --> off
  38. httpd_use_fusefs --> off
  39. httpd_use_gpg --> off
  40. httpd_use_nfs --> off
  41. httpd_use_openstack --> off
  42. httpd_use_sasl --> off
  43. httpd_verify_dns --> off
  44. named_tcp_bind_http_port --> off
  45. prosody_bind_http_port --> off
  46. [root@localhost ~]# setsebool -P httpd_enable_homedirs=on

面对如此多的SELinux域安全策略规则,实在没有必要逐个理解它们,我们只要能通过名字大致猜测出相关的策略用途就足够了。比如,想要开启httpd服务的个人用户主页功能,那么用到的SELinux域安全策略应该是httpd_enable_homedir