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