Có máy chủ webdav nhiều người dùng có sẵn cho linux không?


9

Tôi đang tìm cách ngừng hoàn toàn dịch vụ SMBA của mình và thay thế nó bằng dịch vụ WebDav.

Tất cả các tìm kiếm google cho đến nay đã chỉ cho tôi sử dụng Apache / Webdav. Điều này gần với những gì tôi cần nhưng theo như tôi đọc thì đòi hỏi Apache phải có quyền truy cập vào các tệp của người dùng của tôi và tệ hơn; nếu nó tạo một tệp thì tệp mới sẽ được sở hữu bởi Apache (không phải người dùng). Lưu ý rằng có các tệp có quyền sở hữu và quyền hạn Unix chính xác là một yêu cầu vì một số người dùng có quyền truy cập SSH trực tiếp.

Vì vậy, tôi chỉ đơn giản là tìm cách để làm cho Apache / Webdav hoạt động "chính xác" với nhiều người dùng (đó là thay đổi người dùng unix thành người dùng đã đăng nhập trước khi thử phân phát tệp ) hoặc tìm một giải pháp thay thế hoàn toàn cho Apache / Webdav.

Cho đến nay các tìm kiếm đã không bật lên bất cứ điều gì.


Vì webdav dựa trên giao thức HTTP, tôi sẽ nói rằng nó không tồn tại ngoại trừ dưới dạng máy chủ HTTP. Và nếu bạn tìm thấy sản phẩm cung cấp webdav trhey thường sẽ cung cấp nhiều hơn thế
Kiwy

Có vẻ như có thể có một cái gì đó hứa hẹn trong phiên bản mới nhất của MPM ITK. mpm-itk.sesse.net Tôi sẽ thử với điều này và xem liệu AssignUserIDExprcó chấp nhận người dùng đã đăng nhập không. Nó có thể không AssignUserIDxuất hiện trước khi người dùng xác thực.
Philip Couling

Có các máy chủ webdav độc lập như code.google.com/p/opendav hoặc các thư viện như PyWebDAV không yêu cầu apache.
ngày

@jan Điều đó có thể trở thành câu trả lời tốt nhất. Apache đã chạy trên máy chủ và webdav phải là thư mục con trên trang web nhưng tôi có thể thiết lập nó như một proxy thông qua và sử dụng SSL của Apache để cung cấp mã hóa.
Philip Couling

1
Nên được chuyển đến phần mềm Recommendations.SE .
William Edwards

Câu trả lời:


2

Nếu bạn có tên người dùng và / hoặc uid, bạn có thể làm điều này với nginx + lua + luarocks ljsyscall

Trên hệ thống debian, được cấu hình là:

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

Và nginx được cấu hình theo cách sau:

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

Điều này sẽ thực thi setfsuid trên mỗi yêu cầu được phục vụ bởi nhân viên nginx. Thật không may, có vẻ như bạn phải chạy nginx với quyền root để điều này hoạt động ngay. Tôi tin rằng điều này có thể hoạt động với một người dùng khác với điều kiện là quá trình bắt đầu với quyền root, được chuyển sang một người dùng khác, với CAP_SETUID được bảo toàn (xem tài liệu cho capsh) và lệnh usernày không có trong tệp cấu hình nginx.

Bạn cũng có thể cần phải đặt ID nhóm, có khả năng.

Xem "Ảnh hưởng của thay đổi ID người dùng đến khả năng" trong http://man7.org/linux/man-pages/man7/capabilities.7.html


Điều đó có vẻ đầy hứa hẹn. Tôi sẽ kiểm tra.
Philip Couling

0

Điều này có thể đáng để đọc: Một đầu vào khác: nhiều thư mục người dùng và một thư mục được chia sẻ http://hexeract.wordpress.com/2011/02/26/configure-a-webdav-enables-webserver-for-multipl-user- Folders -và một-chia sẻ-thư mục /


Điều này có cùng một vấn đề như câu trả lời khác của bạn. Một số người dùng có quyền truy cập ssh. Các tệp PHẢI được cung cấp chính xác (riêng của họ, không phải của máy chủ web) unix quyền và quyền sở hữu tệp (cả người dùng và nhóm).
Philip Couling

0

Tôi đã sử dụng tài liệu này làm hướng dẫn để thiết lập webdav: http://bernaerts.dyndns.org/linux/75-debian/62-debian-webdav-share

vâng, Apache là nhóm (dữ liệu www trong Debian) nhưng bạn có thể thêm người dùng vào nhóm đó, vì vậy tôi đã thêm một người dùng. Không kiểm tra lý do tại sao bạn không thể thêm người dùng khác .... Máy chủ webdav sử dụng nguyên tắc thiết lập này chạy ngay bây giờ trong 3 năm tại địa điểm của tôi và con trai tôi (vì vậy 2 máy chủ giống hệt nhau cho công việc của con trai tôi). Debian 6 kể từ vài tháng là phiên bản LTS (đến tháng 2-2016).

So với Bernaerts tôi đã điều chỉnh trong tệp Apache: / etc / apache2 / sites-Available / mặc định phần cấu hình này.

Alias /webdav1 /data/webdav1

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

