Czy jest dostępny serwer lindav dla wielu użytkowników?

9

Chcę całkowicie wycofać moją usługę SMBA i zastąpić ją usługą WebDav.

Wszystkie dotychczasowe wyszukiwania google wskazywały na użycie Apache / Webdav. To jest prawie to, czego potrzebuję, ale o ile czytam, wymaga Apache dostępu do plików mojego użytkownika i jeszcze gorzej; jeśli utworzy plik, nowy plik będzie własnością Apache (nie użytkownika). Należy pamiętać, że posiadanie plików z prawidłową własnością i uprawnieniami w systemie Unix jest wymagane, ponieważ niektórzy użytkownicy mają bezpośredni dostęp do SSH.

Dlatego po prostu szukam sposobu, aby albo Apache / Webdav działał „poprawnie” z wieloma użytkownikami (to znaczy zmienić użytkownika unix na zalogowanego przed próbą podania pliku ) lub znaleźć kompletną alternatywę dla Apache / Webdav.

Jak dotąd wyszukiwania nic nie pokazały.

Philip Couling
źródło
Ponieważ webdav jest oparty na protokole HTTP, powiedziałbym, że nie istnieje, chyba że pod postacią serwera HTTP. A jeśli znajdziesz produkt, który oferuje webdav trhey zwykle oferuje więcej niż to
Kiwy
Wygląda na to, że może być coś obiecującego w najnowszej wersji MPM ITK. mpm-itk.sesse.net Spróbuję tego i zobaczę, czy AssignUserIDExprzaakceptuje zalogowanego użytkownika. Wygląda na to, że nie AssignUserIDuruchamia się przed uwierzytelnieniem użytkownika.
Philip Couling,
Istnieją samodzielne serwery webdav, takie jak code.google.com/p/opendav lub biblioteki, takie jak PyWebDAV, które nie wymagają apache.
Jan
@jan To może okazać się najlepsza odpowiedź. Apache działa już na serwerze, a webdav powinien być podkatalogiem na stronie, ale mogę to skonfigurować jako serwer proxy i użyć szyfrowania SSL Apache.
Philip Couling,
1
Powinien zostać przeniesiony do Zaleceń oprogramowania . SE .
William Edwards

Odpowiedzi:

2

Jeśli masz nazwę użytkownika i / lub identyfikator użytkownika, możesz to zrobić za pomocą nginx + lua + luarocks ljsyscall

W systemie debian skonfigurowanym jako:

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

I Nginx skonfigurował w następujący sposób:

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

Spowoduje to uruchomienie setfsuid przy każdym żądaniu obsługiwanym przez pracownika nginx. Niestety, wydaje się, że musisz uruchomić nginx jako root, aby to działało poprawnie. Wierzę, że jest możliwe, aby działało to z innym użytkownikiem, pod warunkiem, że proces został uruchomiony jako root, spadł do innego użytkownika z zachowanym CAP_SETUID (patrz dokumentacja capsh), a userdyrektywa nie istnieje w pliku konfiguracyjnym nginx.

Konieczne może być również ustawienie identyfikatorów grupy.

Zobacz „Wpływ zmian ID użytkownika na możliwości” w http://man7.org/linux/man-pages/man7/capabilities.7.html

Brian
źródło
To wygląda obiecująco. Sprawdzę to.
Philip Couling,
0

Warto przeczytać: Kolejne dane wejściowe: wiele folderów użytkowników i jeden folder współdzielony http://hexeract.wordpress.com/2011/02/25/configure-a-webdav-enabled-webserver-for-multiple-user-folders -i-jeden-wspólny folder /

Andre
źródło
Ma to ten sam problem, co twoja inna odpowiedź. Niektórzy użytkownicy mają dostęp do ssh. Pliki MUSZĄ otrzymać poprawne (własne, a nie serwerowe) uprawnienia do plików unix i prawa własności (zarówno użytkownika, jak i grupy).
Philip Couling,
0

Użyłem tego jako przewodnika do konfiguracji webdav: http://bernaerts.dyndns.org/linux/75-debian/62-debian-webdav-share

tak, Apache jest grupą (dane www pod Debianem), ale możesz dodawać użytkowników do tej grupy, więc dodałem jednego użytkownika. Nie przetestowałem, dlaczego nie możesz dodawać innych użytkowników ... Serwer webdav korzystający w zasadzie z tej konfiguracji działa teraz przez 3 lata u mnie i mojego syna (więc 2 identyczne serwery do pracy mojego syna). Debian 6 jest od kilku miesięcy wersją LTS (do lutego 2016).

W porównaniu do Bernaerts zaadaptowałem w pliku Apache: / etc / apache2 / sites-available / default ta część konfiguracji.

Alias /webdav1 /data/webdav1

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

