Apakah ada server webdav multi-pengguna yang tersedia untuk linux?

9

Saya ingin sepenuhnya menonaktifkan layanan SMBA saya dan menggantinya dengan layanan WebDav.

Semua pencarian google sejauh ini telah mengarahkan saya untuk menggunakan Apache / Webdav. Ini dekat dengan apa yang saya butuhkan tetapi sejauh yang saya baca itu membutuhkan Apache untuk memiliki akses ke file pengguna saya dan lebih buruk lagi; jika itu menciptakan file, file baru akan dimiliki oleh Apache (bukan pengguna). Perhatikan bahwa memiliki file dengan kepemilikan dan izin Unix yang benar adalah persyaratan karena beberapa pengguna memiliki akses SSH langsung.

Jadi saya cukup sederhana mencari cara untuk membuat Apache / Webdav bekerja "dengan benar" dengan multi-pengguna (yaitu mengubah pengguna unix menjadi pengguna yang masuk sebelum mencoba melayani file ) atau mencari alternatif lengkap untuk Apache / Webdav.

Sejauh ini pencarian belum menghasilkan apa-apa.

Philip Couling
sumber
Karena webdav didasarkan pada protokol HTTP, saya akan mengatakan itu tidak ada kecuali dalam bentuk server HTTP. Dan jika Anda menemukan produk yang menawarkan webdav, mereka biasanya akan menawarkan lebih dari itu
Kiwy
Sepertinya ada sesuatu yang menjanjikan di MPM ITK versi terbaru. mpm-itk.sesse.net Saya akan mencoba ini dan melihat apakah AssignUserIDExprakan menerima pengguna yang login. Sejak saat itu AssignUserIDsepertinya tidak muncul sebelum pengguna mengotentikasi.
Philip Couling
Ada server webdav mandiri seperti code.google.com/p/opendav atau perpustakaan seperti PyWebDAV yang tidak memerlukan apache.
Jan
@jan Itu mungkin berubah menjadi jawaban terbaik. Apache sudah berjalan di server dan webdav harus menjadi subdirektori di situs, tetapi saya dapat mengaturnya sebagai proxy yang melewati dan menggunakan SSL Apache untuk menyediakan enkripsi.
Philip Couling
1
Harus dipindahkan ke Rekomendasi Perangkat Lunak.SE .
William Edwards

Jawaban:

2

Jika Anda memiliki nama pengguna dan / atau uid, Anda dapat melakukannya dengan nginx + lua + luarocks ljsyscall

Pada sistem debian, dikonfigurasi sebagai:

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

Dan nginx mengkonfigurasi cara berikut:

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

Ini akan menjalankan setfsuid pada setiap permintaan yang dilayani oleh pekerja nginx. Sayangnya, tampaknya Anda harus menjalankan nginx sebagai root agar ini berfungsi saat ini. Saya percaya ini mungkin untuk bekerja dengan pengguna yang berbeda asalkan proses dimulai sebagai root, turun ke pengguna yang berbeda, dengan CAP_SETUID diawetkan (lihat dokumentasi untuk capsh), dan userarahan tidak ada dalam file konfigurasi nginx.

Anda mungkin juga perlu mengatur ID grup, secara potensial.

Lihat "Pengaruh perubahan ID pengguna pada kemampuan" di http://man7.org/linux/man-pages/man7/capabilities.7.html

Brian
sumber
Itu terlihat menjanjikan. Saya akan mengeceknya.
Philip Couling
0

Ini mungkin layak dibaca: Input lain: beberapa folder pengguna dan satu folder bersama http://hexeract.wordpress.com/2011/02/25/configure-a-webdav-enabled-webserver-for-multiple-user-folders -dan-satu-shared-folder /

Andre
sumber
Ini memiliki masalah yang sama dengan jawaban Anda yang lain. Beberapa pengguna memiliki akses ssh. File-file HARUS diberikan dengan benar (miliknya sendiri, bukan server web) izin file unix dan kepemilikan (baik pengguna dan grup).
Philip Couling
0

Saya menggunakan ini sebagai panduan untuk mengatur webdav: http://bernaerts.dyndns.org/linux/75-debian/62-debian-webdav-share

ya, Apache adalah grup (www-data di bawah Debian) tetapi Anda dapat menambahkan pengguna ke grup itu, jadi saya menambahkan satu pengguna. Tidak menguji mengapa Anda tidak dapat menambahkan pengguna lain .... Server webdav menggunakan pada prinsipnya pengaturan ini berjalan sekarang selama 3 tahun di tempat saya dan anak-anak saya (jadi 2 server identik untuk pekerjaan anak saya). Debian 6 adalah sejak beberapa bulan versi LTS (hingga Februari-2016).

Dibandingkan dengan Bernaerts, saya mengadaptasi file Apache: / etc / apache2 / sites-available / default pada bagian konfigurasi ini.

