SSH ключи под контролем: Пошаговая инструкция по настройке и копированию
Многие привыкли аутентифицироваться на SSH-сервере с помощью пароля. Это удобно, понятно и просто. Только стоит помнить о рисках брутфорс-атак, которые иначе называются атаками методом полного перебора. Специальные скрипты позволяют хакерам подбирать и угадывать даже самые сложные пароли. Чтобы обезопасить свой аккаунт, можно обойтись без пароля и проходить аутентификацию по ключам SSH. В статье рассказываем, где их взять и как использовать.

Что такое SSH-ключи
SSH полностью звучит как Secure Shell. В переводе — «безопасная оболочка». Так называют протокол для безопасной передачи данных, обеспечивающий шифрование информации и проверку ее подлинности. SSH применяется для управления корпоративными сетями, защищенного обмена сведениями, удаленного доступа к виртуальным машинам и операционным системам.
Также аббревиатура SSH относится к инструментам, которые используются для взаимодействия с описанным протоколом. Речь о ключах — некой секретной информации, которая позволяет криптографическим алгоритмам шифровать и расшифровывать сообщения, создавать и проверять квалифицированную электронную подпись (КЭП).
Подробнее о криптографической защите и ее роли в предотвращении утечек вы можете прочитать тут.

Если используется симметричное шифрование, то будет фигурировать только один ключ. Если асимметричное, то пара ключей — открытый и закрытый. Более подробно эти ключи мы опишем в следующем разделе.
 Схема защищенного соединения
Схема защищенного соединенияОткрытые и закрытые ключи
Открытый ключ представляет собой набор символов для шифрования информации. Иначе он называется публичным, потому что доступен всем. Даже если такой ключ попадет в третьи руки, ничего критичного не произойдет — злоумышленник не сможет только с его помощью расшифровать данные.
Закрытый SSH-ключ, напротив, является приватным. Он используется для расшифровки передаваемых сообщений. Хранится на устройстве, которое подключается к удаленному узлу, где хранится открытый ключ. Если такой ключ попадет в чужие руки, возможны утечки данных, в том числе и крупные. Чтобы избежать инцидентов, закрытый SSH-ключ нельзя никому передавать и загружать в файлообменники. Для дополнительной защиты стоит установить пароль.
Пара ключей — открытый и закрытый, используется в асимметричном шифровании. Данные шифруются с помощью открытого ключа, расшифровываются благодаря закрытому. Даже если информация попадет к злоумышленникам, без приватного ключа она будет представлять собой нечитаемый набор символов.
Коротко опишем схему работы с ключами. Представьте, что у нас есть узел А и узел В. На узле А оба ключа создаются и хранятся. На второй узел передается копия открытого ключа, благодаря чему пользователь может с узла А подключаться к узлу В. Закрытый SSH-ключ никуда не передается. Он хранится у пользователя.
Чтобы получить ключи, необходимо сгенерировать их с помощью алгоритмов, поддерживаемых используемой версией SSH-протокола. Например, если это RSA, файлы будут выглядеть так:
- id_rsa.pub — открытый ключ; 
- id_rsa — закрытый ключ. 
 Открытый и закрытый SSH-ключи
