Так как SilverBullet установлен на виртуальном выделенном сервере, сетевой адаптер которого смотрит прямо в интернет и имеет «белый» IP-адрес, необходимо защитить передаваемые заметки, пароли и файлы от перехвата и подмены. Защита сервиса, являющегося приложением, работающим через веб-интерфейс, прежде всего подразумевает настройку доступа к нему при помощи протокола HTTPS, более безопасного по сравнению с HTTP.
Настройка защиты через подключение по HTTPS заключается в установке на веб-сервис TLS-сертификата от доверенного Центра сертификации, например, Let’s Encrypt. Поскольку сам SilverBullet слушает только локальный порт, для обмена данными со своими клиентами нужно дополнительно установить веб-сервер, который будет работать в качестве обратного прокси, то есть принимать запросы от клиентов и перенаправлять их на внутренний сервис, скрывая тем самым реальную конфигурацию. В отличие от классического прокси, который работает «от клиента к интернету», обратный прокси работает «от интернета к внутреннему серверу».
Одним из решений, реализующих подобную схему, является установка и настройка веб-сервера Caddy. Caddy будет работать для SilverBullet как внешний шлюз. Браузеры подключаются к нему по HTTPS, а веб-сервер перенаправляет запросы на SilverBullet. При этом сам SilverBullet слушает только локальный порт на сервере.
В статье разберём, как на Ubuntu и Debian настроить доступ к SilverBullet по HTTPS, используя Caddy в качестве обратного прокси.
Подготовительные работы
Чтобы установить TLS-сертификат от Let’s Encrypt, который обеспечит возможность подключения к веб-сервису по протоколу HTTPS, необходимо прежде всего настроить доступ к данному веб-ресурсу по его доменному имени. Let’s Encrypt не выдаёт сертификаты для сайтов, доступных только по своему IP-адресу, так как протокол проверки владения (ACME) завязан на доменные имена. TLS-сертификат можно получить только для домена или поддомена, который указывает на веб-сервер.
Следовательно, у вас должно быть доменное имя, которое нужно привязать к IP-адресу виртуального сервера. Такая настройка производится при помощи специальной DNS-записи – A-записи. Сделать это можно либо на сайте-регистраторе домена, либо в личном кабинете RUVDS во вкладке Домены.

Кроме того, необходимо обеспечить доступ к серверу через TCP-порты 80 и 443. Порт 443 традиционно используется для подключения по HTTPS. В свою очередь, порт 80 нужен обратному прокси для автоматического выпуска и продления TLS-сертификатов. Чтобы валидировать домен по протоколу HTTP-01, Центр сертификации обращается к веб-ресурсу именно по порту 80. Если порт будет закрыт, проверка не сможет завершиться успешно, и выдачи сертификата не произойдёт.
Для открытия доступа к серверу через порты 80 и 443 добавьте в брандмауэр UFW разрешающие правила для предустановленных профилей http и https, которые обеспечат доступность VPS через данные порты:
$ sudo ufw allow http
$ sudo ufw allow httpsДалее, установите две утилиты, которые будут использоваться при дальнейшей настройке:
- curl— утилита, используемая для скачивания файлов из сети;
- gpg — программа для работы с системой шифрования, которая позволяет проверять цифровые подписи, шифровать и расшифровывать данные.
$ sudo apt install curl gpgКак настроить доступ к SilverBullet по HTTPS
Переходя к настройке доступа по HTTPS, загрузите GPG-ключ репозитория Caddy, сохранив его в системном хранилище. Это позволит пакетному менеджеру APT проверять подлинность устанавливаемых пакетов:
$ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpgПри помощи следующей команды добавьте репозиторий Caddy в систему для последующей установки пакета:
$ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.listПосле чего обновите списки пакетов:
$ sudo apt updateЗатем установите Caddy:
$ sudo apt install caddyВ ходе инсталляции будет создана новая служба для веб-сервера Caddy. Служба должна стартовать и должна быть помещена в автозагрузку, чтобы запускаться вместе с системой. Убедиться в корректности установки можно с помощью команды, которая выведет на экран текущее состояние службы:
$ systemctl status caddyВывод команды должен показать, что служба работает и установлена в автозагрузку. Также вывод не должен содержать сообщений о каких-либо ошибках.

