Настройка WebDAV-сервера dave в NetBSD
Содержание
Введение
После настройки Samba для доступа к модификациями на сервере Minecraft через локальную сеть захотелось организовать доступ через сеть Интернет. Но в Samba имеется обширный список незакрытых уязвимостей, а её поддержка в NetBSD завершена:
- Package samba-3.6.25nb38 has a privilege-escalation vulnerability, see https://www.samba.org/samba/security/CVE-2015-5299.html
- Package samba-3.6.25nb38 has a man-in-the-middle vulnerability, see https://www.samba.org/samba/security/CVE-2015-5296.html
- Package samba-3.6.25nb38 has a symlink-attack vulnerability, see https://www.samba.org/samba/security/CVE-2015-5252.html
- Package samba-3.6.25nb38 has a security-bypass vulnerability, see http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-7560
- Package samba-3.6.25nb38 has a man-in-the-middle-attack vulnerability, see http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-2118
- Package samba-3.6.25nb38 has a man-in-the-middle-attack vulnerability, see http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-2110
- Package samba-3.6.25nb38 has a denial-of-service vulnerability, see http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-5370
- Package samba-3.6.25nb38 has a man-in-the-middle-attack vulnerability, see http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-2113
- Package samba-3.6.25nb38 has a man-in-the-middle-attack vulnerability, see http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-2114
- Package samba-3.6.25nb38 has a man-in-the-middle-attack vulnerability, see http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-2115
- Package samba-3.6.25nb38 has a sensitive-information-disclosure vulnerability, see http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-2111
- Package samba-3.6.25nb38 has a man-in-the-middle-attack vulnerability, see http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-2112
- Package samba-3.6.25nb38 has a information-disclosure vulnerability, see https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2017-2619
- Package samba-3.6.25nb38 has a infinite-loop vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2017-9461
- Package samba-3.6.25nb38 has a denial-of-service vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2017-9461
- Package samba-3.6.25nb38 has a man-in-the-middle vulnerability, see https://www.samba.org/samba/security/CVE-2017-12150.html
- Package samba-3.6.25nb38 has a man-in-the-middle vulnerability, see https://www.samba.org/samba/security/CVE-2017-12151.html
- Package samba-3.6.25nb38 has a information-leak vulnerability, see https://www.samba.org/samba/security/CVE-2017-12163.html
- Package samba-3.6.25nb38 has a information-leak vulnerability, see https://www.samba.org/samba/security/CVE-2017-15275.html
- Package samba-3.6.25nb38 has a denial-of-service vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2018-1050
- Package samba-3.6.25nb38 has a heap-overflow vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2018-10858
- Package samba-3.6.25nb38 has a information-disclosure vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2018-10919
- Package samba-3.6.25nb38 has a authentication-bypass vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2016-2125
- Package samba-3.6.25nb38 has a symlink-attack vulnerability, see https://www.samba.org/samba/security/CVE-2019-3880.html
- Package samba-3.6.25nb38 has a use-after-free vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2020-10730
- Package samba-3.6.25nb38 has a denial-of-service vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2020-10745
- Package samba-3.6.25nb38 has a use-after-free vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2020-10760
- Package samba-3.6.25nb38 has a remote-denial-of-service vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2020-14303
- Package samba-3.6.25nb38 has a denial-of-service vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2020-14323
- Package samba-3.6.25nb38 has a information-disclosure vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2020-14318
- Package samba-3.6.25nb38 has a denial-of-service vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2020-14383
- Package samba-3.6.25nb38 has a denial-of-service vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2020-27840
- Package samba-3.6.25nb38 has a denial-of-service vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2021-20277
- Package samba-3.6.25nb38 has a access-bypass vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2021-20254
- Package samba-3.6.25nb38 has a arbitrary-file-write vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2021-43566
- Package samba-3.6.25nb38 has a out-of-bounds-write vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2021-44142
- Package samba-3.6.25nb38 has a information-disclosure vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2021-44141
- Package samba-3.6.25nb38 has a unspecified vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2021-3670
- Package samba-3.6.25nb38 has a information-disclosure vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2021-20316
- Package samba-3.6.25nb38 has a memory-corruption vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2022-32742
- Package samba-3.6.25nb38 has a security-bypass vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2022-2031
- Package samba-3.6.25nb38 has a insecure-defaults vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2022-32743
- Package samba-3.6.25nb38 has a insufficiently-random-numbers vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2022-1615
- Package samba-3.6.25nb38 has a sensitive-information-leak vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2018-14628
- Package samba-3.6.25nb38 has a remote-code-execution vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2022-2127
- Package samba-3.6.25nb38 has a man-in-the-middle vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2023-3347
- Package samba-3.6.25nb38 has a denial-of-service vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2023-34966
- Package samba-3.6.25nb38 has a denial-of-service vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2023-34967
- Package samba-3.6.25nb38 has a information-disclosure vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2023-34968
- Package samba-3.6.25nb38 has reached end-of-life (eol), see http://cdn.NetBSD.org/pub/NetBSD/packages/vulns/eol-packages
Поэтому выпускать Samba в дикий интернет, пусть и под управлением NetBSD, не кажется хорошей мыслью. Можно было бы настроить для этого FTP-сервер, но я решил попробовать настроить WebDAV.
Поначалу взял в качестве сервера WebDAV старый добрый nginx. И всё бы хорошо, но для его использования, как и в случае с сервером FTP, нужен специальный клиент с поддержкой этого протокола, поскольку имеющийся в Windows встроенный клиент WebDAV имеет нестандартную реализацию. Для обхода множества несовпадений со стандартом я пробовал воспользоваться решениями из статьи Nginx and Microsoft Windows WebClient (WebDav), но довольно быстро устал от этого и стал искать другие реализации серверов WebDAV.
Ручная сборка dave
Не сказать, чтобы я долго и тщательно отбирал возможные альтернативы. Мне приглянулся сервер dave на go. Я решил попробовать собрать двоичные файлы для операционной системы NetBSD с архитектурой i386, которую использую на виртуальной машине с сервером Minecraft, на своём компьютере под управлением Debian с архитектурой amd64. Сделать это очень просто:
$ git clone https://github.com/micromata/dave
$ cd dave
$ GOOS=netbsd GOARCH=386 go build -o dave cmd/dave/main.go
$ GOOS=netbsd GOARCH=386 go build -o davecli cmd/davecli/main.go
Собранные двоичные файлы dave
и davecli
можно скопировать на NetBSD и приступить к настройке. Но я решил собрать dave
средствами pkgsrc: Делаем pkgsrc для WebDAV-сервера dave. Далее с помощью pkg_comp
на виртуальной машине, предназначенной специально для сборки пакетов, я собрал пакет и установил его на виртуальной машине с сервером Minecraft:
# pkgin install dave
Далее я настроил запуск dave с помощью daemontools. Теперь перейдём к описанию настройки непосредственно самого WebDAV-сервера dave
.
Настройка
Сгенерируем хэш пароля для будущего пользователя:
# davecli passwd
Enter password:
Enter password:
Hashed Password: $2a$10$G5BMoCHuE7p0SDLnNUVszOTQPqeaZhi8Lh33M6TaofbyBf1tPTO36
К сожалению, эта утилита работает только интерактивно и не позволяет указать пароль в командной строке или передать его на стандартный ввод. Но в случае с NetBSD для генерации хэша можно воспользоваться утилитой pwhash
, имеющейся в базовой системе:
$ pwhash -b 10 '$ecretP4$$word'
$2a$10$Zfae20NtYSp4JTShsW9oZu/2NaxpJg7P4Ijl6v8kPzLX6ro6sW6Ve
Создаём файл /usr/pkg/etc/dave.yaml
со следующим содержимым, указав в качестве пароля ранее сгенерированный хэш:
address: "0.0.0.0"
port: "8000"
dir: "/var/games/minecraft-server/mods"
prefix: "/mods"
users:
stupin:
password: $2a$10$Zfae20NtYSp4JTShsW9oZu/2NaxpJg7P4Ijl6v8kPzLX6ro6sW6Ve
И ограничим доступ к файлу конфигурации. Дадим доступ на редактирование только пользоавтелю root
. Группе dave
дадим доступ только на чтение - в этой группе есть только пользователь dave
, от имени которого работает сервис, так что этих прав достаточно для того, чтобы сервер смог прочитать файл конфигурации. У всех остальных пользователей доступ отберём, чтобы они не смогли увидеть хэши паролей и попытаться взломать их:
# chown root:dave /usr/pkg/etc/dave.yaml
# chmod u=rw,g=r,o= /usr/pkg/etc/dave.yaml
Поскольку настроенный сервис работает от имени пользователя и группы dave
, нужно предоставить ему полный доступ в каталог с модификациями Minecraft:
# chown dave:dave /var/games/minecraft-server/mods
# chmod u=rwx,g=rx,o=r
Сервер Minecraft работает от имени пользователя minecraft
и будет иметь доступ на чтение данных из каталога на правах "остальных" пользователей.
Осталось запустить демона с новым файлом конфигурации:
# svc -du /service/dave/
Монтирование диска в 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
Сервер dave
имеет встроенную поддержку SSL/TLS, но не умеет переключаться на непривилегированного пользователя после открытия привилегированного порта. Поэтому настроить SSL/TLS в этом сервере можно, но для того, чтобы он работал на стандартных портах 80 и 443, нужно запускать его от имени пользователя root
, что не безопасно.
Я прибег к помощи 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 / {
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:8000/;
proxy_read_timeout 600s;
#proxy_buffering off;
#tcp_nodelay on;
}
}
Но описание подготовки сертификатов выходит за рамки этой статьи. Пример получения сертификатов Let's Encrypt для nginx под управлением Debian можно в статье: Получение SSL-сертификата от удостоверяющего центра Let's Encrypt в Debian Stretch