linux-labs

Вики / Сеть

SSH-ключи и ssh-agent

Концепция OpenSSH 9.6 СетьSSHБезопасностьПрава

Генерация ключей, authorized_keys, ssh-agent, права на файлы .ssh.

Аутентификация по ключам надёжнее пароля. Пара: приватный ключ (хранится у тебя, секрет) и публичный (кладётся на сервер в ~/.ssh/authorized_keys). Сервер шифрует челлендж публичным ключом — расшифровать может только владелец приватного.

ssh-keygen -t ed25519 -C "me@laptop"   # сгенерировать (ed25519 — современный выбор)
# приватный: ~/.ssh/id_ed25519  ·  публичный: ~/.ssh/id_ed25519.pub
ssh-copy-id user@host                  # закинуть публичный на сервер
ssh-keygen -t ed25519 -C "me@laptop"          # рекомендуемый тип
ssh-keygen -t rsa -b 4096 -C "legacy"         # если требуется RSA (старые системы)
ssh-keygen -t ed25519 -f ~/.ssh/deploy_key    # своё имя файла (несколько ключей)
ssh-keygen -p -f ~/.ssh/id_ed25519            # сменить/добавить пароль на ключ
ssh-keygen -y -f ~/.ssh/id_ed25519            # восстановить .pub из приватного
ssh-keygen -l -f ~/.ssh/id_ed25519.pub        # отпечаток (fingerprint)
ssh-keygen -t ed25519 -N '' -f key            # без пароля (для автоматизации/CI)

Установка на сервер:

ssh-copy-id user@host                          # самый простой способ
ssh-copy-id -i ~/.ssh/deploy_key.pub user@host # конкретным ключом
cat ~/.ssh/id_ed25519.pub | ssh host 'cat >> ~/.ssh/authorized_keys'   # вручную

SSH отказывает, если права слишком открыты (видит как небезопасные):

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_ed25519            # приватный ключ — только владельцу
chmod 644 ~/.ssh/id_ed25519.pub
chown -R "$USER:$USER" ~/.ssh

Агент держит расшифрованный ключ в памяти, чтобы не вводить пароль к ключу каждый раз:

eval "$(ssh-agent -s)"            # запустить агент
ssh-add ~/.ssh/id_ed25519        # добавить ключ (спросит пароль ключа один раз)
ssh-add -l                       # какие ключи загружены
ssh-add -t 3600 ~/.ssh/key       # с авто-выгрузкой через час
ssh-add -d ~/.ssh/key            # убрать один ключ
ssh-add -D                       # убрать все
ssh -A user@host                 # проброс агента (forwarding) — только на доверенные!

Permission denied (publickey)

  1. Публичный ключ есть в ~/.ssh/authorized_keys на сервере?
  2. Права: ~/.ssh=700, authorized_keys=600, владелец — сам пользователь. В журнале сервера: journalctl -u ssh → «Authentication refused: bad ownership or modes».
  3. Клиент шлёт нужный ключ? ssh -v host покажет, какие ключи пробует; укажи явно ssh -i ~/.ssh/key host или пропиши в ~/.ssh/config (IdentityFile).

Каждый раз спрашивает пароль к ключу

Ключ не в агенте: ssh-add ~/.ssh/id_ed25519. Чтобы автоматически — AddKeysToAgent yes в ~/.ssh/config (см. ssh-client).

Сервер вообще не принимает ключи

На сервере в sshd_config: PubkeyAuthentication yes, и каталог/файл не в обход AuthorizedKeysFile. После правки — sudo systemctl reload ssh (см. sshd).

Несколько ключей — подходит не тот / «Too many authentication failures»

Агент перебирает все ключи и упирается в лимит. Укажи конкретный: ssh -i key -o IdentitiesOnly=yes host.

Потерял приватный ключ

Восстановить нельзя — генерируй новый и обнови authorized_keys на серверах. (Из приватного можно достать публичный ssh-keygen -y, но не наоборот.)

ssh-keygen -t ed25519             # создать пару
ssh-copy-id user@host             # установить на сервер
ssh-keygen -l -f key.pub          # отпечаток
chmod 700 ~/.ssh; chmod 600 ~/.ssh/authorized_keys
ssh-add ~/.ssh/id_ed25519         # в агент
ssh -i ~/.ssh/key -o IdentitiesOnly=yes host   # конкретным ключом

См. также