python - 如何在 Enforcing 模式下使用 SELinux 运行 Flask+Nginx+uWSGI?

标签 python nginx flask uwsgi wsgi

我正在关注 this tutorial在 Nginx 服务器上运行 Flask。我几乎让它工作了,其中当 SELinux 设置为 Permissive 时加载页面但显示 502 Bad Gateway当 SELinux 在 Enforcing 中时模式。

以下是一些相关文件:

myproject.ini

[uwsgi]
module = wsgi

master = true
processes = 5

socket = myproject.sock
chmod-socket = 660
vacuum = true

die-on-term = true

myproject.service

[Unit]
Description=uWSGI instance to serve myproject
After=network.target

[Service]
User=thisuser
Group=nginx
WorkingDirectory=/home/thisuser/public_html
Environment="PATH=/home/thisuser/thisuser_env/bin"
ExecStart=/home/thisuser/thisuser_env/bin/uwsgi --ini myproject.ini

[Install]
WantedBy=multi-user.target

thisuser.com.conf(Nginx 配置)

server {
    listen  80;

    server_name thisuser.com www.thisuser.com;
    access_log /home/thisuser/logs/access.log;
    error_log /home/thisuser/logs/error.log;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/home/thisuser/public_html/myproject.sock;
        try_files $uri $uri/ =404;
    }

}

Flask 文件+目录的位置是 /home/thisuser/它的上下文设置如下:

[root@dev ~]# ls -ldZ /home/thisuser/
drwx--x--x. thisuser thisuser unconfined_u:object_r:user_home_dir_t:s0 /home/thisuser/
[root@dev ~]# ls -ldZ /home/thisuser/public_html/
drwxrwxr-x. thisuser thisuser unconfined_u:object_r:httpd_sys_content_t:s0 /home/thisuser/public_html/

报错如下:

/var/log/audit/audit.log

type=AVC msg=audit(1498880449.864:156): avc:  denied  { write } for  pid=2667 comm="nginx" name="myproject.sock" dev="dm-2" ino=67165858 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:httpd_sys_content_t:s0 tclass=sock_file
type=SYSCALL msg=audit(1498880449.864:156): arch=c000003e syscall=42 success=no exit=-13 a0=f a1=7f526e12e548 a2=6e a3=7ffdf52991b0 items=0 ppid=2666 pid=2667 auid=4294967295 uid=997 gid=995 euid=997 suid=997 fsuid=997 egid=995 sgid=995 fsgid=995 tty=(none) ses=4294967295 comm="nginx" exe="/usr/sbin/nginx" subj=system_u:system_r:httpd_t:s0 key=(null)

/home/thisuser/logs/error.log

2017/06/30 23:40:49 [crit] 2667#0: *1 connect() to unix:/home/thisuser/public_html/myproject.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.1.15, server: thisuser.com, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:/home/thisuser/public_html/myproject.sock:", host: "thisuser.com"

尝试的步骤:

  • 尝试将 sock 权限更改为 chmod-socket = 666
  • 用过setsebool -P httpd_can_network_connect 1
  • 更改自 user=thisuseruser=nginx
  • 已添加 thisusernginx小组

唯一可行的是将 SELinux 更改为 Permissive .我可以做一些更改/添加,以便 SELinux 保持 Enforcing

编辑: http(s)已经在 firewalld 中被允许

[root@dev ~]# firewall-cmd --permanent --zone=public --add-service=https
[root@dev ~]# firewall-cmd --permanent --zone=public --add-service=http
[root@dev ~]# firewall-cmd --reload

最佳答案

不确定以下是否有效但是:

  • 套接字需要与httpd_sys_content_rw_t 类型关联,以便与httpd_t 关联的进程可以写入它。创建“myproject/runtime”并将类型 httpd_sys_content_rw_t 与“runtime”相关联,以便使用 httpd_sys_content_rw_t 类型

  • 创建套接字
  • 让 systemd 手动将 uwsgi app 进程与 httpd_sys_script_t 类型相关联,以便 webapp 成为 SELinux 的目标(不确定 systemd 允许按照政策执行此操作)

要点是:

avc:  denied  { write } for  pid=2667 comm="nginx" name="myproject.sock" dev="dm-2" ino=67165858 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:httpd_sys_content_t:s0 tclass=sock_file

表示不允许与类型 httpd_t 关联的 nginx 进程写入 myproject.sock sock 文件,因为它与“只读”httpd 系统内容类型关联。

它应该与“读写”httpd 系统内容类型相关联。 初始值:

[uwsgi]
module = wsgi

master = true
processes = 5

socket = /home/thisuser/public_html/myproject/runtime/myproject.sock
chmod-socket = 660
vacuum = true

die-on-term = true

单位:

[Unit]
Description=uWSGI instance to serve myproject
After=network.target

[Service]
User=thisuser
Group=nginx
WorkingDirectory=/home/thisuser/public_html/myproject
Environment="PATH=/home/thisuser/thisuser_env/bin"
ExecStart=/home/thisuser/thisuser_env/bin/uwsgi --ini myproject.ini
SELinuxContext=system_u:system_r:httpd_sys_script_t:s0

[Install]
WantedBy=multi-user.target

session :

server {
    listen  80;

    server_name thisuser.com www.thisuser.com;
    access_log /home/thisuser/logs/access.log;
    error_log /home/thisuser/logs/error.log;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/home/thisuser/public_html/myproject/runtime/myproject.sock;
        try_files $uri $uri/ =404;
    }

}

关联标签:

chcon -t httpd_sys_script_exec_t /home/thisuser/thisuser_env/bin/uwsgi
chcon -Rt httpd_sys_content_rw_t /home/thisuser/public_html/myproject/runtime

关于python - 如何在 Enforcing 模式下使用 SELinux 运行 Flask+Nginx+uWSGI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44857223/

相关文章:

python - Flask Azure Web 应用程序部署成功但显示默认页面

读取输入时出现 Python EOF 错误

python - 网页抓取时如何将数据写入 csv 中的新列?

nginx - 如何在 docker 容器内使用 nginx 提供静态文件?

ruby-on-rails - 如何让 SSL 在 Nginx 上的 Rails 中工作?

regex - 在Apache和Nginx上将URL重写为查询字符串

python - 如何在 Flask-SQLAlchemy 中进行多对多查询?

用于在 Azure 中创建订阅的 Python 代码

python - 如何集成 ZSH 和 (i)python?

python - 如何在 flask api 的 url 中给出双斜杠