diff --git a/docs/ssh-core-tunnel.md b/docs/ssh-core-tunnel.md index f52afda..b6546ad 100644 --- a/docs/ssh-core-tunnel.md +++ b/docs/ssh-core-tunnel.md @@ -73,20 +73,83 @@ ssh-copy-id -p "$CORE_PORT" \ ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub ``` -Не запускайте `ssh-keygen` повторно поверх существующего ключа. Если вход -по SSH-паролю отключён, добавьте содержимое `id_ed25519.pub` в -`~/.ssh/authorized_keys` выбранного пользователя через существующий доступ -и выполните первое подключение вручную с параметром `UserKnownHostsFile` выше. +Не запускайте `ssh-keygen` повторно поверх существующего ключа. -На веб-сервере проверьте, что вход теперь работает без пароля: +### Если пользователь допускает только ключ + +На веб-сервере выведите только публичную часть ключа: + +```bash +cat /etc/moonwell/ssh-tunnel/id_ed25519.pub +``` + +В существующей административной SSH-сессии **сервера ядра** замените имя +пользователя и вставьте эту строку вместо `ssh-ed25519 AAAA...`: + +```bash +TUNNEL_USER=ИМЯ_ПОЛЬЗОВАТЕЛЯ_ТУННЕЛЯ +sudo -H -u "$TUNNEL_USER" sh -c ' +set -eu +umask 077 +mkdir -p "$HOME/.ssh" +cat >> "$HOME/.ssh/authorized_keys" +chmod 700 "$HOME/.ssh" +chmod 600 "$HOME/.ssh/authorized_keys" +' <<'KEY' +restrict,port-forwarding,permitopen="127.0.0.1:13306" ssh-ed25519 AAAA... moonwell-web-db-tunnel +KEY +``` + +Так файл создаётся от имени самого пользователя. `restrict` отключает +дополнительные возможности ключа, а `port-forwarding` разрешает forwarding +к указанной в `permitopen` цели. При нестандартном `AuthorizedKeysFile` +используйте путь из конфигурации SSH вместо `~/.ssh/authorized_keys`. + +В уже существующем блоке `Match User` этого пользователя проверьте настройки: + +```text +Match User ИМЯ_ПОЛЬЗОВАТЕЛЯ_ТУННЕЛЯ + PubkeyAuthentication yes + AuthenticationMethods publickey + PasswordAuthentication no + KbdInteractiveAuthentication no + AllowTcpForwarding local + PermitOpen 127.0.0.1:13306 + MaxSessions 0 +``` + +`MaxSessions 0` разрешает forwarding и запрещает shell/command-сессии. +После изменения SSH-конфига выполните `sudo /usr/sbin/sshd -t`, а при успешной +проверке — `sudo systemctl reload ssh` (Ubuntu/Debian). Добавление самого ключа +в `authorized_keys` не требует перезагрузки службы. + +### Проверка входа и заполнение known_hosts + +На веб-сервере выполните ручное подключение с forwarding. Оно использует только +публичный ключ для входа и допускает подтверждение fingerprint при первом соединении: + +```bash +ssh -vNT -p "$CORE_PORT" \ + -i /etc/moonwell/ssh-tunnel/id_ed25519 \ + -o BatchMode=no -o IdentitiesOnly=yes -o PreferredAuthentications=publickey \ + -o PasswordAuthentication=no -o KbdInteractiveAuthentication=no \ + -o StrictHostKeyChecking=ask -o GlobalKnownHostsFile=/dev/null \ + -o UserKnownHostsFile=/etc/moonwell/ssh-tunnel/known_hosts \ + -o ExitOnForwardFailure=yes \ + -L 127.0.0.1:13307:127.0.0.1:13306 \ + "$CORE_USER@$CORE_HOST" +``` + +Сверьте fingerprint с ключом сервера ядра и подтвердите его. В выводе ожидается +успешная аутентификация `using "publickey"`; SSH остаётся работающим. Остановите +ручную проверку через `Ctrl+C`. Команда `ssh ... true` для пользователя с +`MaxSessions 0` не подходит, поскольку командные сессии ему запрещены. +Не задавайте `BatchMode=yes` при первоначальном подтверждении нового host key: +этот режим отключает взаимодействие с пользователем. Контейнер использует +`BatchMode=yes` и строгую проверку уже сохранённого `known_hosts`. ```bash chmod 600 /etc/moonwell/ssh-tunnel/id_ed25519 /etc/moonwell/ssh-tunnel/known_hosts -ssh -p "$CORE_PORT" \ - -i /etc/moonwell/ssh-tunnel/id_ed25519 \ - -o IdentitiesOnly=yes -o BatchMode=yes -o StrictHostKeyChecking=yes \ - -o UserKnownHostsFile=/etc/moonwell/ssh-tunnel/known_hosts \ - "$CORE_USER@$CORE_HOST" true ``` ## 3. Настройки веба @@ -180,4 +243,6 @@ vmangos_characters OK Документация: [OpenSSH forwarding](https://man.openbsd.org/ssh), [OpenSSH keepalive](https://man.openbsd.org/ssh_config), +[OpenSSH authorized_keys](https://man.openbsd.org/sshd), +[OpenSSH server configuration](https://man.openbsd.org/sshd_config), [Docker published ports](https://docs.docker.com/engine/network/port-publishing/). diff --git a/scripts/deploy-production.sh b/scripts/deploy-production.sh index a5939fd..c210d79 100755 --- a/scripts/deploy-production.sh +++ b/scripts/deploy-production.sh @@ -87,6 +87,10 @@ main() { log "Собираю production-образы" prod build app web + log "Запускаю MySQL сайта" + prod up -d mysql + wait_for_health mysql + log "Запускаю новый PHP-FPM" prod up -d --no-deps app wait_for_health app