Руководство для начинающих по SSH-ключам: генерация, использование и безопасное управление
Генерируйте SSH-ключи, копируйте открытые ключи на серверы, используйте ssh-agent и безопасно управляйте конфигурацией SSH для конкретных хостов.
Руководство для начинающих по SSH-ключам: генерация, использование и безопасное управление
SSH-ключи позволяют входить на серверы без отправки повторно используемого пароля по сети. Если вы управляете серверами Linux, облачными экземплярами или удаленными репозиториями Git, правильно защищенный SSH-ключ обычно безопаснее и удобнее, чем вход по паролю.
Это руководство для начинающих покажет вам, как сгенерировать пару SSH-ключей, скопировать открытый ключ на сервер, подключиться с помощью правильного закрытого ключа и поддерживать порядок в ключах по мере роста списка ваших серверов.
Понимание пар SSH-ключей
Аутентификация по SSH-ключам основана на паре криптографических ключей: закрытом и открытом. Эти ключи математически связаны, но вычислительно невозможно получить закрытый ключ из открытого.
- Закрытый ключ: Этот ключ должен храниться в секрете и никогда не передаваться. Он находится на вашем локальном компьютере и служит вашей идентификацией. Когда вы инициируете SSH-соединение, ваш клиент использует ваш закрытый ключ для подтверждения вашей личности.
- Открытый ключ: Этот ключ можно свободно распространять. Вы размещаете свой открытый ключ на удаленных серверах, к которым хотите получить доступ. Когда вы пытаетесь подключиться, сервер использует ваш открытый ключ, чтобы проверить, что у вас есть соответствующий закрытый ключ.
Когда вы пытаетесь подключиться к серверу, происходит следующий процесс:
- Ваш SSH-клиент предоставляет серверу ваш открытый ключ.
- Сервер проверяет, авторизован ли этот открытый ключ (т.е. присутствует ли он в файле
authorized_keys). - Если авторизован, сервер отправляет вашему клиенту задачу (challenge).
- Ваш клиент подписывает задачу вашим закрытым ключом и отправляет подпись обратно на сервер.
- Сервер проверяет подпись с помощью вашего открытого ключа. Если подпись действительна, аутентификация предоставляется без пароля.
Генерация пар SSH-ключей
Наиболее распространенный инструмент для генерации пар SSH-ключей — ssh-keygen. Эта команда доступна в большинстве систем Linux, macOS и Windows (через WSL или Git Bash).
Использование ssh-keygen
Чтобы сгенерировать новую пару SSH-ключей, откройте терминал или командную строку и выполните следующую команду:
ssh-keygen -t ed25519
Разберем эту команду:
ssh-keygen: Команда для генерации SSH-ключей.-t ed25519: Указывает тип создаваемого ключа.ed25519— это современный, высокозащищенный и быстрый алгоритм эллиптической криптографии. Другие распространенные варианты включаютrsa(например,ssh-keygen -t rsa -b 4096для 4096-битного RSA-ключа).
После выполнения команды вам будет предложено ответить на несколько вопросов:
- Введите файл для сохранения ключа (например,
/home/ваш_пользователь/.ssh/id_ed25519): Нажмите Enter, чтобы принять расположение по умолчанию. Это создаст два файла в вашем каталоге.ssh:id_ed25519(ваш закрытый ключ) иid_ed25519.pub(ваш открытый ключ). - Введите парольную фразу (пусто для отсутствия парольной фразы): Это критически важный шаг безопасности. Ввод парольной фразы шифрует ваш закрытый ключ на диске. Если файл вашего закрытого ключа будет скомпрометирован, злоумышленнику все равно понадобится парольная фраза для его использования. Настоятельно рекомендуется использовать надежную парольную фразу.
- Повторите парольную фразу: Подтвердите вашу парольную фразу.
Понимание выходных файлов
После генерации в вашем каталоге ~/.ssh/ (или в указанном вами пути) будут созданы два файла:
id_ed25519(илиid_rsa): Ваш закрытый ключ. НИКОГДА НЕ ДЕЛИТЕСЬ ЭТИМ ФАЙЛОМ. Ограничьте его права доступа только чтением для вашего пользователя.id_ed25519.pub(илиid_rsa.pub): Ваш открытый ключ. Это ключ, который вы будете распространять на серверах.
Защита вашего закрытого ключа
Важно убедиться, что ваш закрытый ключ имеет правильные права доступа к файлу. В Linux/macOS выполните:
chmod 600 ~/.ssh/id_ed25519
Эта команда ограничивает права на чтение и запись только владельцем файла, предотвращая доступ других пользователей системы к вашему закрытому ключу.
Развертывание вашего открытого ключа на сервере
После того как вы сгенерировали пару SSH-ключей, вам нужно разместить ваш открытый ключ на удаленном сервере (серверах), к которым вы хотите получить доступ.
Использование ssh-copy-id (рекомендуется)
ssh-copy-id — это служебный скрипт, который упрощает процесс копирования вашего открытого ключа на удаленный сервер. Он автоматически добавляет ваш открытый ключ в файл ~/.ssh/authorized_keys на сервере и устанавливает правильные разрешения.
Чтобы использовать ssh-copy-id, выполните следующую команду с вашего локального компьютера:
ssh-copy-id пользователь@удаленный_хост
Замените пользователь на ваше имя пользователя на удаленном сервере, а удаленный_хост на IP-адрес или имя хоста сервера. В последний раз будет запрошен пароль пользователя на удаленном_хосте для авторизации передачи ключа.
Если вы используете нестандартный SSH-порт (например, 2222), вы можете указать его с помощью опции -p:
ssh-copy-id -p 2222 пользователь@удаленный_хост
Ручное развертывание (если ssh-copy-id недоступен)
Если ssh-copy-id недоступен, вы можете вручную скопировать ваш открытый ключ. Сначала отобразите содержимое вашего открытого ключа на локальном компьютере:
cat ~/.ssh/id_ed25519.pub
Скопируйте весь вывод. Затем подключитесь по SSH к вашему удаленному серверу, используя пароль:
ssh пользователь@удаленный_хост
После входа создайте каталог .ssh, если он не существует, а затем создайте или добавьте данные в файл authorized_keys:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
Теперь вставьте содержимое вашего открытого ключа в файл authorized_keys. Вы можете сделать это с помощью текстового редактора, такого как nano или vim:
nano ~/.ssh/authorized_keys
Вставьте скопированный открытый ключ на новой строке. Сохраните и выйдите из редактора.
Наконец, убедитесь, что файл authorized_keys имеет правильные разрешения:
chmod 600 ~/.ssh/authorized_keys
После выполнения этих шагов вы сможете подключаться к серверу по SSH без пароля.
Подключение с помощью SSH-ключей
Как только ваш открытый ключ окажется на сервере, вы сможете подключиться, используя ваш закрытый ключ. SSH-клиент автоматически попытается использовать ключи, найденные в ~/.ssh/.
ssh пользователь@удаленный_хост
Если вы использовали парольную фразу при генерации ключа, вас попросят ввести ее сейчас. Если вы не использовали парольную фразу, вы войдете напрямую.
Указание другого ключа
Если у вас есть несколько пар SSH-ключей или ваш ключ находится не в стандартном месте, вы можете указать, какой закрытый ключ использовать, с помощью опции -i:
ssh -i /путь/к/вашему/закрытому_ключу пользователь@удаленный_хост
Управление SSH-ключами
По мере того как вы получаете доступ к большему количеству серверов, у вас будет накапливаться все больше SSH-ключей. Эффективное управление является ключом к поддержанию безопасности и удобства.
SSH-агент
SSH-агент — это фоновая программа, которая хранит ваши закрытые ключи в памяти, расшифрованные с помощью вашей парольной фразы. Это позволяет вам использовать ваши ключи для нескольких SSH-соединений без повторного ввода парольной фразы каждый раз.
- Запуск SSH-агента: Агент часто запускается автоматически при входе в вашу среду рабочего стола. Если нет, вы можете запустить его вручную:
eval "$(ssh-agent -s)" - Добавление ключей в агент: После запуска агента добавьте ваш(и) закрытый(е) ключ(и):
Вас попросят ввести парольную фразу. После этого агент будет управлять ключом, и последующие SSH-соединения будут использовать его автоматически.ssh-add ~/.ssh/id_ed25519
Файл конфигурации SSH (~/.ssh/config)
Файл конфигурации SSH-клиента (~/.ssh/config) позволяет вам определять псевдонимы для хостов и указывать параметры подключения, включая то, какой ключ использовать для конкретного хоста. Это невероятно полезно для управления несколькими серверами.
Создайте или отредактируйте файл ~/.ssh/config на вашем локальном компьютере и добавьте записи, подобные этим:
# Настройки по умолчанию
Host *
ServerAliveInterval 60
# Сервер 1: Веб-сервер
Host webserver
HostName 192.168.1.100
User webadmin
Port 2222
IdentityFile ~/.ssh/webserver_key
# Сервер 2: Сервер базы данных
Host dbserver
HostName db.example.com
User dbuser
IdentityFile ~/.ssh/db_key
С этой конфигурацией вы можете подключиться к веб-серверу, используя:
ssh webserver
И к серверу базы данных, используя:
ssh dbserver
SSH-клиент автоматически использует правильное имя пользователя, порт и файл закрытого ключа, как определено в файле ~/.ssh/config. Избегайте включения ForwardAgent yes глобально; пересылка агента полезна для некоторых рабочих процессов с прыжковыми хостами, но она открывает сокет вашего агента для удаленного хоста на время сеанса.
Ротация и отзыв ключей
- Ротация: Регулярно рассматривайте возможность ротации ваших SSH-ключей, особенно для систем с высоким уровнем безопасности. Это включает генерацию новых ключей и замену старых открытых ключей на серверах.
- Отзыв: Если закрытый ключ скомпрометирован или вам больше не нужен доступ, вы должны удалить соответствующий открытый ключ из всех файлов
authorized_keysна серверах, где он был развернут. Это критически важно для поддержания безопасности.
Лучшие практики и советы по безопасности
- Используйте парольные фразы: Всегда защищайте свои закрытые ключи надежными парольными фразами. Это ваша основная защита от несанкционированного использования в случае кражи файла закрытого ключа.
- Защитите права доступа к закрытому ключу: Убедитесь, что ваш файл закрытого ключа имеет права
600(-rw-------). - Используйте
ssh-agent: Используйте SSH-агент, чтобы избежать повторного ввода парольной фразы. - Отключите аутентификацию по паролю: Как только аутентификация по SSH-ключам заработает, рассмотрите возможность отключения аутентификации на основе пароля на ваших серверах для дополнительного уровня безопасности.
- Поддерживайте ключи в актуальном состоянии: Используйте современные надежные алгоритмы, такие как Ed25519. Избегайте старых RSA-ключей без достаточной длины битов (как минимум 4096).
- Будьте внимательны к
authorized_keys: Добавляйте в файлauthorized_keysтолько открытые ключи из надежных источников. - Регулярные аудиты: Периодически проверяйте файлы
authorized_keysна ваших серверах, чтобы убедиться, что присутствуют только авторизованные ключи.
Вывод
SSH-ключи стоит настроить до того, как вам понадобится экстренный доступ к серверу. Сгенерируйте современный ключ, защитите закрытый ключ парольной фразой, копируйте на серверы только открытый ключ и удаляйте устаревшие ключи из authorized_keys при изменении доступа.