Linux-client_body_in_file_only-如何设置临时文件的文件权限?

时间:2019-02-15 11:24:16

标签: file nginx temp

我们在nginx中使用client_body_in_file_only选项,以允许通过Ajax上传文件。配置看起来像这样:

location ~ ^(\/path1|\path2)$ {

  limit_except POST { deny all; }
  client_body_temp_path      /path/to/app/tmp;
  client_body_in_file_only   on;
  client_body_buffer_size    128K;
  client_max_body_size       1000M;

  #this option is a quick hack to make sure files get saved on (ie this type of request goes to) on a specific server
  proxy_pass                 http://admin;
  proxy_pass_request_headers on;
  proxy_set_header           X-FILE $request_body_file;
  proxy_set_body             off;
  proxy_redirect             off;

  # might not need?
  proxy_read_timeout         3m;
}

这可以工作,但是处理请求的Web服务器进程(Mongrel)必须先对sudo中传入的临时文件进行headers['X-FILE'],然后才能对其执行任何操作。这是因为临时文件具有600权限。

我对这种方法不满意,该方法要求我们编辑/etc/sudoers文件以允许Web服务器用户无需密码即可执行sudo chmod。感觉很不安全。

使用nginx配置是否可以将所创建的临时文件的权限更改为例如775?

编辑:我只是尝试在nginx初始化配置中更改umask选项的值,然后重新启动nginx,但这没有帮助。它曾经在0022,我将其更改为0002。在这两种情况下,它都具有600个权限。

EDIT2:我还尝试在nginx配置的proxy_redirect行下添加此行。

proxy_store_access user:rw group:rw all:r;

但是,它没有任何区别-它仍然只有user:rw

2 个答案:

答案 0 :(得分:4)

浏览nginx源,看来唯一可以修改临时文件权限的机制是请求的request_body_file_group_access属性,可以在ngx_http_write_request_body()中进行查询:

if (r->request_body_file_group_access) {
    tf->access = 0660;
}

但是即使如此,您也只能使用0660,而且它似乎不是用户可设置的属性,只能由ngx_http_dav模块使用。

权限最终在ngx_open_tempfile()中设置,默认情况下为0600

fd = open((const char *) name, O_CREAT|O_EXCL|O_RDWR, access ? access : 0600);

因此,目前似乎没有基于配置的解决方案。如果您愿意/能够从源代码构建nginx,则一种可能性是应用一个简单的补丁程序来将权限设置为您想要的ngx_http_write_request_body()中的任何内容:

+    tf->access = 0644;
+
     if (r->request_body_file_group_access) {
         tf->access = 0660;
     }

     rb->temp_file = tf;

我对此进行了测试,并获得了以下内容:第一个文件未经修改即被上传,第二个文件也随之添加:

$ ls -al /tmp/upload/
total 984
drwxr-xr-x  2 nobody root     12288 Feb 18 13:42 .
drwxrwxrwt 16 root   root     12288 Feb 18 14:24 ..
-rw-------  1 nobody nogroup 490667 Feb 18 13:40 0000000001
-rw-r--r--  1 nobody nogroup 490667 Feb 18 13:42 0063184684

答案 1 :(得分:3)

似乎目前无法配置文件权限,但是有一个official feature request

  

文件权限始终为0600,使应用程序根本无法读取文件。 [...]当前是不支持的方案:[Nginx]使用默认权限[0600]创建临时文件(除非设置了request_body_file_group_access,但不幸的是该属性不可设置)。

该机票于2018年10月开放,优先顺序不高。