В Caddy все основные настройки можно описать в конфигурационном файле под названием Caddyfile. Поэтому, чтобы настроить Caddy для работы в качестве обратного прокси, откройте для редактирования данный файл:
$ sudo nano /etc/caddy/CaddyfileПоскольку мы запускаем Caddy только как обратный прокси, то достаточно привести его к следующему виду:
your-site-name.ru {
    reverse_proxy localhost:3000
}В данном случае:
- your-site-name.ru— доменное имя, по которому будет доступен веб-интерфейс SilverBullet;
- 3000— порт, на котором будет работать SilverBullet внутри сервера.
Таким образом, Caddy теперь будет принимать запросы на имя домена your-site-name.ru по порту 443 и пересылать их внутрь на процесс SilverBullet, слушающий порт 3000.
Сохраните файл после внесения изменений, закройте его и перезапустите службу Caddy:
$ sudo systemctl restart caddyЗатем откройте браузер и перейдите на https://your-site-name.ru, где вместо your-site-name.ru укажите доменное имя, предназначенное для веб-сервиса SilverBullet.

Теперь доступ к SilverBullet осуществляется с использованием протокола HTTPS, что видно в навигационной строке браузера.
И поскольку TCP-порт 3000 больше не используется для доступа к SilverBullet извне, вы можете удалить соответствующее ему правило из брандмауэра UFW:
$ sudo ufw delete allow 3000/tcpНастройка доступа к SilverBullet по паролю
Сервис, который запускается на виртуальном сервере как открытый веб-интерфейс, доступен из интернета абсолютно всем. Это значит, что любой человек сможет без пароля подключиться к нему, чтобы просматривать или даже изменять контент. Защитить заметки и данные от посторонних можно, установив пароль на доступ к веб-странице.
Установить такую защиту позволяет тот же Caddy, и сделать это можно, внеся некоторые изменения в его конфигурационный файл:
$ sudo nano /etc/caddy/CaddyfileПриведите Caddyfile к следующему виду:
your-site-name.ru {
    reverse_proxy localhost:3000
    route {
        basic_auth * {
              your-silverbullet-user $2a$14$.......F9cYi
        }
        reverse_proxy 127.0.0.1:3000
    }
}В данном случае:
- your-site-name.ru— доменное имя веб-интерфейса SilverBullet;
- 3000— порт, на котором работает SilverBullet внутри сервера;
- basic_auth *— секция, которая включает защиту паролем через HTTP Basic Authentication, где символ- *означает, что правило применяется ко всем запросам;
- your-silverbullet-user— имя пользователя для аутентификации;
- $2a$14$.......F9cYi— bcrypt-хэш пароля;
- reverse_proxy 127.0.0.1:3000— параметр указывает на то, что после авторизации все запросы будут идти на сервис, доступный локально на порту 3000.
Обратите внимание на строку, содержащую bcrypt-хэш пароля. Bcrypt-хэш — это результат работы алгоритма bcrypt, который специально создан для безопасного хранения паролей. Для его генерации используется следующая команда:
$ caddy hash-passwordВ ходе выполнения команда попросит вас дважды ввести пароль, при помощи которого вы будете подключаться к веб-интерфейсу. После чего выведет строку вида:
$2a$14$7YypXEXfVvGL9MEkX7MCOuDgeJ3hmbbghlqssmTKtCJpCgA5F9cYiИменно её необходимо скопировать в файл /etc/caddy/Caddyfile.
Закройте файл с сохранением изменений и перезапустите конфигурацию службы Caddy:
$ sudo systemctl reload caddyПосле чего откройте браузер и перейдите на веб-страницу SilverBullet, где авторизуйтесь при помощи пользователя, имя которого вы указали в конфигурационном файле Caddy, и пароля, который вы ввели при выполнении команды caddy hash-password.

