是否有可用于Linux的多用户Webdav服务器?


9

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

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

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

到目前为止,搜索还没有发现任何东西。


由于webdav基于HTTP协议,因此我想说它不存在,只是以HTTP服务器的形式存在。而且,如果您发现提供webdav trhey的产品通常会提供更多的产品
Kiwy 2014年

在最新版本的MPM ITK中,似乎有些希望。mpm-itk.sesse.net我将尝试一下,看看是否AssignUserIDExpr将接受登录的用户。AssignUserID在用户进行身份验证之前,它似乎并没有生效。
菲利普·库林2014年

有独立的webdav服务器(例如code.google.com/p/opendav)或库(例如PyWebDAV)不需要apache。
1

@jan可能是最好的答案。Apache已经在服务器上运行,并且webdav应该是站点上的子目录,但是我可以将其设置为代理服务器并使用Apache的SSL来提供加密。
菲利普·库林

Answers:


2

如果您具有用户名和/或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 worker提供服务的每个请求执行setfsuid。不幸的是,看来您必须以root用户身份运行nginx才能使其当前正常工作。我相信,如果进程以root身份启动,然后降级到另一个用户,并且保留了CAP_SETUID(请参阅文档capsh),并且该user指令在nginx配置文件中不存在,则可以与其他用户一起使用。

您可能还需要设置组ID。

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


这看起来很有希望。我会检查一下。
菲利普·库林


0

我以此为指导来设置webdav:http : //bernaerts.dyndns.org/linux/75-debian/62-debian-webdav-share

是的,Apache是​​该组(Debian下的www-data),但是您可以将用户添加到该组中,因此我添加了一个用户。没有测试为什么您不可以添加其他用户。...原则上使用此设置的webdav服务器现在在我和我儿子的位置运行3年(因此我儿子的工作需要2台相同的服务器)。Debian 6自几个月以来一直是LTS版本(直到2016年2月)。

与我在Apache文件中改编的Bernaerts相比:/ etc / apache2 / sites-available / default这部分配置。

Alias /webdav1 /data/webdav1

<Location /webdav1>
DAV on
Authtype Basic
Authname "webdav1"
AuthUserFile /var/www/web1/passwd1.dav
Require valid-user
</location>

因此,我的文件不再位于www下,而位于/ data / webdav1下(通过别名webdav1保持简短),对于每个硬盘,我都创建了这样一个部分,并且webdav1成为该部分中第二块硬盘的webdav2。我们最多可以在这些服务器中构建10个硬盘,因此该配置文件中有10个此部分。我将用户添加到了www-data,davfs2和davfs,以便用户可以访问webdav文件夹。因此,用户需要登录,并要求输入用户名和密码。在fstab中,列出了所有webdav数据磁盘,以便自动进行安装。fstab的那部分:

/ dev / sda3 / data / webdav1 ext3,用户,自动0 0


1
可悲的是,这根本无法解决问题。这个问题的重点是多用户。使用此解决方案,将以apache用户而不是登录用户的身份创建新文件。为了使apache正常运行,所有文件必须是www-data组,并且对该组具有读/写权限。由于每个用户都必须在该组中,因此每个用户都必须有权读取/写入其他用户的文件。该解决方案根本无法为多个用户所用。
菲利普·库林

0

您是否尝试过OwnCloud?仍然只是自己进行测试,但这听起来可以满足您的要求:webdav即开即用。


1
是的,我有一个Owncloud实例,但是那不是我想要的,因为owncloud用户(apache)拥有所有文件。
菲利普·库林

0

搜索了很长时间,我只是找不到一个。有许多多用户服务器,但是我找不到以系统用户身份执行的服务器。

所以我自己写了一个。仅在我自己可以测试的范围内进行了测试。但是对于它的价值,源代码在这里:

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


0

HY,

我一直在寻找相同的东西,最后我使用apache2收集了一个解决方案。我使用npm webdav-server尝试了节点解决方案,结果发现并不是所有的工作都和使用apache模块一样好。然后,我尝试了一个基于jsDAV的npm dav服务器,它可以做得更好,并且可以作为解决方案,但是由于不得不处理糟糕的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代理有一个技巧,标题传递目的地图标文件夹可以让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,但是当我碰到代理Destination问题时,我觉得值得一提。


-1

我也在寻找类似的解决方案。

解决方案1:您的桌面环境(Gnome,KDE)可能具有通过WebDAV公开特定文件夹的小部件。只要您的桌面环境正在运行,并且它不是守护程序解决方案,它将一直运行。

解决方案2:没有什么可以阻止您在自己的用户绑定下在1024以上的非特权端口上运行Apache。只需编写配置文件或将分发中捆绑的配置文件复制到$ HOME / etc / httpd(仅作为示例),然后添加DAV-相关配置并以您自己的非root用户身份运行它,例如:

$ httpd -f $ HOME / etc / httpd

以您的用户身份运行可确保Apache随您创建文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.