Открытый и закрытый SSH-ключиКлассификация SSH-ключей по типу шифрования
SSH-ключи классифицируют не только по степени приватности, но и по типу шифрования.
Вот короткое описание алгоритмов:
- RSA — самый популярный тип SSH-ключей, основанный на ассиметричном шифровании. Он поддерживается многими системами и считается стандартом SSH-аутентификации. Ключи RSA обычно имеют длину 3072 бит, что обеспечивает достаточно высокий уровень безопасности. Но опция -b команды ssh-keygen позволяет самостоятельно настроить размер. Только учитывайте, что «тяжелый» ключ требует значительных вычислительных мощностей, поэтому вместо увеличения длины RSA для усиленной защиты логичнее выбрать другой алгоритм шифрования, например, на основе эллиптических кривых. 
- DSA — алгоритм, который основан на задаче вычисления дискретного логарифма. Он применяется не для шифрования данных, а для создания и проверки цифровых подписей. Ключи DSA обычно имеют длину 1024 бита, что снижает их эффективность в части защиты от взлома. 
- ECDSA — современный ассиметричный алгоритм шифрования, основанный на применении модульной арифметики и эллиптических кривых. Ключи ECDSA обычно имеют длину 256, 384 или 521 бит. Благодаря этому уменьшаются затраты вычислительных мощностей и повышается скорость работы по сравнению с RSA. 
- ED25519 — алгоритм, который тоже использует эллиптические кривые. Ключи ED25519 имеют длину 256 бит, что позволяет достичь баланса между безопасностью, скоростью и производительностью. Это надежный вариант для SSH-аутентификации, но пока поддерживается только в версиях от OpenSSH 6.5. 
- ECDSA-SK и ED25519-SK — это аналоги ECDSA и ED25519, только они поддерживаются «физическими» аутентификаторами. Применяются такие ключи в версии OpenSSH 8.2 и используются в процессе двухфакторной аутентификации с помощью устройств, которые работают с протоколом FIDO/U2F. 
Виртуальные и аппаратные SSH-ключи
Виртуальные — это обычные ключи в виде файлов , которые создаются и хранятся в цифровой среде. Публичный виртуальный ключ хранится на сервере, а приватный — на пользовательском устройстве.
Аппаратные SSH-ключи генерируются и хранятся на USB-токене, например, YubiKey. Приватный ключ никогда не покидает токен — извлечь его невозможно. Чтобы войти на сервер, почти всегда нужно физическое подтверждение — касание или нажатие на кнопку.
Как происходит аутентификация с помощью SSH-ключа
Представьте, что вы клиент, который хочет подключиться к серверу с использованием SSH-ключа. У вас уже должна быть готовая пара ключей. Закрытый вы не разглашаете, а публичный передаете серверу. Как будет происходить процесс:
- Вы отправляете запрос на подключение по TCP-порту. 
- TCP-соединение устанавливается, вы с сервером обмениваетесь данными о версиях SSH-протоколов. Это помогает серверу понять, какую конфигурацию применять. 
- Когда версии будут согласованы, сервер направит вам ключ хоста. 
- Если вы подтверждаете свои намерения подключиться, генерируется так называемый сеансовый ключ, который нужен для симметричного шифрования текущей сессии. 
- Сервер должен аутентифицировать вас, поэтому вы отправляете открытый ключ. 
- Сервер сверяет ваш ключ со своим списком публичных SSH-ключей. При совпадении сервер генерирует случайное число, зашифрованное с помощью открытого ключа и направляет его вам. 
- Вы своим закрытым ключом должны будете расшифровать сообщение и отправить серверу полученные данные. Если ваше число совпадает с числом, которое прислал сервер, аутентификация будет считаться успешной, и вы получите доступ на сервер. 
Процесс аутентификации занимает от нескольких секунд до нескольких минут. Все зависит от формата и длины ключей.
 Процесс  аутентификации с помощью SSH-ключа
Процесс  аутентификации с помощью SSH-ключаГенерация SSH-ключей
Процесс создания ключей отличается в зависимости от операционной системы. Рассмотрим алгоритмы генерации для Linux, macOS и Windows.
Использование ssh-keygen на Linux и macOS
Пошаговая инструкция, как пользоваться командой ssh-keygen:
- Откройте терминал с помощью настроенного сочетания клавиш или через меню приложений. 
- Выполните команду ssh-keygen для генерации ключей. 
- Выберите путь для сохранения ключа. По умолчанию ключ сохранится в файле ~/.ssh/id_rsa. Если вас это устраивает, нажмите Enter. 
- Укажите пароль для дополнительной защиты ключа либо пропустите этот этап. 
- Проверьте, что ключи создались с помощью команды ls ~/.ssh. Должны появиться файлы id_rsa и id_rsa.pub. 
- Скопируйте содержимое файла ~/.ssh/id_rsa.pub и добавьте открытый ключ на сервер. 
Если нужно скопировать ключ в буфер обмена, на macOS воспользуйтесь командой pbcopy < ~/.ssh/id_rsa.pub, на Linux — xclip -sel clip < ~/.ssh/id_rsa.pub (если установлен xclip).
 Генерация SSH-ключей в  Linux