Tak więc moje pliki nie znajdują się już pod www, ale w / data / webdav1 (przez alias webdav1, aby było krótkie). Dla każdego dysku twardego utworzyłem taką sekcję, a webdav1 staje się webdav2 dla drugiego dysku twardego w tej sekcji. Możemy wbudować maksymalnie 10 dysków twardych na tych serwerach, więc 10 z tych sekcji w tym pliku konfiguracyjnym. Dodałem użytkownika do www-data, davfs2 i davfs, aby użytkownik mógł uzyskać dostęp do folderów webdav. Dlatego użytkownik musi się zalogować i zostanie poproszony o podanie nazwy użytkownika i hasła. W fstab wszystkie dyski z danymi webdav są wymienione, więc montowanie przebiega automatycznie. Ta część fstab:

/ dev / sda3 / data / webdav1 ext3, użytkownik, auto 0 0

Andre
źródło
1
Niestety to wcale nie rozwiązuje problemu. W centrum tego pytania było wielu użytkowników. Dzięki temu rozwiązaniu nowe pliki będą tworzone jako użytkownik apache, a nie użytkownik zalogowany. Aby funkcja apache działała, wszystkie pliki muszą należeć do grupy danych www z uprawnieniami do odczytu / zapisu w tej grupie. Ponieważ każdy użytkownik będzie musiał należeć do tej grupy, każdy użytkownik będzie musiał mieć dostęp do odczytu / zapisu plików każdego innego użytkownika. To rozwiązanie po prostu nie działa dla wielu użytkowników.
Philip Couling,
0

Czy próbowałeś OwnCloud ? Wciąż testuję go sam, ale wygląda na to, że spełnia twoje wymagania: webdav działa od razu po wyjęciu z pudełka.

Ryder
źródło
1
Tak, mam instancję Owncloud, ale nie tego szukam, ponieważ użytkownik owncloud (apache) jest właścicielem wszystkich plików.
Philip Couling
0

Po długim szukaniu nie mogłem go znaleźć. Istnieje wiele serwerów z wieloma użytkownikami, ale nie mogłem znaleźć takiego, który zostałby wykonany jako użytkownik systemu.

Więc sam napisałem jeden. Jest to testowane tylko w takim stopniu, w jakim mogę to przetestować samodzielnie. Ale za ile jest wart, kod źródłowy jest tutaj:

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

Philip Couling
źródło
0

Hy,

Szukałem tego samego i wreszcie znalazłem rozwiązanie za pomocą apache2. Próbowałem rozwiązania węzła przy użyciu npm webdav-server i okazało się, że nie wszystkie działały tak ładnie, jak przy użyciu modułu apache. Potem wypróbowałem npm serwer DAV oparty na jsDAV, który mógłby działać lepiej i może być rozwiązaniem, ale ponieważ miałem do czynienia z kiepskim połączeniem 3g, wolałem apache i dowiedziałem się o wielu skryptach instancji.

Tutaj dzielę się swoim doświadczeniem.

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

Uruchamiam instancję dla użytkownika webdav ... niezbyt skalowalny, ale do pracy w małym zespole wystarczy.

Zastąp myUser swoim użytkownikiem.

W systemie Ubuntu 14.04

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

Więc uruchamiam proces Apache jako użytkownik myUser zdefiniowany w / etc / apache2-myUser / envars

export APACHE_RUN_USER=myUser
export APACHE_RUN_GROUP=myUser

Edytuj ports.conf

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

Nie mogłem uzyskać uwierzytelnienia PAM na Ubuntu 14.04 do pracy, więc muszę oszukać przy użyciu podstawowego uwierzytelniania, ponieważ następnie zawijam go w https za pomocą nginx

htpasswd -c /etc/apache2/htpasswd myUser

Następnie /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>

wtedy nginx proxy ma sztuczkę z nagłówkiem Folder ikon przekazywania celu pozwala ładnie obniżyć przeglądarkę webdav w przeglądarkach

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;

}

Nie ma obowiązku używania nginx jako proxy, apache może równie dobrze zrobić https, ale kiedy wpadłem na proxy Docelowy problem, poczułem, że warto o tym wspomnieć.

Antony Gibbs
źródło
-1

Szukam również podobnego rozwiązania.

Rozwiązanie 1: Twoje środowisko pulpitu (Gnome, KDE) może mieć widżety do ujawnienia określonego folderu przez WebDAV. Będzie działać tak długo, jak długo działa środowisko pulpitu i nie jest rozwiązaniem demonicznym.

Rozwiązanie 2: Nic nie stoi na przeszkodzie, aby uruchomić Apache pod własnym wiązaniem użytkownika na nieuprzywilejowanych portach powyżej 1024. Po prostu napisz plik konfiguracyjny lub skopiuj te zawarte w twojej dystrybucji do $ HOME / etc / httpd (tylko przykład), dodaj DAV- powiązaną konfigurację i uruchom ją jako własny użytkownik inny niż root, taki jak:

$ httpd -f $ HOME / etc / httpd

Uruchamianie jako użytkownicy zapewnia, że ​​Apache będzie tworzyć pliki tak jak Ty.

Avibrazil
źródło