Vì vậy, các tệp của tôi không còn dưới www mà trong / data / webdav1 (thông qua bí danh webdav1 để giữ cho nó ngắn) Với mỗi đĩa cứng tôi đã tạo một phần như vậy và webdav1 trở thành webdav2 cho đĩa cứng thứ 2 trong phần đó. Chúng tôi có thể xây dựng tối đa 10 đĩa cứng trong các máy chủ này, vì vậy 10 trong số các phần này trong tệp cấu hình đó. Tôi đã thêm người dùng vào www-data, davfs2 và davfs, để người dùng có thể truy cập (các) thư mục webdav. Vì vậy, người dùng cần phải đăng nhập và sẽ được yêu cầu tên người dùng và mật khẩu. Trong fstab, tất cả các đĩa dữ liệu webdav được liệt kê để quá trình gắn kết diễn ra tự động. Đó là một phần của fstab:

/ dev / sda3 / data / webdav1 ext3, người dùng, tự động 0 0


1
Đáng buồn thay điều này không giải quyết vấn đề gì cả. Trọng tâm của câu hỏi này là nhiều người dùng. Với giải pháp này, các tệp mới sẽ được tạo như người dùng apache chứ không phải người dùng đã đăng nhập. Để chức năng apache, tất cả các tệp phải là nhóm dữ liệu www có quyền đọc / ghi đối với nhóm đó. Vì mọi người dùng sẽ phải ở trong nhóm đó, mọi người dùng sẽ phải có quyền truy cập để đọc / ghi mọi tệp của người dùng khác. Giải pháp này đơn giản là không chảo cho nhiều người dùng.
Philip Couling

0

Bạn đã dùng thử ownCloud chưa? Vẫn chỉ tự mình kiểm tra, nhưng có vẻ như nó đáp ứng yêu cầu của bạn: webdav hoạt động vượt trội.


1
Có, tôi có một ví dụ của owncloud nhưng đó không phải là thứ tôi đang tìm kiếm vì người dùng owncloud (apache) sở hữu tất cả các tệp.
Philip Couling

0

Đã tìm kiếm trong một thời gian dài, tôi không thể tìm thấy một. Có nhiều máy chủ nhiều người dùng nhưng tôi không thể tìm thấy máy chủ nào thực thi như người dùng hệ thống.

Vì vậy, tôi đã viết một bản thân mình. Điều này chỉ được thử nghiệm theo như tôi có thể tự kiểm tra. Nhưng với giá trị của nó, mã nguồn ở đây:

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


0

Hy

Tôi đã tìm kiếm điều tương tự và cuối cùng tôi đã thu thập được một giải pháp bằng cách sử dụng apache2. Tôi đã thử giải pháp nút bằng npm webdav-server và phát hiện ra không phải tất cả đều hoạt động tốt như vậy sau đó sử dụng mô-đun apache. Sau đó, tôi đã thử một máy chủ npm dav dựa trên jsDAV có thể làm tốt hơn và có thể là một giải pháp, nhưng vì tôi phải đối phó với kết nối 3g tệ hại, tôi thích apache và tìm hiểu về nhiều tập lệnh cá thể.

Vì vậy, ở đây tôi chia sẻ kinh nghiệm của tôi.

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

Tôi chạy một cá thể cho mỗi người dùng webdav ... không thể mở rộng được, nhưng để làm việc trong một nhóm nhỏ thì đủ tốt.

Thay thế myUser bằng người dùng của bạn.

Trên Ubuntu 14.04

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

Vì vậy, tôi chạy quy trình apache khi người dùng myUser được xác định trong / etc / apache2-myUser / envars

export APACHE_RUN_USER=myUser
export APACHE_RUN_GROUP=myUser

Chỉnh sửa cổng.

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

Tôi không thể tải PAM auth trên Ubuntu 14.04 để hoạt động vì vậy cần phải lừa với auth cơ bản vì sau đó tôi bọc nó trong https bằng nginx

htpasswd -c /etc/apache2/htpasswd myUser

Sau đó /etc/apache2-myUser/sites-av 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>

sau đó nginx proxy có một mẹo với tiêu đề Thư mục biểu tượng chuyển đến đích cho phép webdav hạ cấp độc đáo trên các trình duyệt

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;

}

Không có nghĩa vụ phải sử dụng nginx làm proxy, apache rất có thể thực hiện https, nhưng khi tôi gặp vấn đề về đích, tôi cảm thấy nó đáng để đề cập đến.


-1

Tôi cũng đang tìm kiếm một giải pháp tương tự.

Giải pháp 1: Môi trường máy tính để bàn của bạn (Gnome, KDE) có thể có các widget để hiển thị một thư mục nhất định bằng WebDAV. Điều này sẽ chạy miễn là môi trường máy tính để bàn của bạn đang chạy và không phải là một giải pháp daemon.

Giải pháp 2: Không có gì ngăn bạn chạy Apache theo ràng buộc người dùng của riêng bạn trên các cổng không có đặc quyền trên 1024. Chỉ cần viết tệp cấu hình hoặc sao chép các tệp được gói trong bản phân phối của bạn vào $ HOME / etc / httpd (chỉ là một ví dụ), thêm DAV- cấu hình liên quan và chạy nó như người dùng không root của bạn như:

$ httpd -f $ HOME / etc / httpd

Chạy như người dùng của bạn đảm bảo Apache sẽ tạo các tệp như bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.