This commit is contained in:
2026-10-04 14:13:06 +04:00
parent 22cb56e52f
commit 6c2b76c4ca
2 changed files with 79 additions and 10 deletions
+75 -10
View File
@@ -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/).