Перейти к содержанию

Проверка подлинности SSH-сервера

Sambryx проверяет ключ сервера до передачи SSH-реквизитов. Доверие задаётся администратором в OpenSSH-файле known_hosts. Неизвестный, изменившийся или отозванный ключ блокирует вход. Автоматического принятия ключей и кнопки обхода проверки нет.

Это изменение требует настройки при обновлении прежних установок: без доверенных ключей SSH-подключение не будет разрешено. Существующие пользователи и общие папки не меняются.

Не путайте ключ сервера с ключом пользователя: SSH_AUTHORIZED_KEYS_FILE разрешает вход клиенту, а SSH_KNOWN_HOSTS_FILE подтверждает подлинность сервера. Они не взаимозаменяемы.

Получение доверенного ключа

Через консоль сервера, консоль гипервизора или другой уже доверенный административный канал:

sudo cat /etc/ssh/ssh_host_ed25519_key.pub
sudo ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub -E sha256

Сверьте отпечаток с владельцем сервера. В локальный файл добавьте строку:

files.example.org ssh-ed25519 <base64-public-key-from-trusted-console>

Вместо files.example.org укажите точный host/IP, который вводится в форме. Для SSH-порта, отличного от 22, запись должна включать порт:

[files.example.org]:2222 ssh-ed25519 <base64-public-key-from-trusted-console>

Доверие для другого порта не переносится автоматически. Поддерживаются несколько ключей на адрес, имена через запятую и хешированные записи OpenSSH |1|.... Шаблоны имён и SSH host certificates / @cert-authority не поддерживаются; используйте конкретные имена. @revoked запрещает соответствующий ключ, даже если он также присутствует обычной записью.

ssh-keyscan сам по себе не доказывает подлинность сервера. Нельзя без независимой сверки отпечатка записывать его вывод в доверенные ключи: так можно закрепить ключ подменённого сервера.

Подключение файла

Файл содержит публичные ключи и должен читаться UID 10001 контейнера, но не изменяться приложением. Храните его вне Git, например в .local/ssh/known_hosts:

mkdir -p .local/ssh
# Create the file only if it does not exist; never truncate existing trust.
touch .local/ssh/known_hosts
# Add independently verified public host keys before login.
chmod 0644 .local/ssh/known_hosts

Для docker run добавьте:

--mount type=bind,src="$PWD/.local/ssh/known_hosts",dst=/etc/sambryx/known_hosts,readonly

Для production Compose задайте в .env:

SSH_KNOWN_HOSTS_FILE=./deploy/production/secrets/known_hosts

При непосредственном запуске JVM путь меняется через SAMBA_SSH_KNOWN_HOSTS или samba.ssh.known-hosts. По умолчанию используется /etc/sambryx/known_hosts. Недоступный файл приводит к безопасному отказу входа, но не выключает HTTP-приложение.

Первый запуск встроенного production-узла

Подготовьте TLS-файлы, .env и ключ управления по разделу полного стека. Публичный management.pub уже должен существовать: он нужен даже для запуска только узла.

Для новой установки со стандартным SSH_KNOWN_HOSTS_FILE создайте файл доверия. touch сохраняет существующие записи; не очищайте файл при повторном запуске. Если в .env выбран другой путь, используйте его вместо указанного:

mkdir -p deploy/production/secrets
touch deploy/production/secrets/known_hosts
chmod 0644 deploy/production/secrets/known_hosts

Пустой файл запрещает вход до добавления проверенного ключа. Запустите только Samba-узел:

docker compose --env-file deploy/production/.env \
  -f docker-compose.production.yml -f docker-compose.samba.yml \
  up -d --build --wait samba-node

Администратор, контролирующий Docker Engine, может получить ключ непосредственно из этого контейнера. Это доверенный административный канал, а не сетевое обнаружение:

docker compose --env-file deploy/production/.env \
  -f docker-compose.production.yml -f docker-compose.samba.yml \
  exec -T samba-node cat /etc/ssh/ssh_host_ed25519_key.pub
docker compose --env-file deploy/production/.env \
  -f docker-compose.production.yml -f docker-compose.samba.yml \
  exec -T samba-node ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub -E sha256

Сверьте SHA-256 отпечаток ключа, который собираетесь добавить, с результатом доверенной консоли узла. После подтверждения поместите публичный ключ в known_hosts одной строкой:

samba-node ssh-ed25519 <base64-public-key-from-trusted-console>

Завершающий комментарий публичного ключа необязателен. Сохраните права 0644 и запустите полный стек через bash scripts/production/run.sh --with-samba. Не записывайте в этот файл приватный ключ management: он нужен только для формы входа. Скрипт локального disposable sandbox сам получает публичные ключи собственного контейнера через Docker Engine в отдельный .local/sandbox/known_hosts, не затрагивая рабочие доверенные ключи; такое действие не применяется к произвольным удалённым серверам.

Если ключ ещё не добавлен

Сообщение о неизвестном ключе означает, что доверие для этого host/port не настроено. Показанный страницей отпечаток является полученным по сети, а не подтверждённым. Проверьте адрес и порт в форме, получите ключ и отпечаток через доверенный канал, сверьте их и добавьте запись с точным именем. Затем пересоздайте панель по production-инструкции и повторите вход. Не копируйте отпечаток из ошибки в качестве основания доверия.

Если ключ изменился

Страница входа сообщает о возможной подмене и показывает полученный SHA-256 отпечаток. Он служит диагностикой, а не подтверждением доверия. Реквизиты и команды к серверу не отправляются.

  1. Остановите попытки входа и выясните причину: переустановка, плановая ротация или неверный адрес.
  2. Сверьте новый отпечаток через независимый доверенный канал.
  3. Только после подтверждения замените нужную запись в known_hosts.
  4. Пересоздайте контейнер панели с тем же read-only подключением файла и войдите заново.

Пересоздание панели также завершает старые HTTP/SSH-сессии. При файловом bind mount атомарная замена файла на хосте может оставить старый inode в контейнере, поэтому одного редактирования файла недостаточно для гарантированного обновления доверия.

API возвращает HTTP 409 и код SSH_HOST_KEY_UNKNOWN / SSH_HOST_KEY_CHANGED; недоступный файл — HTTP 503 и SSH_HOST_KEY_UNAVAILABLE. Подробности исключений, приватные ключи, пароли и путь доверенного файла в ответ не включаются.