【问题标题】:Gunicorn Nginx Permission denied while connecting to upstream连接到上游时 Gunicorn Nginx 权限被拒绝
【发布时间】:2018-09-13 19:05:21
【问题描述】:

使用 gunicorn 和 nginx 建立一个 django 站点

项目的gunicorn设置:

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=username
Group=nginx
WorkingDirectory=/home/username/my_project
ExecStart=/home/username/my_project/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/username/my_project/my_project.sock my_project.wsgi:application

[Install]
WantedBy=multi-user.target

项目的Nginx配置文件:

user nginx;

server {
    listen       80;
        server_name  192.168.66.106;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location = /favicon.ico { access_log off; log_not_found off; }
        location /static {
            alias /home/username/my_project;
        }

        location / {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_pass http://unix:/home/username/my_project/my_project.sock;
       }
    }

我的项目拥有这些权限

drwxrwxr-x. 5 username nginx 4.0K Apr  4 10:20 modulo1
-rwxrwxr-x. 1 username nginx  823 Apr  4 10:13 manage.py
drwxrwxr-x. 4 username nginx 4.0K Apr  4 10:20 modulo2
drwxrwxr-x. 2 username nginx  249 Apr  4 10:29 my_project
srwxrwxrwx. 1 username nginx    0 Apr  4 10:47 my_project.sock
-rw-rw-r--. 1 username nginx  565 Apr  4 10:13 README.md
-rw-rw-r--. 1 username nginx  228 Apr  4 10:14 requirements.txt
drwxrwxr-x. 5 username nginx   38 Apr  4 10:13 static
drwxrwxr-x. 3 username nginx   88 Apr  4 10:14 templates

这是来自 /var/log/nginx/error.log 的日志错误

2018/04/04 10:54:03 [crit] 14238#0: *4 connect() to unix:/home/username/my_project/my_project.sock failed (13: Permission denied) while connecting to upstream client: 192.168.66.50, server: 192.168.66.106, request: "GET / HTTP/1.1", upstream: "http://unix:/home/username/my_project/my_project.sock:/", host: "192.168.66.106"

【问题讨论】:

  • centos 7,无论如何我解决了安装问题: sudo yum install policycoreutils-python sudo semanage permissive -a httpd_t

标签: nginx gunicorn selinux


【解决方案1】:

我有一个 centos 7 操作系统,无论如何我解决了安装问题:

sudo yum install policycoreutils-python 
sudo semanage permissive -a httpd_t 

【讨论】:

  • 它为我节省了很多时间。谢谢亲爱的社区。​​span>
  • 对于 CentOS 8,软件包名称已更改。 sudo dnf install policycoreutils-python-utils
  • 谢谢!我试图在 SELinux Centos 7 中解决 nginx 和 uwsgi 之间的相同问题,这解决了这个问题。
【解决方案2】:

除了您的答案之外,基于 CentOS/RHEL 的 Linux 操作系统默认具有 SELinux(Security Enhanced Linux)。

SELinux 可以处于启用或禁用状态。禁用时, 仅使用 DAC 规则。启用后,SELinux 可以在其中一种运行 以下模式:

  • 强制执行:执行 SELinux 政策。 SELinux 根据 SELinux 策略规则拒绝访问。这是默认。在强制模式下,如果某些事情违反了定义的策略,则该操作将被阻止并记录下来。 因此,您面临的权限被拒绝问题
  • 许可:不强制执行 SELinux 政策。 SELinux 不会拒绝访问,但会记录拒绝访问 如果在强制模式下运行,则会被拒绝。

注意:以下操作需在 root

下执行

选项 1

  • 使用 getenforce 实用程序查看当前 SELinux 模式
  • 使用 setenforce 实用程序在强制模式和许可模式之间切换。
    • 使用setenforce 1 进入强制模式。 [默认]
    • 使用setenforce 0进入许可模式

选项 2: 使用 policycoreutils-python

等实用工具创建策略

policycoreutils-python 提供了 semanage 等实用程序, audit2allow、audit2why 和 chcat,用于操作和管理 SELinux。

编辑

  • 通常创建如下特定的策略(我使用的是 uwsgi 套接字):

policy_name.te

module <NAME_OF_THE_POLICY> 1.0;

require {
    type var_run_t;
    type httpd_t;
    type initrc_t;
    class sock_file write;
    class unix_stream_socket connectto;
}

#============= httpd_t ==============
allow httpd_t initrc_t:unix_stream_socket connectto;

#!!!! This avc is allowed in the current policy
allow httpd_t var_run_t:sock_file write;

然后从 te 创建 pp 模块:

checkmodule -M -m -o policy_name.mod /path/to/your/policy/policy_name.te

一旦我们从 policy_name.te 配置中创建了模块 policy_name.mod,运行以下命令来创建编译后的 SE 模块

semodule_package -m policy_name.mod -o policy_name.pp

最后,使用以下命令安装编译的 SE 模块 policy_name.pp:

semodule -i policy_name.pp

【讨论】:

    猜你喜欢
    • 2015-07-14
    • 2014-07-19
    • 2022-01-03
    • 2017-10-18
    • 2015-07-04
    • 2016-05-12
    • 2014-03-16
    • 2013-11-03
    • 2016-05-25
    相关资源
    最近更新 更多