执行nginx -t命令后 发现proxy_temp目录的权限发生了变化 目录权限已改为nobody

运维 2023-09-13 12:10:21
421阅读

问题概述

在编写检查脚本并通过nginx -t参数获取nginx配置文件时,执行nginx -t命令后,发现proxy_temp目录权限发生了变化,目录权限改为nobody。

问题原因

nginx -t命令含义:

-t — 测试配置文件: nginx 检查配置的语法是否正确,然后尝试打开配置中引用的文件。

从官方的解释中我们可以看到,执行了nginx -t命令:检查当前nginx配置文件的语法是否正确,然后尝试打开配置文件中引用的文件。

怀疑是执行nginx -t命令修改了目录权限。

测试模拟如下:

环境说明:使用ultimatech用户启动nginx,然后使用root用户执行nginx -t命令。

执行nginx  -t命令后,发现proxy_temp目录权限发生了变化,目录权限修改为nobody_root用户

从上图可以看到,使用root用户执行nginx -t命令后,发现临时文件temp文件目录的权限已经改为nobody。

Nginx源码分析

首先检查nginx -t命令输出:

nginx: 配置文件/usr/local/nginx/conf/nginx.conf 语法没问题

nginx:配置文件/usr/local/nginx/conf/nginx.conf测试成功

检查nginx.c源代码文件。因为执行的命令是nginx -t,所以源码首先验证传入的参数。执行的函数是:ngx_get_options。代码如下;

int ngx_cdecl

main(int argc, char *const *argv)

{

……

if (ngx_get_options(argc, argv) !=NGX_OK) {

返回1;

}

……

周期=ngx_init_cycle(init_cycle);

如果(循环==NULL){

如果(ngx_test_config){

ngx_log_stderr(0, “配置文件%s 测试失败”,

init_cycle.conf_file.data);

}

返回1;

}

如果(ngx_test_config){

如果(!ngx_quiet_mode){

ngx_log_stderr(0, '配置文件%s测试成功',

周期-conf_file.data);

}}

静态ngx_int_t

ngx_get_options(int argc, char *const *argv)

{

案例“t”:

ngx_test_config=1;

休息;}

执行ngx_get_options会将变量ngx_test_config设置为1。程序继续执行ngx_init_cycle函数

ngx_cycle_t *

ngx_init_cycle(ngx_cycle_t *old_cycle)

{

……

如果(ngx_test_config!ngx_quiet_mode){

ngx_log_stderr(0, “配置文件%s语法正确”,

周期-conf_file.data);

}

……

if (ngx_create_paths(cycle, ccf-user) !=NGX_OK) {

转到失败;

}

}

从nginx -t的输出结果可以看出,程序代码执行了上述逻辑,并且代码继续执行ngx_create_paths操作。该函数中有一个chown操作。函数具体实现如下:

ngx_int_t

ngx_create_paths(ngx_cycle_t *周期,ngx_uid_t用户)

{

……

//###

for (i=0; i 循环路径.nelts; i++) {

如果(用户==(ngx_uid_t)NGX_CONF_UNSET_UINT){

ngx_log_stderr(0, 'nginx 创建路径开始继续');

继续;

}

if (fi.st_uid !=用户) {

if (chown((const char *) path[i]-name.data, user, -1)==-1) {

ngx_log_error(NGX_LOG_EMERG, 循环日志, ngx_errno,

'chown(\'%s\', %d) 失败',

路径[i]-名称.数据,用户);

返回NGX_ERROR;

}

}.

}

}

红色标记的代码是nginx -t命令权限验证。

首先,检查配置文件中的用户。如果以普通用户执行,配置文件中的用户将被忽略。如果(user==(ngx_uid_t) NGX_CONF_UNSET_UINT)这条判断语句执行成功,则ngx_create_paths执行结束,不再处理文件。修订。

但是,如果使用root用户执行,如果配置文件中配置了user选项,则user值将被赋予配置文件中的值。如果未配置用户值,则默认用户为nobody。所以代码逻辑if (user==(ngx_uid_t) NGX_CONF_UNSET_UINT)不会被执行。程序会进行如下验证if (fi.st_uid !=user), fi.st_uid 的值为当前文件所属的用户。如果该用户与配置文件中指定的用户不同,程序将执行chown操作,并将文件属性修改为配置文件中定义的用户。

使用strace命令跟踪

使用操作系统命令strace命令跟踪nginx -t命令

执行nginx  -t命令后,发现proxy_temp目录权限发生了变化,目录权限修改为nobody_root用户_02

从输出跟踪文件strace.log文件中我们可以看到,使用root用户执行时,会发现有chown操作,并且文件目录被修改为nobody。

结论

根据官网对nginx -t命令的解释,该命令仅检查配置文件的语法,并打开配置文件中预定义的文件。因此,该命令不会修改文件目录权限。然而在实际测试过程中,发现使用普通用户来运行nginx服务。修改普通用户的nginx服务目录权限。 nginx配置文件nginx.conf中没有配置用户xxx内容。使用root用户执行nginx -t命令时,临时文件(fastcgi_temp、scgi_temp、uwsgi_temp、client_body_temp、proxy_temp)目录被修改为nobody,导致启动nginx服务的用户没有*_temp目录的权限,部分应用页面无法访问。

Nginx临时目录权限修改触发条件:

1)使用非root和nobody用户启动nginx服务进程。

2)nginx配置文件nginx.conf中没有配置用户xxx内容;

3)使用root用户执行nginx -t命令;

解决方案

在nginx配置文件nginx.conf文件中添加用户配置项。添加用户配置项。服务启动时会出现警告,但不会对服务产生影响。

警告信息如下:

nginx: [警告] 仅当主进程以超级用户权限运行时,“user”指令才有意义,在/usr/local/nginx1.20/conf/nginx.conf:2 中被忽略

the end
免责声明:本文不代表本站的观点和立场,如有侵权请联系本站删除!本站仅提供信息存储空间服务。