มีเซิร์ฟเวอร์ webdav ที่มีผู้ใช้หลายคนพร้อมใช้งานสำหรับ linux หรือไม่?


9

ฉันกำลังมองหาการรื้อถอนบริการ SMBA ของฉันอย่างสมบูรณ์และแทนที่ด้วยบริการ WebDav

การค้นหาของ google ทั้งหมดได้ชี้ให้ฉันใช้ Apache / Webdav นี่ใกล้เคียงกับสิ่งที่ฉันต้องการ แต่เท่าที่ฉันอ่านมันต้องการ Apache เพื่อเข้าถึงไฟล์ของผู้ใช้และที่แย่กว่านั้น หากสร้างไฟล์ไฟล์ใหม่จะเป็นของ Apache (ไม่ใช่ผู้ใช้) โปรดทราบว่าการมีไฟล์ที่มีความเป็นเจ้าของ Unix และสิทธิ์ที่ถูกต้องเป็นข้อกำหนดเนื่องจากผู้ใช้บางรายมีการเข้าถึง SSH โดยตรง

ดังนั้นฉันค่อนข้างมองหาวิธีที่จะทำให้ Apache / Webdav ทำงาน "ถูกต้อง" กับผู้ใช้หลายคน (นั่นคือเปลี่ยนผู้ใช้ unix เป็นผู้ใช้ที่ล็อกอินก่อนที่จะพยายามให้บริการไฟล์ ) หรือค้นหาทางเลือกที่สมบูรณ์ของ Apache / WebDAV

จนถึงขณะนี้การค้นหายังไม่ได้เปิดอะไรเลย


เนื่องจาก webdav ใช้โปรโตคอล HTTP ฉันจะบอกว่ามันไม่มีอยู่ยกเว้นในรูปแบบของเซิร์ฟเวอร์ HTTP และหากคุณค้นหาผลิตภัณฑ์ที่ให้บริการ webdav trhey มักจะให้มากกว่านั้น
Kiwy

ดูเหมือนว่าอาจมีบางสิ่งที่สัญญาใน MPM ITK เวอร์ชันล่าสุด mpm-itk.sesse.netฉันจะลองและดูว่าAssignUserIDExprจะยอมรับผู้ใช้ที่เข้าสู่ระบบหรือไม่ อาจไม่AssignUserIDปรากฏว่าจะเตะก่อนที่ผู้ใช้จะตรวจสอบสิทธิ์
Philip Couling

มีเซิร์ฟเวอร์ webdav แบบสแตนด์อโลนเช่นcode.google.com/p/opendavหรือไลบรารีเช่น PyWebDAV ที่ไม่ต้องใช้ apache
ม.ค.

@jan นั่นอาจเป็นคำตอบที่ดีที่สุด Apache กำลังทำงานบนเซิร์ฟเวอร์อยู่แล้วและ webdav ควรเป็นไดเรกทอรีย่อยในเว็บไซต์ แต่ฉันสามารถตั้งค่าให้เป็นพร็อกซีผ่านและใช้ SSL ของ Apache เพื่อให้การเข้ารหัส
Philip Couling

1
ควรจะย้ายไปอยู่ที่ซอฟท์แว Recommendations.SE
William Edwards

คำตอบ:


2

หากคุณมีชื่อผู้ใช้และ / หรือ uid คุณสามารถทำได้ด้วย nginx + lua + luarocks ljsyscall

บนระบบเดเบียนกำหนดค่าเป็น:

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

สิ่งนี้จะดำเนินการ setfsuid ในทุกคำขอที่ให้บริการโดยคนงาน nginx น่าเสียดายที่คุณต้องใช้งาน nginx ในฐานะที่เป็นรูทเพื่อให้สิ่งนี้ทำงานได้ในขณะนี้ ฉันเชื่อว่าเป็นไปได้ที่จะทำงานกับผู้ใช้รายอื่นหากกระบวนการเริ่มต้นเป็นรูทผู้ใช้รายอื่นถูกเก็บรักษาไว้โดยมี CAP_SETUID เก็บรักษาไว้ (ดูเอกสารประกอบสำหรับcapsh) และuserคำสั่งไม่ปรากฏในไฟล์กำหนดค่า nginx

คุณอาจต้องตั้งรหัสประจำกลุ่มด้วย

ดูที่ "ผลกระทบของการเปลี่ยนแปลง ID ผู้ใช้ต่อความสามารถ" ใน http://man7.org/linux/man-pages/man7/capabilities.7.html


ที่ดูมีแนวโน้ม ฉันจะตรวจสอบมันออก
Philip Couling

0

สิ่งนี้อาจมีค่าในการอ่าน: อินพุตอื่น: โฟลเดอร์ผู้ใช้หลายคนและหนึ่งโฟลเดอร์แชร์http://hexeract.wordpress.com/2011/02/25/configure-a-webdav-enabled-webserver-for-multiple-user-foldersโฟลเดอร์ และอื่นหนึ่งที่แชร์โฟลเดอร์ /


ปัญหานี้มีปัญหาเหมือนกับคำตอบอื่น ๆ ของคุณ ผู้ใช้บางคนมีการเข้าถึง ssh ไฟล์จะต้องได้รับการแก้ไขให้ถูกต้อง (เป็นของตัวเองไม่ใช่ของเว็บเซิร์ฟเวอร์) การอนุญาตให้ใช้ไฟล์ unix และการเป็นเจ้าของ (ทั้งผู้ใช้และกลุ่ม)
Philip Couling

