Gibt es einen Mehrbenutzer-Webdav-Server für Linux?

9

Ich möchte meinen SMBA-Dienst vollständig außer Betrieb nehmen und durch einen WebDav-Dienst ersetzen.

Alle bisherigen Google-Suchanfragen haben mich auf die Verwendung von Apache / Webdav hingewiesen. Dies entspricht in etwa dem, was ich brauche, aber soweit ich es lese, muss Apache Zugriff auf die Dateien meines Benutzers haben, was noch schlimmer ist. Wenn eine Datei erstellt wird, gehört die neue Datei Apache (nicht dem Benutzer). Beachten Sie, dass Dateien mit dem richtigen Unix-Besitz und den richtigen Unix-Berechtigungen erforderlich sind, da einige Benutzer direkten SSH-Zugriff haben.

Ich suche also ganz einfach nach einer Möglichkeit, Apache / Webdav entweder "richtig" mit mehreren Benutzern zu machen (dh den Unix-Benutzer in den angemeldeten Benutzer zu ändern, bevor versucht wird, die Datei bereitzustellen ) oder eine vollständige Alternative zu Apache / zu finden. Webdav.

Bisher haben Suchanfragen nichts ergeben.

Philip Couling
quelle
Da webdav auf dem HTTP-Protokoll basiert, würde ich sagen, dass es nur in Form eines HTTP-Servers vorhanden ist. Und wenn Sie ein Produkt finden, das Webdav Trhey anbietet, bieten Sie normalerweise mehr als das
Kiwy
Es sieht so aus, als ob die neueste Version von MPM ITK etwas Vielversprechendes enthält. mpm-itk.sesse.net Ich werde es versuchen und sehen, ob AssignUserIDExprder angemeldete Benutzer akzeptiert wird. Möglicherweise wird es seitdem nicht mehr AssignUserIDaktiviert, bevor sich der Benutzer authentifiziert.
Philip Couling
Es gibt eigenständige Webdav-Server wie code.google.com/p/opendav oder Bibliotheken wie PyWebDAV, für die kein Apache erforderlich ist.
Januar
@jan Das könnte sich als die beste Antwort herausstellen. Apache wird bereits auf dem Server ausgeführt und webdav sollte ein Unterverzeichnis auf der Site sein, aber ich kann dies als Proxy-Durchgang einrichten und Apaches SSL verwenden, um die Verschlüsselung bereitzustellen.
Philip Couling
1
Sollte nach Software Recommendations.SE verschoben werden .
William Edwards

Antworten:

2

Wenn Sie den Benutzernamen und / oder die UID haben, können Sie dies mit nginx + lua + luarocks ljsyscall tun

Auf einem Debian-System, konfiguriert als:

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

Und nginx hat Folgendes konfiguriert:

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;
        }
    }
}

Dadurch wird setfsuid bei jeder Anforderung ausgeführt, die vom Nginx-Worker bearbeitet wird. Leider scheint es, dass Sie nginx als root ausführen müssen, damit dies derzeit richtig funktioniert. Ich glaube, dass dies mit einem anderen Benutzer möglich ist, vorausgesetzt, der Prozess wurde als root gestartet, auf einen anderen Benutzer verschoben, wobei CAP_SETUID beibehalten wurde (siehe Dokumentation zu capsh), und die userDirektive fehlt in der Nginx-Konfigurationsdatei.

Möglicherweise müssen Sie auch die Gruppen-IDs festlegen.

Siehe "Auswirkungen von Änderungen der Benutzer-ID auf die Funktionen" unter http://man7.org/linux/man-pages/man7/capabilities.7.html

Brian
quelle
Das sieht vielversprechend aus. Ich werde das überprüfen.
Philip Couling
0

Dies kann lesenswert sein: Eine weitere Eingabe: mehrere Benutzerordner und ein freigegebener Ordner http://hexeract.wordpress.com/2011/02/25/configure-a-webdav-enabled-webserver-for-multiple-user-folders -und-ein-freigegebener-Ordner /

Andre
quelle
Dies hat das gleiche Problem wie Ihre andere Antwort. Einige Benutzer haben SSH-Zugriff. Die Dateien MÜSSEN die richtigen Unix-Dateiberechtigungen und -Eigentümer (sowohl Benutzer als auch Gruppe) (ihre eigenen, nicht die des Webservers) erhalten.
Philip Couling
0

Ich habe diesen als Leitfaden zum Einrichten von webdav verwendet: http://bernaerts.dyndns.org/linux/75-debian/62-debian-webdav-share

Ja, Apache ist die Gruppe (www-Daten unter Debian), aber Sie können Benutzer zu dieser Gruppe hinzufügen, also habe ich einen Benutzer hinzugefügt. Habe nicht getestet, warum du keine anderen Benutzer hinzufügen darfst .... Der Webdav-Server, der im Prinzip dieses Setup verwendet, läuft jetzt für 3 Jahre bei mir und meinen Söhnen (also 2 identische Server für die Arbeit meines Sohnes). Debian 6 ist seit einigen Monaten die LTS-Version (bis Februar 2016).

Im Vergleich zu Bernaerts habe ich diesen Teil der Konfiguration in der Apache-Datei angepasst: / 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>

