• 开启SELinux情况下如何解决nginx 403


    前言

    上周的时候,作者在生产环境上部署正式系统的时候,遇到了万恶的nginx 403 问题,于是各种查找资料。关于nginx 403的文章到是非常多,但是涉及到SELinux的时候,大多都是将SELinux关闭直接解决问题,但生产环境能这么简单粗暴地解决问题吗?显然这样的操作是不太安全的, 那该如何解决呢?本文作者在查询各种资料后,终于解决了开启SELinux的情况下nginx 403的问题,将解决地过程进行了梳理和总结,分享出来,希望能对大家有所帮助 。

    403原因分析

    知己知彼,方能百战不殆,我们先来简单认识一下SELinux。
    Security-Enhanced Linux(安全增强型 Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。SELinux 主要由美国国家安全局开发,2.6 及以上版本的 Linux 内核都已经集成了该模块。SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则)。
    安全上下文是 SELinux 的核心。安全上下文分为「进程安全上下文」和「文件安全上下文」。只有两者的安全上下文对应上了,进程才能访问文件。它们的对应关系由政策中的规则决定。
    安全上下文有四个字段,分别用冒号隔开,形如:system_u:object_r:admin_home_t:s0

     
    image

    开启SELinux的情况下 nginx 403的原因非常有可能是nginx的线程上下文和文件安全上下文 不一致导致nginx没有权限访问相关的文件。下面我们来验证一下,是否是这个原因。

    分析验证

    在相关命令参数中加上-Z 即可查看SELinux相关信息。
    ps -efZ | grep nginx 查看nginx进程SELinux信息,结果如下:

    [root@localhost ~]# ps -efZ | grep nginx
    system_u:system_r:httpd_t:s0    root      1423     1  0 22:02 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
    system_u:system_r:httpd_t:s0    nginx     1578  1423  0 22:25 ?        00:00:00 nginx: worker process
    unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 1664 1297  0 22:29 pts/0 00:00:00 grep --color=auto nginx
    

    ls -Z <文件或目录> 查看文件或目录SELinux信息,结果如下:

    [root@localhost home]# ls -Z
    drwxr-xr-x. root root unconfined_u:object_r:home_root_t:s0 www
    [root@localhost home]# cd www
    [root@localhost www]# ls -Z
    -rw-r--r--. root root unconfined_u:object_r:home_root_t:s0 50x.html
    -rw-r--r--. root root unconfined_u:object_r:home_root_t:s0 index.html
    

    我们再来看一下nginx的默认目录/usr/share/nginx/html的SELinux信息

    [root@localhost nginx]# ls -Z
    drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
    [root@localhost nginx]# cd html/
    [root@localhost html]# ls -Z
    -rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 50x.html
    -rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 index.html
    

    从上面的信息中可以看出nginx 的SELinux 信息为system_u:system_r:httpd_t:s0,其中线程上下文为httpd_t

    www目录以及文件的SELinux 信息为unconfined_u:object_r:home_root_t:s0,其中文件上下文为home_root_t

    /usr/share/nginx/html目录以及文件的SELinux 信息为system_u:object_r:httpd_sys_content_t:s0,其中文件上下文为httpd_sys_content_t

    httpd_thome_root_t不一致,导致nginx线程无法访问www目录以及相应的文件。

    解决方案

    httpd可以读取标记为httpd_sys_content_t类型的文件,但是不能进行写入操作,我们只需要将www及子目录和文件的SELinux信息修改为httpd_sys_content_t即可

    1. 安装policycoreutils-python工具
    [root@localhost home]yum -y install policycoreutils-python
    
    1. 执行semanage命令
    [root@localhost home]# semanage fcontext -a -t httpd_sys_content_t '/home/www(/.*)?'
    [root@localhost home]# ls -Z
    drwxr-xr-x. root root unconfined_u:object_r:home_root_t:s0 www
    

    发现此时文件上下文信息没有修改过来,不要着急,我们还有非常关键的一步要操作。

    1. 递归还原,刷新文件上下文信息
    [root@localhost home]# restorecon -R /home/www
    [root@localhost home]# ls -Z
    drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 www
    [root@localhost home]# cd www/
    [root@localhost www]# ls -Z
    -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 50x.html
    -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
    

    此时文件上下文信息已经修改过来,可以去验收成果了。

    结果验证

    此时,nginx和SELinux就能友好愉快地相处了,辛苦了半天,效果图如下:

     
     

    如果文章能帮助到你,欢迎点个赞!


    作者:legogo
    链接:https://www.jianshu.com/p/99d8e3dac21c
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    cinder支持nfs快照
    浏览器输入URL到返回页面的全过程
    按需制作最小的本地yum源
    创建可执行bin安装文件
    RPCVersionCapError: Requested message version, 4.17 is incompatible. It needs to be equal in major version and less than or equal in minor version as the specified version cap 4.11.
    惠普IPMI登陆不上
    Linux进程状态——top,ps中看到进程状态D,S,Z的含义
    openstack-neutron基本的网络类型以及分析
    openstack octavia的实现与分析(二)原理,架构与基本流程
    flask上下文流程图
  • 原文地址:https://www.cnblogs.com/nonkicat/p/16320542.html
Copyright © 2020-2023  润新知