Настройка WebDAV-сервера WebDAV-Daemon в NetBSD

Содержание

Введение

После настройки Dave для доступа к модификациями на сервере Minecraft через локальную сеть захотелось найти более лёгкую альтернативу серверу Dave, который написан на языке программирования Go и использует большое количество модулей в качестве зависимостей. Моё внимание привлёк найденный на github.com сервер WebDAV-Daemon, написанный на языке Си и использующий всего несколько зависимостей.

Первым делом я написал pkgsrc и собрал пакет, а затем установил его на свой сервер Minecraft и настроил его запуск с помощью daemontools.

Настройка

Начнём с конфигурации, которую при настройке запуска webdavd через daemontools я решил поместить в файле /usr/pkg/etc/webdavd.xml. Этот файл имеет формат XML, при его написании я не стал пользоваться встроенной в него возможностью настройки SSL, т.к. для этого, как и в прошлый раз, решил воспользоваться nginx. У меня получился такой файл конфигруации:

<?xml version="1.0" encoding="utf-8" ?>
<server-config xmlns="http://couling.me/webdavd">
        <server>
                <listen>
                        <port>8080</port>
                        <encryption>none</encryption>
                </listen>
                <session-timeout>5:00</session-timeout>
                <chroot-path>~</chroot-path>
                <mime-file>/usr/pkg/share/examples/nginx/conf/mime.types</mime-file>
                <rap-binary>/usr/pkg/libexec/rap</rap-binary>
                <rap-timeout>2:00</rap-timeout>
                <pam-service>webdavd</pam-service>
                <static-response-dir>/usr/pkg/share/webdavd</static-response-dir>
                <max-lock-time>2:00</max-lock-time>
                <error-log></error-log>
                <access-log>/var/log/webdavd/access.pipe</access-log>
        </server>
</server-config>

Здесь используется файл /usr/pkg/share/examples/nginx/conf/mime.types, который я взял из пакета nginx и встроил в свой pkgsrc. Файл устанавливается в каталог с примерами файлов конфигурации. Если понадобится отредактировать его, то можно скопировать его в каталог /usr/pkg/etc и отредактировать его копию, соответствующим образом исправив путь к файлу в конфигурации демона.

Кроме этого понадобится файл /etc/pam.d/webdavd. Его я сформировал на основе файла /etc/pam.d/ftpd. Получился такой файл:

# $NetBSD$
#
# PAM configuration for the "webdavd" service
#

# auth
# This looks very much like "system", but lacks the "nullok" option on
# pam_unix.
#auth           required        pam_nologin.so          no_warn
auth            required        pam_unix.so             no_warn try_first_pass

# account
# Even though this is identical to "system", we open code it here because
# we open code the auth stack.
account         required        pam_unix.so

# session
session         required        pam_permit.so

Строку с модулем pam_login.so я закомментировал, поскольку на моём сервере нет файла /etc/nologin, а запретить вход можно выставив для пользователя оболочку /sbin/nologin.

Переходим к самому главному - для доступа к файлам нужно создать системного пользователя. Создадим для пользователя отдельную группу:

# groupadd mcmods

Создадим пользователя с комментарием "Minecraft Mods user", с домашним каталогом /var/games/minecraft-forge-server/mods, оболочкой /sbin/nologin и с первичной группой, одноимённой самому пользователю:

# useradd -c 'Minecraft Mods user' -d /var/games/minecraft-forge-server/mods -s /sbin/nologin -g mcmods mcmods

Выставим пароль пользователя:

# passwd mcmods

Поскольку настроенный сервис будет переключаться на того пользователя, который прошёл аутентификацию как клиент WebDAV, нужно предоставить этому пользователю полный доступ в каталог с модификациями Minecraft:

# chown mcmods:mcmods /var/games/minecraft-forge-server/mods
# chmod u=rwx,g=rx,o=r

Сервер Minecraft работает от имени пользователя minecraft и будет иметь доступ на чтение данных из каталога на правах "остальных" пользователей.

Монтирование диска в Windows 10

Чтобы разрешить аутентификацию через незашифрованный протокол HTTP, нужно запустить regedit, и проставить в ветке HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters и выставить параметру BasicAuthLevel значение 2.

Далее нужно перезапустить сервис webclient:

C:\> net stop webclient
C:\> net start webclient

Теперь можно подключить удалённый диск, например, с помощью команды такого вида:

С:\> net use z: http://192.168.1.2:8000/mods $ecretP4$$w0rd /user:stupin /persistent:yes

Отключить удалённый диск можно следующим образом:

C:\> net use z: /delete

Поддержка HTTPS

Сервер webdavd имеет встроенную поддержку SSL/TLS, но я прибег к помощи nginx, который выступает в роли прокси-сервера и добавляет поддержку шифрования. Пример фрагмента файла конфигурации для nginx приведён ниже:

server { listen 80;

  server_name minecraft.domain.tld;

  return 301 https://$server_name$request_uri;

  location /.well-known/acme-challenge/ {
    alias /var/www/.well-known/acme-challenge/;
  }
}

server {
  listen 443 ssl;

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  ssl_ciphers HIGH:!SSLv2:!aNULL:@STRENGTH;
  ssl_prefer_server_ciphers on;

  ssl_dhparam /etc/ssl/minecraft.domain.tld.dh-4096.pem;
  ssl_session_cache shared:SSL:10m;
  ssl_session_timeout 10m;

  ssl_certificate /etc/letsencrypt/live/minecraft.domain.tld/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/minecraft.domain.tld/privkey.pem;

  server_name minecraft.domain.tld;

   location /.well-known/acme-challenge/ {
     alias /var/www/.well-known/acme-challenge/;
   }

# Minecraft server mods
  location /mods {
    client_max_body_size 512M;
    proxy_redirect off;
    proxy_bind 127.0.0.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_pass http://127.0.0.1:8080/;
    proxy_read_timeout 600s;
    #proxy_buffering off;
    #tcp_nodelay on;
  }
}

Но описание подготовки сертификатов выходит за рамки этой статьи. Пример получения сертификатов Let's Encrypt для nginx под управлением Debian можно в статье: Получение SSL-сертификата от удостоверяющего центра Let's Encrypt в Debian Stretch