Генерация SSH-ключей в  LinuxГенерация SSH-ключей в Windows
Для генерации ключей можно использовать программу PuTTY, которую необходимо скачать с официального сайта https://www.putty.org. Затем следует установить утилиту PuTTYgen.
Если программа установлена, найдите и откройте ее из меню «Пуск»:
- В PuTTYgen выберите тип ключа — ED25519 (или RSA с длиной 4096 бит, если требуется совместимость). 
- Нажмите кнопку Generate, подвигайте мышкой в открывшемся окне. При необходимости задайте парольную фразу (Key passphrase). Этот этап можно пропустить, но для дополнительной защиты все же лучше не игнорировать. 
- Нажмите Save private key и сохраните файл с расширением .ppk. Нажмите Save public key и сохраните публичный ключ. 
- Скопируйте содержимое поля «Public key for pasting into OpenSSH authorized_keys file» и добавьте его на сервер в файл ~/.ssh/authorized_keys. После этого все должно работать. 
Для генерации ключей можно использовать встроенный в Windows 10/11 OpenSSH. Действуйте так:
- Откройте PowerShell или CMD и проверьте команду ssh. Если набор утилит OpenSSH не установлен, откройте «Настройки» > «Приложения» > «Дополнительные компоненты Windows». 
- Установите OpenSSH Client и при необходимости OpenSSH Server. 
- Откройте PowerShell и выполните команду ssh-keygen -t ed25519 -C «your_email@example.com» либо ssh-keygen -t rsa -b 4096 -C «your_email@example.com», если нужна совместимость. 
- Укажите путь для сохранения ключа. По умолчанию ключ сохраняется в C:\Users\<username>\.ssh\id_ed25519. Если подтверждаете, нажмите Enter. Если нет — укажите другой путь. 
- Настройте парольную фразу, если хотите дополнительно защитить ключ. 
- Убедитесь, что ключи созданы. Зайдите в папку C:\Users\<username>\.ssh и проверьте, что там есть закрытый ключ id_ed25519 и открытый — id_ed25519.pub. 
- Скопируйте содержимое файла id_ed25519.pub и добавьте на сервер в файл ~/.ssh/authorized_keys. 
- Добавьте ключ в SSH-агент: Start-Service ssh-agent ssh-add ~\.ssh\id_ed25519. 
 Генерация SSH-ключа в Windows
Генерация SSH-ключа в WindowsКопирование SSH-ключей на сервер
Чтобы настроить аутентификацию по ключу, ключ нужно скопировать на сервер. Это можно сделать автоматически или вручную.
Автоматическое копирование с SSH-Copy-ID
SSH-Copy-ID — утилита для копирования публичного SSH-ключа на удаленный сервер. Как ей пользоваться:
- Чтобы передать публичный ключ на удаленный сервер, используйте команду: ssh-copy-id user@server_ip. 
- Утилита подключится к серверу по SSH и попросит ввести пароль от аккаунта на удаленном сервере. 
- Затем она автоматически добавит ваш публичный ключ из файла ~/.ssh/id_rsa.pub в файл ~/.ssh/authorized_keys на сервере. 
Также будут настроены правильные разрешения для файлов и каталогов на сервере.
Приведем пример. Ваш сервер находится по адресу 192.168.1.100, имя пользователя на сервере — admin. Команда для копирования ключа будет выглядеть так:
Если нужно загрузить открытую часть ключа в облачный каталог, можно воспользоваться сервисом Evolution SSH Keys от Cloud.ru. Он поддерживает импорт ключей типов rsa, dsa, ecdsa, ecdsa-sk, ed25519, ed25519-sk.