0

ฉันใช้อันนี้เป็นแนวทางในการตั้งค่า webdav: http://bernaerts.dyndns.org/linux/75-debian/62-debian-webdav-share

ใช่ Apache คือกลุ่ม (www-data ภายใต้ Debian) แต่คุณสามารถเพิ่มผู้ใช้ในกลุ่มนั้นได้ดังนั้นฉันจึงเพิ่มผู้ใช้รายหนึ่ง ไม่ได้ทดสอบว่าทำไมคุณไม่สามารถเพิ่มผู้ใช้รายอื่น .... เซิร์ฟเวอร์ webdav ที่ใช้โดยหลักการแล้วการติดตั้งนี้ทำงานเป็นเวลา 3 ปีที่สถานที่ของฉันและลูกชายของฉันวางไว้ Debian 6 นั้นเป็นรุ่น LTS มาหลายเดือนแล้ว (จนถึง ก.พ. 2559)

เปรียบเทียบกับ Bernaerts ฉันปรับในไฟล์ Apache: / 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 ที่มีสิทธิ์อ่าน / เขียนไปยังกลุ่มนั้น เนื่องจากผู้ใช้ทุกคนจะต้องอยู่ในกลุ่มนั้นผู้ใช้ทุกคนจะต้องเข้าถึงการอ่าน / เขียนไฟล์ของผู้ใช้ทุกคน การแก้ปัญหานี้ไม่ได้เกิดขึ้นกับผู้ใช้หลายคน
Philip Couling

0

คุณลองOwnCloud แล้วหรือยัง ยังคงเป็นเพียงการทดสอบด้วยตัวเอง แต่ดูเหมือนว่ามันจะเติมเต็มความต้องการของคุณ: webdav ทำงานได้ทันที


1
ใช่ฉันมีตัวอย่างของ Owncloud แต่นั่นไม่ใช่สิ่งที่ฉันกำลังมองหาเพราะผู้ใช้ owncloud (apache) เป็นเจ้าของไฟล์ทั้งหมด
Philip Couling

0

การค้นหาเป็นเวลานานฉันก็หาไม่เจอ มีเซิร์ฟเวอร์ผู้ใช้หลายคน แต่ฉันไม่พบเซิร์ฟเวอร์ที่เรียกใช้งานในฐานะผู้ใช้ระบบ

ดังนั้นฉันจึงเขียนเอง นี่คือการทดสอบเท่าที่ฉันสามารถทดสอบด้วยตัวเอง แต่สำหรับสิ่งที่คุ้มค่าซอร์สโค้ดก็อยู่ที่นี่:

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


0

Hy,

ฉันกำลังมองหาสิ่งเดียวกันและในที่สุดฉันก็รวบรวมทางออกโดยใช้ apache2 ฉันลองใช้วิธีแก้ปัญหาโหนดโดยใช้ npm webdav-server และพบว่าไม่ได้ทำงานได้ดีเหมือนกันแล้วใช้โมดูล apache จากนั้นฉันลองใช้เซิร์ฟเวอร์ npm dav โดยอิงจาก jsDAV ที่สามารถทำได้ดีกว่าและอาจเป็นวิธีแก้ปัญหา แต่เมื่อฉันต้องจัดการกับการเชื่อมต่อ 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

ดังนั้นฉันจึงเรียกใช้กระบวนการ apache ตามที่ผู้ใช้ myUser กำหนดไว้ใน / etc / apache2-myUser / envars

export APACHE_RUN_USER=myUser
export APACHE_RUN_GROUP=myUser

แก้ไขพอร์ต

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

ฉันไม่สามารถรับ PAM auth บน ubuntu 14.04 เพื่อใช้งานได้ดังนั้นจำเป็นต้องหลอกด้วย auth พื้นฐานเพราะฉันห่อมันใน https ด้วย nginx

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 เป็น proxy, apache สามารถทำ https ได้ดีมาก แต่เมื่อฉันชนเข้ากับ proxy ปลายทางปัญหาฉันรู้สึกว่ามันคุ้มค่าที่จะพูดถึงมัน


-1

ฉันกำลังมองหาวิธีการแก้ปัญหาที่คล้ายกัน

โซลูชันที่ 1: สภาพแวดล้อมเดสก์ท็อปของคุณ (Gnome, KDE) อาจมีวิดเจ็ตเพื่อแสดงโฟลเดอร์ที่แน่นอนโดย WebDAV สิ่งนี้จะทำงานตราบใดที่สภาพแวดล้อมเดสก์ท็อปของคุณกำลังทำงานและไม่ใช่โซลูชัน daemon

โซลูชันที่ 2: ไม่มีอะไรหยุดคุณไม่ให้รัน Apache ภายใต้ผู้ใช้ของคุณเองผูกบนพอร์ต unprivileged ด้านบน 1024 เพียงเขียนแฟ้มการกำหนดค่าหรือคัดลอกที่รวมอยู่ในการแจกจ่ายของคุณไปยัง $ HOME / etc / httpd (ตัวอย่าง) เพิ่ม DAV- ที่เกี่ยวข้อง config และเรียกใช้มันในฐานะผู้ใช้ที่ไม่ใช่รูทของคุณเช่น:

$ httpd -f $ HOME / etc / httpd

การทำงานในฐานะผู้ใช้ของคุณทำให้มั่นใจได้ว่า Apache จะสร้างไฟล์ตามที่คุณต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.