Чи доступний багатокористувацький сервер webdav для Linux?


9

Я хочу повністю вивести з експлуатації свою послугу SMBA і замінити її послугою WebDav.

Усі пошуки Google до цього часу вказували мені на використання Apache / Webdav. Це близько до того, що мені потрібно, але наскільки я читаю, Apache має доступ до файлів мого користувача і ще гірше; якщо він створює файл, новий файл буде належати Apache (не користувачеві). Зауважте, що наявність файлів із правильними правами власності та дозволами Unix є необхідною умовою, оскільки деякі користувачі мають прямий доступ до SSH.

Тому я досить просто шукаю спосіб або зробити так, щоб Apache / Webdav «правильно» працював з кількома користувачами (тобто змінити Unix користувача на зареєстрованого користувача перед спробою обслуговування файлу ) або знайти повну альтернативу Apache / Вебдав.

Поки пошуки нічого не завершили.


Оскільки webdav заснований на протоколі HTTP, я б сказав, що він не існує, за винятком форми HTTP-сервера. А якщо ви знайдете продукт, який пропонує webdav trhey, зазвичай пропонують більше
Kiwy

Схоже, в останній версії MPM ITK може бути щось перспективне. mpm-itk.sesse.net Я спробую з цим і побачу, чи AssignUserIDExprприймуть увійшов користувач. Оскільки це може не статися, AssignUserIDперш ніж користувач підтвердить автентифікацію.
Філіп Кулінг

Є окремі сервери веб-диска, такі як code.google.com/p/opendav, або такі бібліотеки, як PyWebDAV, для яких не потрібен апарат.
січня

@jan Це може виявитися найкращою відповіддю. Apache вже запущений на сервері, і webdav має бути підкаталогом на сайті, але я можу встановити це проксі як пропуск і використовувати SSL Apache для забезпечення шифрування.
Філіп Кулінг

1
Потрібно перейти до Software рекомендації.SE .
Вільям Едвардс

Відповіді:


2

Якщо у вас є ім’я користувача та / або uid, ви можете це зробити за допомогою nginx + lua + luarocks ljsyscall

У системі debian, налаштованій як:

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 як root, щоб це працювало зараз. Я вважаю, що це можливо для роботи з іншим користувачем за умови, що процес розпочався як root, перейшов до іншого користувача, із збереженим CAP_SETUID (див. Документацію для capsh), а userдиректива відсутня у файлі конфігурації nginx.

Можливо, вам також знадобиться встановити ідентифікатори групи, потенційно.

Див. "Вплив змін ідентифікатора користувача на можливості" на веб-сторінці http://man7.org/linux/man-pages/man7/capatility.7.html


Це виглядає перспективно. Я перевірю це.
Філіп Кулінг

0

Про це, можливо, варто прочитати: Ще один вклад: кілька папок користувача та одна спільна папка http://hexeract.wordpress.com/2011/02/25/configure-a-webdav-enabled-webserver-for-multiple-user-folders -і-одна-спільна папка /


Це має таку ж проблему, що і ваша інша відповідь. Деякі користувачі мають доступ до ssh. Файли ОБОВ'ЯЗКОВО надавати правильні (власні, а не веб-сервери) файли Unix, дозволи та права власності (як користувача, так і групи).
Філіп Кулінг

0

Я використовував цей путівник як посібник для налаштування webdav: http://bernaerts.dyndns.org/linux/75-debian/62-debian-webdav-share

так, Apache - це група (www-data під Debian), але ви можете додати користувачів до цієї групи, тому я додав одного користувача. Не перевіряв, чому ви не можете додавати інших користувачів .... Сервер webdav, який, в принципі, використовує цю установку, працює вже 3 роки в моєму і моїх синах (тому 2 однакові сервери для роботи мого сина). Debian 6 з декількох місяців є версією LTS (до лютого 2016 року).

Порівняно з Бернаертом, я адаптував у файлі Apache: / etc / apache2 / sites-available / за замовчуванням цю частину конфігурації.

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 для 2-го жорсткого диска в цьому розділі. Ми можемо створити максимум 10 жорстких дисків на цих серверах, тому 10 з цього розділу в цьому конфігураційному файлі. Я додав користувача до www-data, davfs2 та davfs, щоб користувач мав доступ до папок (-ів) webdav. Тому користувачеві потрібно увійти, і йому буде запропоновано ім’я користувача та пароль. У fstab всі диски даних webdav перераховані так, що монтаж відбувається автоматично. Ця частина fstab:

/ dev / sda3 / data / webdav1 ext3, користувач, auto 0 0


1
На жаль, це зовсім не вирішує проблему. У центрі уваги цього питання було багатокористувацьке. За допомогою цього рішення нові файли створюватимуться як користувач apache, який не ввійшов у систему. Для того, щоб функціонувати apache, усі файли повинні бути www-даними з правами читання / запису для цієї групи. Оскільки кожен користувач повинен бути у цій групі, кожен користувач повинен мати доступ для читання / запису файлів кожного іншого користувача. Це рішення просто не прокидається для кількох користувачів.
Філіп Кулінг

0

Ви пробували OwnCloud ? Ще просто тестую його сам, але здається, що він відповідає вашим вимогам: webdav працює нестандартно.


1
Так, у мене є примірник Owncloud, але це не те, що я шукаю, оскільки користувачеві owncloud (apache) належать усі файли.
Філіп Кулінг

0

Довго шукаючи, я просто не зміг його знайти. Існує багато серверів з декількома користувачами, але я не зміг знайти такого, який виконується як користувач системи.

Тому я написав сам. Це випробовується лише настільки, наскільки я можу сам його перевірити. Але для чого його варто, вихідний код тут:

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


0

Hy,

Я шукав те саме, і нарешті зібрав рішення за допомогою apache2. Я спробував рішення вузла за допомогою npm webdav-сервера і виявив, що не все спрацювало так добре, як за допомогою модуля apache. Тоді я спробував npm dav-сервер на основі jsDAV, який міг би бути кращим і міг бути рішенням, але, оскільки мені доводилося стикатися з влучним підключенням 3g, я віддав перевагу apache та дізнався про кілька сценаріїв екземплярів.

Тож тут я ділюсь своїм досвідом.

http://helpcenter.epages.com/Doc/doc/apache2/README.multiple-in вещества

Я запускаю екземпляр на користувача 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

Редагувати ports.conf

# 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 проксі має трюк із заголовком, який передає папку з піктограмами призначення, дозволяє веб-веб-сайтам добре знижуватись у браузерах

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 як проксі, apache цілком може зробити https, але, коли я наткнувся на проблему проксі-призначення, я відчув, що варто згадати про це.


-1

Я також шукаю подібне рішення.

Рішення 1: На робочому середовищі робочого столу (Gnome, KDE) можуть бути віджети для відкриття певної папки WebDAV. Це працюватиме до тих пір, поки працює середовище робочого столу та не є демоновим рішенням.

Рішення 2: Ніщо не заважає вам запустити Apache під власною прив'язкою користувача до непривілейованих портів понад 1024. Просто напишіть файл конфігурації або скопіюйте файли, що входять у ваш дистрибутив, у ваш $ HOME / etc / httpd (лише приклад), додайте DAV- пов'язаний конфігурація та запустіть його як власного некорінного користувача, наприклад:

$ httpd -f $ HOME / тощо / httpd

Працюючи як ваші користувачі, Apache створюватиме файли як ви.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.