Skip to main content

Создание SSH ключа

Это не большая статья о том, что такое SSH и SSH-ключ, как его создать и как авторизовываться через него.

Что такое SSH?

SSH (Secure Shell) — защищённый сетевой протокол, который позволяет подключаться к удалённым серверам и управлять ими через зашифрованное соединение.

Но если говорить более глубоким языком, то:

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

Применяется в администрировании серверов, автоматизации, CI/CD и других задачах, где нужно безопасно управлять машинами по сети.

Что такое SSH ключ и зачем он н ужен?

SSH-ключ — это более безопасная альтернатива паролю. Он состоит из двух частей:

  1. Приватный ключ — хранится на локальной машине, его нельзя никому передавать.
  2. Публичный ключ — загружается на сервер и используется для проверки подлинности.

При подключении сервер проверяет, соответствует ли публичный ключ приватному, и если да — впускает без пароля.

Преимущества SSH-ключей перед паролями:

  • Их невозможно перехватить в процессе вода.
  • Они могут быть защищены фразой-паролем (passphrase), которая предотвращает их использование, если приватный ключ украдут.
  • Они упрощабт автоматизированные подключения, напримре в скриптах.

Как происходит подключение по SSH?

Постараюсь по существу рассказать, но много техшизы.

Установка соединения (handshake)

Когда клиент (ты) подключаешься к серверу (ssh user@host), происходит следующее:

  1. Клиент и сервер обмениваются поддерживаемыми алгоритмами (шифрование, хеширование, аутентификация).
  2. Сервер отправляет свой публичны ключ клиенту.
  3. Клиент генерирует временный симметричный ключ и зашифровывает его публичным ключом сервера.
  4. Сервер расшифровывает этот ключ своим приватным ключом.
  5. Теперь оба используют этот симметричный ключ для шифрования сессии.

Это называется Diffie-Hellman key exchange ну или EDCH (если на эллиптических кривых).

Ключевая мысль:

  • Асимметричное шифрование применятся только для установки безопасного соединения.
  • Дальше всё шифруется симметрично для быстродействия.

Аутентификация пользователя

После установки зашифрованного соединения сервер проверяет, кто ты такой.

Есть два варианта:

  1. Парольная аутентификация — вводишь пароль, сервер проверяет и пускает (не безопасно в текущих реалиях).
  2. Аутентификация по SSH-ключу — самый распространённый вариант.

Если используется SSH-ключ:

  1. Клиент говорит (условно): "Здаров, это я, держи мой публичный ключ".
  2. Сервер провеяет этот ключ в ~/.ssh/authorized_keys.
  3. Если ключ есть, то сервер отправляет случайное число (challenge).
  4. Клиент подписывает этот challenge приватным ключом и отправляет обратно.
  5. Сервер проверяет подпись с помощью публичного ключа (он же у него есть).
  6. Если подпись верна, клиент получает доступ.

Таким образом:

  • Пароль нигде не передаётся.
  • Взломать систему без приватного ключа невозможно.

Почему SSH безопасен?

Я бы сказал, что SSH держится на трёх китах.

  1. Симметричное шифрование (быстро и надёжно)

Используется после установки соединения для шифрования трафика. Примеры: AES, ChaCha20, Blowfish.

  1. Асимметричное шифрование (сложно взломать)

Применяется только в начале сессии и при аутентификации по ключам. Примеры: RSA (2048+ бит), ECDSA, Ed25519.

  1. Хеширование (гарантия целостности)

Каждое сообщение подписано хешем (HMAC). Примеры: SHA-2, SHA-3.

Бонус — защита от MITM-атак (человек посередине)

SSH использует fingerprint-сертификаты (отпечатки ключей). Если серверный ключ изменился — SSH предупредит об этом (WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!).

Как создать SSH-ключ?

SSH можно создать на любой UNIX-подобной системе (Linux, MacOS, WSL). В Windows лучше использовать Git Bash, PowerShell или Putty.

Я сделаю на примере Git Bash:

  1. Открываешь терминал.
  2. Вводишь команду:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  • -t rsa — используем алгоритм RSA (можно ed25519), если нужна более короткая и безопасная пара ключей).
  • -b 4096 — длина ключа, чем больше, тем сложнее взломать.
  • -C "your_email@example.com" — комментарий, например, email, чтобы различать ключи.
  1. Выбираем место соранения ключа: По умолчанию, это ~/.ssh/id_rsa. Если этот файл уже есть, можно задать другое имя.

  2. По желанию задаём passphrase — если введёшь, ключ будет защищён паролем.

  3. После выполнения команды будут созданы два файла

  • id_rsa — приватный ключ, никаких нахуй cmod 777 на него!!!
  • id_rsa.pub — публичный ключ.

Как добавить ключ на сервер?

Если у тебя уже есть SSH-доступ по паролю, добавь ключ вручную:

  1. Копируем публичный ключ на сервер:
ssh-copy-id user@remote_host

Если ssh-copy-id нет, можно вручную:

cat ~/.ssh/id_rsa.pub | ssh user@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
  1. Проверяем подключение:
ssh user@remote_host

Если всё ок — зайдёшь без запроса пароля.