open atlas
↑ К треку
Командная строка CLI · 09 · 02

Аутентификация по ключу

Аутентификация по ключу заменяет пароли криптодоказательством: приватный ключ никогда не покидает машину; сервер хранит только публичный ключ и проверяет подписанный вызов. ssh-agent кеширует расшифрованный ключ — вводишь фразу один раз за сессию.

CLI Senior ◷ 28 min
Уровень
ОсновыJuniorMiddleSenior

Парольная аутентификация SSH имеет фундаментальный недостаток: пароль передаётся по сети (зашифрованный, да, но всё равно это общий секрет, который можно перебрать брутфорсом, утечь или украсть через фишинг). Аутентификация по ключу полностью устраняет этот недостаток. Приватный ключ никогда не покидает твою машину — даже его хеш. Вместо этого сервер отправляет случайный вызов, твой клиент подписывает его приватным ключом, а сервер проверяет подпись, используя только публичный ключ, который у него уже есть. Украденный публичный ключ бесполезен без соответствующего приватного. Эта модель используется во всех серьёзных деплоях.

К концу урока ты будешь знать, как сгенерировать пару ключей Ed25519, распределить публичный ключ на сервер, понимать, что делает ~/.ssh/authorized_keys, и использовать ssh-agent, чтобы разблокировать ключ только один раз за сессию.

Цель

После этого урока ты сможешь сгенерировать пару ключей Ed25519 командой ssh-keygen -t ed25519, скопировать публичный ключ на сервер через ssh-copy-id, объяснить, почему приватный ключ никогда не должен покидать клиент, запустить ssh-agent и добавить ключ через ssh-add, а также понимать осторожность, необходимую при переброске агента.

1

Сгенерируй пару ключей командой ssh-keygen -t ed25519. Ed25519 — текущая лучшая практика: маленькие ключи (256-бит), быстрые, без слабых вариантов параметров в отличие от RSA.

ssh-keygen -t ed25519 -C "deploy key for server.example"

Вывод:

Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/alice/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/alice/.ssh/id_ed25519
Your public key has been saved in /home/alice/.ssh/id_ed25519.pub

Создаются два файла:

  • ~/.ssh/id_ed25519приватный ключ. Относись к нему как к паролю. Права 600, никогда не передаётся, никогда никуда не загружается.
  • ~/.ssh/id_ed25519.pubпубличный ключ. Безопасно копировать куда угодно. Именно это ты размещаешь на серверах.

Комментарий -C встроен в публичный ключ и помогает идентифицировать ключ позже. Парольная фраза шифрует приватный ключ на диске; без неё украденный файл ключа немедленно пригоден к использованию.

2

Приватный ключ никогда не покидает клиент — это гарантия безопасности. При аутентификации:

  1. Сервер отправляет случайный вызов (nonce).
  2. Твой SSH-клиент подписывает вызов приватным ключом.
  3. Подпись отправляется на сервер.
  4. Сервер проверяет подпись с помощью публичного ключа, хранящегося в ~/.ssh/authorized_keys.

Сервер никогда не видит приватный ключ. Сетевой атакующий, перехвативший сессию, видит только подпись — бесполезную без приватного ключа, который её создал. Это принципиально отличается от паролей, где сам секрет должен передаваться.

3

~/.ssh/authorized_keys на сервере авторизует конкретные публичные ключи. Каждая строка — один публичный ключ. При подключении SSH сопоставляет твой публичный ключ со списком. Формат:

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFakePublicKeyDataHereForIllustration deploy@workstation.example

Права файла должны быть правильными: каталог ~/.ssh/ должен иметь права 700, а authorized_keys600. SSHd отклоняет аутентификацию через authorized_keys, если права слишком открыты — это предотвращает инъекцию чужих ключей другими пользователями сервера.

ssh-copy-id — безопасный автоматический способ добавить публичный ключ:

ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@server.example

Он добавляет твой публичный ключ в ~/.ssh/authorized_keys на удалённом хосте (создавая файл и каталог при необходимости, с правильными правами). После этого можно SSH-ить с ключом вместо пароля.

Ручное добавление ключа (когда ssh-copy-id недоступен):

cat ~/.ssh/id_ed25519.pub | ssh deploy@server.example \
  'mkdir -p ~/.ssh && chmod 700 ~/.ssh && \
   cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys'
4

ssh-agent кеширует расшифрованный приватный ключ в памяти, чтобы ты вводил парольную фразу один раз. Без агента каждое SSH-подключение запрашивает парольную фразу. С ним:

