尽管用户使用 sudo 进行测试时有访问权限,但 OpenResty 权限被拒绝

尽管用户使用 sudo 进行测试时有访问权限,但 OpenResty 权限被拒绝

我遇到了一个奇怪的问题,似乎无法弄清楚。

我正在使用 OpenResty。它在该特定服务器上的工作方式是整个配置和 Lua 脚本以及所有内容都来自 Git 存储库。用户应该管理存储库,OpenResty 的工作程序应该以(我在配置中设置)ubuntu的身份运行。我使用的是 Ubuntu 22.04。www-datauser www-data www-data;

该存储库位于/home/ubuntu/app/my-project并作为 OpenResty 的前缀。

但是,似乎工作进程无法访问该目录中的任何内容(主进程可以)。Lua 文件未执行(尽管也没有错误),某些配置值似乎被忽略,并且我在尝试写入和读取时收到“错误 13:权限被拒绝”temp/client_body/...html/index.html信息:

open() "/home/ubuntu/app/my-project/temp/client_body/0000093402" failed (13: Permission denied)

项目内的所有文件和目录都设置为组www-data,并且temp包含client_body此类的目录甚至具有所有者www-data,并且读/写权限设置正确。当我这样做时sudo -u www-data bash,我可以在那里读取和写入,但是当 OpenResty 工作进程这样做时,它仍然会得到“权限被拒绝”的结果。

client_body目录甚至由 OpenResty 自动创建,如下所示:

drwx------ 2 www-data root     4096 Dec  4 18:49 client_body

我的第一个想法是这ProtectHome可能是一个问题,但我本来预计这也会干扰主进程而不仅仅是工作者进程,而且我已经将其设置为了false

我添加了一个,access_by_lua_block在其中运行id并记录其输出,并且正如预期的那样,我得到了以下内容:

uid=33(www-data) gid=33(www-data) groups=33(www-data)

有趣的是,如果我使用/usr/local/openresty/nginx前缀路径,一切都会正常工作。(但我更希望将 Git 存储库放在/home/ubuntu/app/my-project...)此外,如果我将 OpenResty 配置为以用户身份运行ubuntu而不是www-data,它也会正常工作。

我的知识已经用尽了。还有什么问题吗?

为了记录,这是我的openresty.service文件:

[Unit]
Description=The OpenResty Application Platform
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
WorkingDirectory=/home/ubuntu/app/my-project
Type=forking
PIDFile=/home/ubuntu/app/my-project/logs/nginx.pid
ExecStartPre=/usr/local/openresty/nginx/sbin/nginx -t -q -g 'daemon on; master_process on;' -p /home/ubuntu/app/my-project
ExecStart=/usr/local/openresty/nginx/sbin/nginx -g 'daemon on; master_process on;' -p /home/ubuntu/app/my-project
ExecReload=/usr/local/openresty/nginx/sbin/nginx -g 'daemon on; master_process on;' -s reload -p /home/ubuntu/app/my-project
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /home/ubuntu/app/my-project/logs/nginx.pid
TimeoutStopSec=5
KillMode=mixed
ProtectHome=false

[Install]
WantedBy=multi-user.target

注意:这个问题建议这可能是 SELinux 问题,但是对我来说sudo sestatus输出SELinux status: disabled(并且尝试运行sudo semanage permissive -a httpd_t无论如何都会导致错误,即策略不受管理,正如预期的那样)。

答案1

我想到了。

问题是,尽管/、和可供 访问,但/home却无法访问(它与 一起)。/home/ubuntu/app/home/ubuntu/app/my-projectwww-data/home/ubuntu750ubuntu:ubuntu

我现在决定将整个项目目录移动到/var/www/my-project,添加ubuntuwww-data组并保留/home/ubuntu/app/my-project符号链接,/var/www/my-project同时将服务单元文件中的所有路径也更改为/var/www/my-project。这解决了这个问题。


现在让我感到困惑并阻止我早日意识到这一点的部分是:当我尝试使用或sudo -u www-data bash时,它确实有效。然而,在更多地玩这个之后,我意识到它ls /home/ubuntu/app/my-project/htmlecho hello > /home/ubuntu/app/my-project/temp/client_body/test仅有的工作当我/home/ubuntu/app/my-project事先已经有了工作目录时

ubuntu@my-server:~/app/my-project$ sudo -u www-data bash
www-data@my-server:/home/ubuntu/app/my-project$ echo hello > /home/ubuntu/app/my-project/temp/client_body/test
www-data@my-server:/home/ubuntu/app/my-project$ cat /home/ubuntu/app/my-project/temp/client_body/test
hello
ubuntu@my-server:/var/www$ sudo -u www-data bash
www-data@my-server:/var/www$ echo hello > /home/ubuntu/app/my-project/temp/client_body/test
bash: /home/ubuntu/app/my-project/temp/client_body/test: Permission denied

这很奇怪,因为在我的服务单元文件中WorkingDirectory 曾是定义为那个精确的目录,但也许 OpenResty 在分叉之前对其进行了更改。

无论如何,如果有人对此有解释,请在评论中告诉我!

相关内容