Meine Dateien befinden sich also nicht mehr unter www, sondern in / data / webdav1 (über den Alias ​​webdav1, um es kurz zu halten). Für jede Festplatte habe ich einen solchen Abschnitt erstellt und webdav1 wird zu webdav2 für die 2. Festplatte in diesem Abschnitt. Wir können maximal 10 Festplatten in diese Server einbauen, also 10 dieser Abschnitte in dieser Konfigurationsdatei. Ich habe den Benutzer zu www-data, davfs2 und davfs hinzugefügt, damit der Benutzer auf die webdav-Ordner zugreifen kann. Der Benutzer muss sich also anmelden und wird nach dem Benutzernamen und dem Passwort gefragt. In fstab werden alle Webdav-Datenträger aufgelistet, sodass das Mounten automatisch erfolgt. Dieser Teil von fstab:

/ dev / sda3 / data / webdav1 ext3, Benutzer, auto 0 0

Andre
quelle
1
Leider löst dies das Problem überhaupt nicht. Der Schwerpunkt dieser Frage lag auf Mehrbenutzern. Mit dieser Lösung werden neue Dateien als Apache-Benutzer erstellt, nicht als angemeldeter Benutzer. Um Apache zu funktionieren, müssen alle Dateien eine WWW-Datengruppe mit Lese- / Schreibberechtigungen für diese Gruppe sein. Da jeder Benutzer in dieser Gruppe sein muss, muss jeder Benutzer Zugriff auf das Lesen / Schreiben der Dateien aller anderen Benutzer haben. Diese Lösung funktioniert einfach nicht für mehrere Benutzer.
Philip Couling
0

Haben Sie OwnCloud ausprobiert ? Ich teste es immer noch selbst, aber es hört sich so an, als würde es Ihre Anforderungen erfüllen: webdav funktioniert sofort.

Ryder
quelle
1
Ja, ich habe eine Instanz von Owncloud, aber das ist nicht das, wonach ich suche, da der owncloud-Benutzer (Apache) alle Dateien besitzt.
Philip Couling
0

Nachdem ich lange gesucht hatte, konnte ich einfach keinen finden. Es gibt viele Mehrbenutzerserver, aber ich konnte keinen finden, der als Systembenutzer ausgeführt wurde.

Also habe ich selbst einen geschrieben. Dies wird nur getestet, soweit ich es selbst testen kann. Aber für was es wert ist, ist der Quellcode hier:

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

Philip Couling
quelle
0

Hy,

Ich habe nach dem gleichen gesucht und mit apache2 endlich eine Lösung gefunden. Ich habe versucht, die Knotenlösung mit dem npm-Webdav-Server zu lösen, und festgestellt, dass nicht alle so gut funktionieren wie mit dem Apache-Modul. Dann habe ich einen auf jsDAV basierenden npm dav-Server ausprobiert, der besser funktionieren und eine Lösung sein könnte, aber da ich mich mit miesen 3g-Verbindungen auseinandersetzen musste, habe ich Apache bevorzugt und mich über mehrere Instanzskripte informiert.

Hier teile ich meine Erfahrungen.

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

Ich führe eine Instanz pro Webdav-Benutzer aus ... nicht sehr skalierbar, aber um in einem kleinen Team zu arbeiten, ist es gut genug.

Ersetzen Sie myUser durch Ihren Benutzer.

Unter Ubuntu 14.04

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

Daher führe ich einen Apache-Prozess als Benutzer myUser aus, der in / etc / apache2-myUser / envars definiert ist

export APACHE_RUN_USER=myUser
export APACHE_RUN_GROUP=myUser

Bearbeiten Sie die Datei ports.conf

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

Ich konnte die PAM-Authentifizierung unter Ubuntu 14.04 nicht zum Laufen bringen, daher muss ich mit der Basisauthentifizierung tricksen, da ich sie dann mit nginx in https einbinde

htpasswd -c /etc/apache2/htpasswd myUser

Dann /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>

Dann hat der Nginx-Proxy einen Trick mit dem Header. Der Ordner für die Zielübergabe von Symbolen ermöglicht ein gutes Downgrade von Webdav in Browsern

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;

}

Es besteht keine Verpflichtung, nginx als Proxy zu verwenden. Apache könnte das https sehr gut ausführen, aber als ich auf das Problem mit dem Proxy-Ziel stieß, hielt ich es für erwähnenswert.

Antony Gibbs
quelle
-1

Ich suche auch nach einer ähnlichen Lösung.

Lösung 1: Ihre Desktop-Umgebung (Gnome, KDE) verfügt möglicherweise über Widgets, mit denen ein bestimmter Ordner von WebDAV verfügbar gemacht werden kann. Dies wird ausgeführt, solange Ihre Desktop-Umgebung ausgeführt wird und keine Daemon-Lösung ist.

Lösung 2: Nichts hindert Sie daran, Apache unter Ihrer eigenen Benutzerbindung an nicht privilegierten Ports über 1024 auszuführen. Schreiben Sie einfach eine Konfigurationsdatei oder kopieren Sie die in Ihrer Distribution enthaltenen Dateien in Ihr $ HOME / etc / httpd (nur ein Beispiel) und fügen Sie DAV- hinzu. verwandte Konfiguration und führen Sie es als Ihr eigener Nicht-Root-Benutzer wie:

$ httpd -f $ HOME / etc / httpd

Wenn Sie als Benutzer ausgeführt werden, wird sichergestellt, dass Apache Dateien wie Sie erstellt.

Avibrazil
quelle