eval "$(ssh-agent -s)"    # запустить агент, экспортировать SSH_AUTH_SOCK
ssh-add ~/.ssh/id_ed25519 # добавить ключ; один раз спросит парольную фразу
ssh deploy@server.example # нет запроса парольной фразы — агент подписывает вызов

Агент работает как фоновый процесс. Переменная окружения SSH_AUTH_SOCK указывает на Unix-сокет; SSH-клиент использует этот сокет, чтобы попросить агента подписать вызовы от его имени. Приватный ключ никогда не покидает процесс агента — клиент получает только подпись.

Просмотр загруженных ключей:

ssh-add -l

Удаление всех ключей из агента (например, перед тем как уйти):

ssh-add -D
5

Переброска агента (-A) позволяет удалённым хостам использовать твой локальный агент — но несёт риск. Если ты подключился к бастиону SSH, а затем с бастиона к внутреннему серверу, обычно бастиону нужен свой ключ для внутреннего сервера. С переброской агента вызов SSH внутреннего сервера пробрасывается обратно через бастион к твоему локальному агенту:

ssh -A deploy@bastion.example   # включить переброску для этой сессии

Риск: root на bastion.example может получить доступ к сокету агента и выдавать себя за тебя на любом другом сервере, доступном твоему агенту. Переброска агента должна включаться только на бастионных хостах, которым ты полностью доверяешь и управляешь. Для большинства многоэтапных схем ProxyJump в ~/.ssh/config (рассмотренный в предыдущем уроке) безопаснее, потому что прыжок обрабатывается локально, без раскрытия агента на промежуточном хосте.

Разбор примера

Настройка беспарольного доступа к новому серверу с нуля.

# 1. Сгенерировать ключ, если его нет
ssh-keygen -t ed25519 -C "laptop key $(date +%Y-%m)" -f ~/.ssh/id_ed25519

# 2. Скопировать публичный ключ на сервер (один раз использует парольную аутентификацию)
ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@server.example

# 3. Проверить работу ключевой аутентификации
ssh deploy@server.example 'echo "key auth works"'

# 4. Опционально отключить парольную аутентификацию на сервере (в /etc/ssh/sshd_config):
#    PasswordAuthentication no
#    Затем: systemctl reload sshd

После шага 4 парольная аутентификация невозможна, даже если злоумышленник угадает пароль — подключиться смогут только владельцы авторизованного приватного ключа. Это стандартный шаг усиления безопасности для любого SSH-сервера, доступного из интернета.

Почему это работает

На macOS ssh-add --apple-use-keychain ~/.ssh/id_ed25519 сохраняет парольную фразу в Keychain macOS, чтобы она сохранялась между перезагрузками. Директивы AddKeysToAgent yes и UseKeychain yes в ~/.ssh/config делают это автоматическим при каждом входе. На Linux нет встроенной интеграции с хранилищем ключей; распространённый подход — запускать ssh-agent в ~/.bashrc или ~/.profile и добавлять ключи при входе, или использовать рабочий стол с кольцом ключей (GNOME Keyring, KDE Wallet), интегрированным с SSH.

Частая ошибка

Никогда не генерируй ключ без парольной фразы на общей или постоянной машине. Ключ без парольной фразы немедленно пригоден к использованию кем угодно, кто может прочитать файл — включая других пользователей многопользовательской системы или злоумышленника, получившего доступ на чтение к твоей домашней директории. Парольная фраза шифрует приватный ключ на диске; ssh-agent затем кеширует расшифрованную форму в памяти, так что ты получаешь удобство без ввода парольной фразы при каждом подключении, не жертвуя защитой. Без парольной фразы = нет защиты в состоянии покоя.

Проверь себя
Викторина

Во время аутентификации по SSH-ключу что использует сервер для проверки твоей личности?

Итог

Аутентификация по ключу работает через запрос-ответ: сервер отправляет nonce, клиент подписывает его приватным ключом (который никогда не покидает клиент), а сервер проверяет подпись по публичному ключу в ~/.ssh/authorized_keys. ssh-keygen -t ed25519 генерирует пару; ssh-copy-id безопасно распределяет публичный ключ на сервер. ssh-agent хранит расшифрованный приватный ключ в памяти, чтобы ты вводил парольную фразу один раз за сессию. Переброска агента (-A) опасна: она раскрывает сокет агента на удалённом хосте — используй ProxyJump везде, где это возможно.

Практика

Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 4 завершено

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.