Alias /webdav1 /data/webdav1

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

Jadi file saya tidak lagi di bawah www tetapi di / data / webdav1 (melalui alias webdav1 agar tetap pendek) Untuk setiap hard disk saya telah membuat bagian seperti itu dan webdav1 menjadi webdav2 untuk hard disk ke-2 di bagian itu. Kita dapat membangun di max 10 hard disk di server ini, jadi 10 dari bagian ini di file konfigurasi. Saya menambahkan pengguna ke www-data, davfs2 dan davfs, sehingga pengguna dapat mengakses folder webdav. Jadi pengguna harus login dan akan diminta nama pengguna dan kata sandi. Dalam fstab semua disk data webdav terdaftar sehingga proses mount secara otomatis. Bagian fstab itu:

/ dev / sda3 / data / webdav1 ext3, pengguna, otomatis 0 0

Andre
sumber
1
Sayangnya ini tidak menyelesaikan masalah sama sekali. Fokus pertanyaan ini adalah multi-pengguna. Dengan solusi ini file baru akan dibuat sebagai pengguna apache bukan pengguna yang login. Untuk menjalankan apache, semua file harus berupa grup data-www dengan izin baca / tulis untuk grup itu. Karena setiap pengguna harus berada dalam grup itu, setiap pengguna harus memiliki akses untuk membaca / menulis file setiap pengguna lainnya. Solusi ini tidak mudah untuk banyak pengguna.
Philip Couling
0

Sudahkah Anda mencoba OwnCloud ? Masih hanya mengujinya sendiri, tetapi sepertinya memenuhi persyaratan Anda: webdav bekerja di luar kotak.

Ryder
sumber
1
Ya saya punya instance dari Owncloud tapi bukan itu yang saya cari karena pengguna owncloud (apache) memiliki semua file.
Philip Couling
0

Setelah lama mencari saya tidak bisa menemukannya. Ada banyak server multi-pengguna tetapi saya tidak dapat menemukan server yang dijalankan sebagai pengguna sistem.

Jadi saya menulis sendiri. Ini hanya diuji sejauh saya bisa mengujinya sendiri. Tetapi untuk apa nilainya, kode sumbernya ada di sini:

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

Philip Couling
sumber
0

Hy,

Saya mencari hal yang sama dan akhirnya saya mengumpulkan solusi menggunakan apache2. Saya mencoba solusi node menggunakan npm webdav-server dan menemukan tidak semua bekerja dengan baik kemudian menggunakan modul apache. Kemudian saya mencoba npm dav-server berdasarkan jsDAV yang bisa melakukan lebih baik dan bisa menjadi solusi, tetapi karena saya harus berurusan dengan koneksi 3g yang buruk, saya lebih suka apache dan mencari tahu tentang beberapa contoh skrip.

Jadi di sini saya berbagi pengalaman saya.

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

Saya menjalankan instance per pengguna webdav ... tidak terlalu skalabel, tetapi untuk bekerja dalam tim kecil itu cukup bagus.

Ganti myUser dengan pengguna Anda.

Di Ubuntu 14.04

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

Jadi saya menjalankan proses apache sebagai pengguna myUser didefinisikan di / etc / apache2-myUser / envars

export APACHE_RUN_USER=myUser
export APACHE_RUN_GROUP=myUser

Edit ports.conf

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

Saya tidak bisa mendapatkan PAM auth di ubuntu 14.04 agar bekerja sehingga perlu mengelabui dengan auth dasar karena saya kemudian membungkusnya dalam https dengan nginx

htpasswd -c /etc/apache2/htpasswd myUser

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

kemudian proxy nginx memiliki trik dengan header Tujuan lewat ikon folder memungkinkan webdav downgrade dengan baik di browser

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;

}

Tidak ada kewajiban untuk menggunakan nginx sebagai proksi, apache dapat melakukan https dengan sangat baik, tetapi ketika saya bertemu dengan masalah Tujuan proksi saya merasa perlu menyebutkannya.

Antony Gibbs
sumber
-1

Saya juga mencari solusi serupa.

Solusi 1: Lingkungan desktop Anda (Gnome, KDE) mungkin memiliki widget untuk membuka folder tertentu dengan WebDAV. Ini akan berjalan selama lingkungan desktop Anda berjalan dan bukan solusi daemon.

Solusi 2: Tidak ada yang menghentikan Anda dari menjalankan Apache di bawah pengguna Anda sendiri yang mengikat port yang tidak terjangkau di atas 1024. Cukup tulis file konfigurasi atau salin yang dibundel dalam distribusi Anda ke $ HOME / etc / httpd Anda (hanya sebuah contoh), tambahkan DAV- config terkait dan jalankan sebagai pengguna non-root Anda sendiri seperti:

$ httpd -f $ HOME / etc / httpd

Berjalan saat pengguna Anda memastikan Apache akan membuat file seperti Anda.

avibrazil
sumber