是否有适用于 Linux 的多用户 webdav 服务器?

是否有适用于 Linux 的多用户 webdav 服务器?

我希望完全停用我的 SMBA 服务,并将其替换为 WebDav 服务。

到目前为止,所有谷歌搜索都指向我使用 Apache / Webdav。这很接近我所需要的,但据我所知,它需要 Apache 访问我的用户的文件,甚至更糟;如果它创建了一个文件,则新文件将归 Apache(而不是用户)所有。 请注意,要求文件具有正确的 Unix 所有权和权限,因为某些用户具有直接 SSH 访问权限。

所以我只是在寻找一种方法来使 Apache / Webdav 与多用户“正确”工作(即在尝试提供文件之前将 unix 用户更改为登录用户)或找到 Apache / Webdav 的完整替代品。

到目前为止,搜索还没有找到任何结果。

答案1

如果您有用户名和/或 uid,您可以使用 nginx + lua + luarocks ljsyscall 来完成此操作

在 debian 系统上,配置为:

apt-get -y install nginx libnginx-mod-http-dav-ext libnginx-mod-http-lua luarocks
luarocks install ljsyscall

nginx 配置如下:

user  root;
worker_processes  1;

load_module modules/ngx_http_dav_ext_module.so;
load_module modules/ndk_http_module.so;
load_module modules/ngx_http_lua_module.so;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    sendfile        on;
    keepalive_timeout  65;
    gzip  on;

    server {
        listen      80;
        listen [::]:80;

        location / {
            rewrite ^ http://$host$request_uri?; # permanent;
        }
    }

    server {
        listen      443           ssl http2;
        listen [::]:443           ssl http2;

        ssl                       on;    
        # [ SSL Sections Omitted ]

        # Set the maximum size of uploads
        client_max_body_size 200m;

        # Default is 60, May need to be increased for very large uploads
        client_body_timeout 120s; 

        # other configs
        location /webdav/ {
            autoindex              on;
            alias                  /data/www/;
            client_body_temp_path  /data/client_temp;

            dav_methods PUT DELETE MKCOL COPY MOVE;
            dav_ext_methods PROPFIND OPTIONS;

            create_full_put_path   on;
            # Not sure if you want to tweak this
            # dav_access             group:rw  all:r;

            # Let's assume you have an auth subrequest that can set X-UID
            auth_request  /auth
            auth_request_set $auth_status $upstream_status;
            auth_request_set $saved_remote_user $upstream_http_REMOTE_USER;
            auth_request_set $saved_remote_uid $upstream_http_X_UID;

            # Per-Request Impersonation
            access_by_lua_block {
                # Boilerplate because ljsyscall doesn't have setfsuid implemented directly
                local syscall_api = require 'syscall'
                local ffi = require "ffi"
                local nr = require("syscall.linux.nr")
                local sys = nr.SYS
                local uint = ffi.typeof("unsigned int")
                local syscall_long = ffi.C.syscall -- returns long
                local function syscall(...) return tonumber(syscall_long(...)) end 
                local function setfsuid(id) return syscall(sys.setfsuid, uint(id)) end
                -- If you only have ngx.var.saved_remote_user, install luaposix and do this ...
                -- local pwd = require 'posix.pwd'
                -- local new_uid = pwd.getpwnam(ngx.saved_remote_user).pw_uid
                local new_uid = tonumber(ngx.var.saved_remote_uid)
                ngx.log(ngx.NOTICE, "[Impersonating User #" .. new_uid .. "]")
                local previous = setfsuid(new_uid)
                local actual = setfsuid(new_uid)
                if actual ~= new_uid then
                    ngx.log(ngx.CRIT, "Unable to impersonate users")
                    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
                end
            }
        }

        location = /auth {
            internal;
            proxy_pass              http://localhost:8080/auth;
            proxy_pass_request_body off;
            proxy_set_header        Content-Length "";
            proxy_set_header        X-Original-URI $request_uri;
            proxy_set_header        X-Original-Method $request_method;
        }
    }
}

这将在 nginx 工作线程服务的每个请求上执行 setfsuid。不幸的是,您似乎必须以 root 身份运行 nginx 才能使其正常工作。我相信它可以与不同的用户一起工作,前提是该进程以 root 身份启动,下降到不同的用户,并保留 CAP_SETUID(请参阅 文​​档capsh),并且usernginx 配置文件中不存在该指令。