Ручное копирование ключей
Если у вас нет доступа на удаленный сервис, ключи придется копировать вручную. Если используете Linux, найдите файл id_rsa.pub. Если Windows, то public. Откройте файл и скопируйте его содержимое.
Подключитесь к удаленному серверу, найдите файл authorized_keys и вставьте сюда все, что скопировали. Когда внесете изменения, перезапустите службы SSH, например, с помощью следующих команд:
- для Ubuntu / Debian / Mint Linux) — sudo service ssh restart (для Ubuntu / Debian / Mint Linux); 
- для CentOS / RHEL / Fedora Linux) — sudo service sshd restart. 
Настройка аутентификации с использованием SSH-ключей
Чтобы ключи начали работать, нужно все правильно настроить и отключить вход с помощью пароля. Рассказываем, как добавлять ключи и настраивать разрешения.
Настройка на сервере
Для аутентификации через SSH необходимо передать публичный ключ на сервер. Если вы уже создали его, используйте команду ssh-copy-id. Пример: ssh-copy-id user@server_ip. Эта команда автоматически добавит ваш публичный ключ в файл ~/.ssh/authorized_keys на сервере. User — имя пользователя на сервере, server_ip — IP-адрес вашего сервера.
Если команда ssh-copy-id недоступна, можно скопировать содержимое публичного ключа (~/.ssh/id_rsa.pub) и вручную вставить в файл ~/.ssh/authorized_keys на сервере. Пример: cat ~/.ssh/id_rsa.pub | ssh user@server_ip 'cat >> ~/.ssh/authorized_keys'.
Дальше нужно настроить разрешения на каталоги и файлы, связанные с SSH. Убедитесь, что на сервере установлены следующие разрешения:
- Каталог ~/.ssh должен быть доступен только для владельца. Права доступа: chmod 700 ~/.ssh. 
- Файл ~/.ssh/authorized_keys. Этот файл должен содержать публичные ключи пользователей, которым разрешено подключаться через SSH. Убедитесь, что файл доступен только владельцу: chmod 600 ~/.ssh/authorized_keys. 
- Настройка защиты публичного ключа от компрометации путем ограничения доступа для всех посторонних лиц: chmod 600 ~/.ssh/id_rsa. 
Дальше убедитесь, что SSH-сервер настроен для использования ключей. Это можно проверить в конфигурационном файле SSH-сервера: sudo nano /etc/ssh/sshd_config. Должно быть так: PubkeyAuthentication yes, PasswordAuthentication no. PubkeyAuthentication yes означает разрешение на аутентификацию по публичному ключу. PasswordAuthentication no отключает аутентификацию с помощью пароля. Когда все проверите и внесете изменения, сохраните файл и перезапустите SSH-сервис командой sudo systemctl restart sshd.
Отключение проверки пароля
Если не планируете больше входить по паролю, отключите опцию. Только перед этим убедитесь, что сохранили ключ. Как отключить проверку пароля:
- Авторизуйтесь на сервере, откройте файл /etc/ssh/sshd_config. 
- Найдите в конфигурационном файле директиву PasswordAuthenticatin. 
- Установите ее значение в No: $ sudo vi /etc/ssh/sshd_config. 
- Сохраните файл и перезапустите службу: $ sudo service ssh restart. 
После этих настроек вы сможете войти на сервер только по ключу — пароль уже действовать не будет.
Преимущества аутентификации с использованием SSH-ключей
Преимущества мы уже подчеркивали в тексте, но еще раз представим их отдельным списком:
- SSH-ключи безопаснее паролей, поскольку приватный ключ никогда не передается и его невозможно угадать или перехватить. 
- SSH-ключи защищены криптографией, поэтому атаки типа брутфорс против них неэффективны. 
- После настройки ключей, вам не нужно вводить пароль при каждом подключении к серверу, что ускоряет процесс. 
- Аутентификация по SSH-ключам идеально подходит для автоматизированных процессов, когда важно подключаться к серверам без участия человека или с минимальным участием. 
- Можно управлять доступом, добавляя или удаляя публичные ключи в файле authorized_keys на сервере. 
- SSH-ключи поддерживаются большинством операционных систем и инструментов для работы с удаленными серверами. 
Защита SSH-ключа
Чтобы предотвратить несанкционированный доступ к ключам, позаботьтесь о защите с помощью пароля или SSH-агента.
Использование пароля и парольной фразы
Когда вы будете создавать SSH-ключ, система предложит защитить его паролем. Пароль должен быть длинным, включать разные символы и пробелы.
Пример команды, которая позволит добавить к существующему ключу пароль:
Для изменения и удаления используется та же команда. Если нужно удалить пароль, примените команду и дважды нажмите Enter.
Если на сервере предусмотрена двухфакторная аутентификация, можно придумать парольную фразу. Она пригодится в схеме «обладание-знание». Сначала вы предъявляете системе то, что у вас есть — это ключ. Затем то, что вы знаете — парольную фразу.
Использование SSH-агента
Агент — программа для хранения закрытых ключей и их автоматического применения при подключении. Ее использовать удобнее, чем пароль, поскольку не нужно ничего вводить.
Чтобы настроить SSH-агент на Linux/macOS, выполните команду: eval "$(ssh-agent -s)" и добавьте ключ.
В Windows. Установите автозапуск службы Get-Service -Name ssh-agent, добавьте ключ. Например, ssh-add $env:USERPROFILE\.ssh\id_ed25519.
Частые проблемы и их решения
В процессе работы с ключами иногда возникают сложности, которые нужно быстро решать. Даем сценарии для самых распространенных проблем.
Отсутствие SSH-ключей
Если вы не сгенерировали ключи, необходимо это сделать с помощью команды:
Небезопасные разрешения на файлы ключей
В такой ситуации будет блокироваться использование ключей. Установите корректные разрешения с помощью команд:
SSH-агент не запущен или ключ не добавлен
Ключ не доступен для сессии, потому что не добавлен в SSH-агент. Решение:
Неверный путь к ключу в конфигурации
Бывает, что SSH использует не тот ключ при подключении. Нужно настроить файл ~/.ssh/config, указав путь к ключу:
Ключ не добавлен в удаленный сервер
Публичный ключ не будет работать, если не добавлен в ~/.ssh/authorized_keys на сервере. Добавьте содержимое файла id_ed25519.pub на удаленный сервер в файл ~/.ssh/authorized_keys.
Проблемы с правами доступа на сервере
Такое бывает при неправильных разрешениях на .ssh или authorized_keys на сервере. Правильные можно установить с помощью команд:
Слишком много ключей, SSH выбирает не тот
Если ключей несколько, SSH будет их перебирать, пока не найдет нужный. Лучше сразу указать конкретный ключ в команде:
SSH-ключ устарел или скомпрометирован
В этом случае нужно удалить старый ключ, сгенерировать новый и обновить его на всех удаленных серверах.
Файрвол или сервер блокируют подключение
Такое бывает, если закрыт нужный порт или доступ ограничен из-за настроек фаервола. Необходимо все перепроверить, поменять настройки и попробовать авторизоваться снова.
Итоговые рекомендации по обеспечению безопасности при использовании SSH-ключей
В ваших силах минимизировать риски компрометации ключей и усилить безопасность данных. Универсальные советы:
- Всегда задавайте парольную фразу при создании закрытого ключа. Это обеспечит дополнительную защиту в случае компрометации. 
- Храните закрытые ключи только в защищенных местах и никогда не передавайте третьим лицам. 
- Ограничьте доступ по IP-адресам на стороне сервера. Используйте файрвол или настройки sshd_config, чтобы допускать подключения только с определенных адресов. 
- Используйте разные ключи для разных сервисов и серверов. 
- Используйте файл конфигурации ~/.ssh/config с минимальными правами доступа. 
- Отключите аутентификацию по паролю на сервере, чтобы предотвратить атаки методом перебора. 
- Ограничьте доступ по ключу, чтобы снизить риски несанкционированных действий. 
- При необходимости настройте двухфакторную аутентификацию, например, комбинируйте SSH с One-Time Password (временным паролем). 
- Регулярно обновляйте и меняйте ключи во избежание компрометации. 
- Ведите журнал доступа и отслеживайте все подключения по SSH. 
- Отключите root-доступ по SSH. 
- Сразу удаляйте устаревшие или неиспользуемые ключи. 
- Используйте аппаратные ключи безопасности, если нужна усиленная защита. 
Заключение
Пароли — почти «забытое старое» в мире информационной безопасности. Из-за рисков атак методом перебора все чаще используется аутентификация по SSH-ключам. Они не только безопаснее, но и удобнее паролей. Сравните, что лучше — один раз сгенерировать и настроить на сервере криптографический ключ или каждый раз при подключении вводить сложные комбинации.
