Настройка 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