代码之家  ›  专栏  ›  技术社区  ›  Max Williams

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

  •  0
  • Max Williams  · 技术社区  · 5 年前

    我们在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配置,有没有办法更改创建的temp文件的权限,例如775?

    编辑:我刚刚尝试更改 umask 0022 ,我改成了 0002 . 在这两种情况下,它都有600个权限。

    编辑2:我还试着在 proxy_redirect

    proxy_store_access user:rw group:rw all:r;
    

    但是,这没什么区别-只是 user:rw

    0 回复  |  直到 5 年前
        1
  •  4
  •   cody    5 年前

    透过 nginx source,似乎修改临时文件权限的唯一机制是 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
    
        2
  •  3
  •   Samuel Philipp    5 年前

    似乎目前无法配置文件权限,但 official feature request .

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