您可能还需要设置组 ID。

请参阅“用户 ID 更改对功能的影响” http://man7.org/linux/man-pages/man7/capability.7.html

答案2

找了好久我就是没找到。有很多多用户服务器,但我找不到一个以系统用户身份执行的服务器。

所以我自己写了一个。这只是我自己测试过的。但不管怎样,源代码在这里:

https://github.com/couling/WebDAV-Daemon

答案3

嘿,

我一直在寻找同样的东西,最后我使用 apache2 收集了一个解决方案。我尝试使用 npm webdav-server 的节点解决方案,发现并不是所有的解决方案都像使用 apache 模块一样好。然后我尝试了一个基于 jsDAV 的 npm dav-server,它可以做得更好,并且可能是一个解决方案,但由于我必须处理糟糕的 3g 连接,所以我更喜欢 apache 并发现了多个实例脚本。

所以在这里我分享一下我的经验。

http://helpcenter.epages.com/Doc/doc/apache2/README.multiple-instances

我为每个 webdav 用户运行一个实例...可扩展性不太好,但对于在小团队中工作来说已经足够了。

将 myUser 替换为您的用户。

在 Ubuntu 14.04 上

sh /usr/share/doc/apache2/examples/setup-instance myUser

所以我以 /etc/apache2-myUser/envars 中定义的用户 myUser 身份运行 apache 进程

export APACHE_RUN_USER=myUser
export APACHE_RUN_GROUP=myUser

编辑 ports.conf

# If you proxy with nginx as I did better to limit to local interface
listen localhost:8080
# listen 8080

我无法在 ubuntu 14.04 上使用 PAM 身份验证,因此需要使用基本身份验证进行欺骗,然后使用 nginx 将其包装在 https 中

htpasswd -c /etc/apache2/htpasswd myUser

然后 /etc/apache2-myUser/sites-available/000-default.conf

<VirtualHost *:8080>

DocumentRoot /var/www/html

Alias /${APACHE_RUN_USER} /home/${APACHE_RUN_USER}
<Directory /home/${APACHE_RUN_USER}>
    Require all granted
    Options +Indexes
</Directory>

<Location /${APACHE_RUN_USER}>
      DAV On
      AuthType Basic
      AuthName "Restricted Area"
      AuthUserFile /etc/apache2/htpasswd
      Require valid-user
</Location>

DavLockDB /home/${APACHE_RUN_USER}/.DavLock
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

然后 nginx 代理有一个技巧,通过标头 Destination 传递图标文件夹让 webdav 在浏览器上很好地降级

server {
listen 443 ssl http2;
server_name exemple.com;

location ~ ^/(myUser|icons)/ {

    proxy_pass http://dav-myUser;

#         auth_basic "Restricted Content";
#         auth_basic_user_file /etc/nginx/htpasswd;

#         proxy_set_header Authorization $http_authorization;

    proxy_pass_header  Authorization;
    proxy_pass_request_headers on;

    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;

    port_in_redirect off;

    # to avoid 502 Bad Gateway:
    # http://vanderwijk.info/Members/ivo/articles/ComplexSVNSetupFix
    set $destination $http_destination;

    if ($destination ~* ^https(.+)$) {
        set $destination http$1;
    }

    proxy_set_header Destination $destination;

    proxy_read_timeout     300;
    proxy_connect_timeout  5;

    # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
    proxy_http_version 1.1;

    # Remove the Connection header if the client sends it,
    # it could be "close" to close a keepalive connection
    proxy_set_header Connection "";
}

ssl on;
ssl_certificate /etc/letsencrypt/live/exemple.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/exemple.com/privkey.pem;

include /etc/letsencrypt/options-ssl-nginx.conf;

}

没有义务使用 nginx 作为代理,apache 可以很好地完成 https,但是当我遇到代理目标问题时,我觉得值得一提。

答案4

sftpgo有一个管理用户界面,您可以在其中添加/删除用户和权限。然后它打开 webdav、ftp 和 sftp 端口并在那里托管文件。用户可以对所有三种协议使用相同的用户名/密码。

相关内容