Понимание аутентификации по SSH-ключам: объяснение открытых и закрытых ключей
Раскройте секреты аутентификации по SSH-ключам с помощью этого подробного руководства. Узнайте о фундаментальных ролях открытых и закрытых ключей, о том, как они работают вместе для защиты ваших удаленных подключений, и почему этот метод значительно превосходит вход по паролю. Эта статья содержит пошаговые инструкции по созданию и развертыванию ключей, а также основные преимущества безопасности и лучшие практики. Повысьте безопасность вашего сервера и упростите доступ с помощью SSH-ключей.
Понимание аутентификации по SSH-ключам: объяснение открытых и закрытых ключей
Аутентификация по SSH-ключам — это стандартный способ, которым многие администраторы, разработчики, CI-системы и инструменты развертывания входят на серверы. Ваш ноутбук хранит закрытый ключ, сервер хранит соответствующий открытый ключ, а SSH доказывает, что у вас есть закрытый ключ, не отправляя его по сети.
Последняя часть — это вся суть. Пароль — это секрет, который вы вводите во многих местах. Закрытый ключ — это секрет, который должен оставаться на вашем компьютере. Если вы защитите его парольной фразой и будете хранить только открытый ключ на серверах, вы получите метод входа, который одновременно безопаснее и проще автоматизировать, чем общие пароли.
Проблема с паролями
Традиционная аутентификация на основе пароля полагается на общий секрет: пароль. Хотя надежные пароли могут обеспечить приемлемый уровень безопасности, они подвержены нескольким недостаткам:
- Атаки методом перебора: Злоумышленники могут перебирать бесчисленные комбинации паролей, пока не угадают правильный.
- Словарные атаки: Используя распространенные слова или фразы, злоумышленники могут быстро скомпрометировать учетные записи.
- Кейлоггеры: Вредоносное ПО может перехватывать нажатия клавиш, раскрывая пароли.
- Фишинг: Методы социальной инженерии могут обманом заставить пользователей раскрыть свои учетные данные.
- Человеческая ошибка: Пользователи часто выбирают слабые, угадываемые или повторно используемые пароли и могут случайно их раскрыть.
Аутентификация по SSH-ключам снижает эти риски, потому что закрытый секрет не вводится на удаленном сервере. Это не делает ключи волшебством. Украденный незашифрованный закрытый ключ все еще может быть использован, а плохо управляемый файл authorized_keys может стать тихим черным ходом.
Аутентификация по SSH-ключам: обзор
Аутентификация по SSH-ключам использует асимметричную криптографию — систему, которая использует пару математически связанных ключей: открытый ключ и закрытый ключ. В отличие от симметричной криптографии, где один и тот же ключ используется как для шифрования, так и для дешифрования, асимметричная криптография использует один ключ для шифрования и другой, но связанный, ключ для дешифрования.
Когда вы подключаетесь с помощью ключей, сервер проверяет, доверяет ли ваша учетная запись предлагаемому открытому ключу. Затем ваш клиент подписывает данные аутентификации соответствующим закрытым ключом. Сервер проверяет эту подпись с помощью открытого ключа. Закрытый ключ не загружается на сервер.
Криптографический дуэт: открытые и закрытые ключи
В основе аутентификации по SSH-ключам лежат эти два различных, но взаимосвязанных компонента.
Закрытый ключ
Закрытый ключ — это ваша секретная идентичность. Это длинная, сложная строка символов, которая должна оставаться абсолютно конфиденциальной и никогда не передаваться никому. Думайте о нем как об уникальном ключе к вашему цифровому сейфу.
- Критически важно для безопасности: Если ваш закрытый ключ будет скомпрометирован, злоумышленник сможет выдать себя за вас и получить несанкционированный доступ к любому серверу, на котором был развернут соответствующий открытый ключ.
- Расположение: Обычно хранится на вашем локальном компьютере (например,
~/.ssh/id_rsa,~/.ssh/id_ed25519). - Защита: Он может быть защищен парольной фразой. Если кто-то скопирует файл ключа, парольная фраза будет дополнительным барьером между «файл украден» и «доступ к серверу украден».
Открытый ключ
Открытый ключ — это аналог вашего закрытого ключа. Он получен из вашего закрытого ключа, но не может быть использован для воссоздания закрытого ключа. Как следует из названия, открытый ключ предназначен для распространения и размещается на любом сервере, к которому вы хотите получить доступ.
- Распространяемый: Вы можете безопасно передавать свой открытый ключ кому угодно или на любой сервер, не ставя под угрозу свою безопасность.
- Расположение: На сервере открытые ключи обычно хранятся в файле
~/.ssh/authorized_keysдля каждой учетной записи пользователя. Каждая строка в этом файле представляет собой доверенный открытый ключ. - Роль: Открытый ключ позволяет серверу проверить подпись, созданную соответствующим закрытым ключом.
Как работает аутентификация по SSH-ключам: рукопожатие
Давайте разберем пошаговый процесс того, как аутентификация по SSH-ключам устанавливает безопасное соединение:
- Генерация пары ключей: Сначала вы создаете пару открытого и закрытого ключей на своем локальном компьютере. Закрытый ключ остается секретным, а открытый ключ — это то, что вы будете распространять.
- Развертывание открытого ключа: Вы копируете свой открытый ключ на удаленный сервер, к которому хотите получить доступ. Этот ключ обычно добавляется в файл
~/.ssh/authorized_keysв вашем домашнем каталоге на сервере. - Попытка подключения: Когда вы инициируете SSH-соединение с вашего локального компьютера на удаленный сервер, ваш SSH-клиент указывает, что хочет аутентифицироваться с помощью ключа.
- Проверка сервером: Сервер проверяет, разрешен ли предложенный открытый ключ для этого пользователя.
- Доказательство клиента: Ваш клиент подписывает данные аутентификации закрытым ключом. Если у закрытого ключа есть парольная фраза, вас могут попросить разблокировать его локально.
- Проверка: Сервер проверяет подпись с помощью открытого ключа из
authorized_keys. Если подпись действительна и учетной записи разрешен вход, аутентификация проходит успешно. - Аутентификация предоставлена: Если проверка прошла успешно, сервер предоставляет вам доступ, и устанавливается защищенный сеанс SSH.
Важно: ваш закрытый ключ никогда не покидает ваш локальный компьютер в течение всего этого процесса. Обмениваются только криптографические доказательства, полученные из него.
Генерация пары SSH-ключей
Генерация пары SSH-ключей — это простой процесс с использованием команды ssh-keygen на вашем локальном компьютере (Linux, macOS или WSL/Git Bash на Windows).
ssh-keygen -t ed25519 -C "[email protected]"
-t ed25519: Указывает тип создаваемого ключа. Ed25519 — это современный выбор по умолчанию для большинства новых ключей OpenSSH. RSA все еще распространен, особенно на старых системах.-C "[email protected]": Добавляет комментарий к открытому ключу, который помогает определить его назначение или владельца.
Вас попросят указать файл для сохранения ключа (по умолчанию ~/.ssh/id_ed25519) и парольную фразу. Всегда используйте надежную парольную фразу для защиты вашего закрытого ключа.
Generating public/private ed25519 key pair.
Enter file in which to save the key (~/.ssh/id_ed25519):
Created directory '/home/youruser/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/youruser/.ssh/id_ed25519.
Your public key has been saved in /home/youruser/.ssh/id_ed25519.pub.
The key fingerprint is: SHA256:...
The key's randomart image is:
+--[ED25519 256]----+
| .=+ |
| . o. . |
| . + o. |
| o = B o. |
| . S @ + + |
| = + B . |
| o * * E |
| . o o |
| . . |
+----[SHA256]-------+
После генерации у вас будет два файла в вашем каталоге ~/.ssh:
id_ed25519(ваш закрытый ключ)id_ed25519.pub(ваш открытый ключ)
Убедитесь, что ваш файл закрытого ключа имеет строгие права доступа:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
Развертывание вашего открытого ключа
Чтобы использовать аутентификацию по ключу, ваш открытый ключ должен быть размещен на удаленном сервере, к которому вы хотите получить доступ.
Использование ssh-copy-id (рекомендуется)
Утилита ssh-copy-id — это самый простой и безопасный способ развернуть ваш открытый ключ. Она создает каталог ~/.ssh и файл authorized_keys с правильными правами доступа, если они не существуют.
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@remote_host
Замените user на ваше имя пользователя на удаленном сервере, а remote_host на IP-адрес или имя хоста сервера. Вас попросят ввести ваш пароль для user@remote_host в последний раз, чтобы загрузить ключ.
Ручное развертывание
Если ssh-copy-id недоступен, вы можете скопировать открытый ключ вручную:
Скопируйте содержимое открытого ключа: Отобразите ваш открытый ключ с помощью
cat.cat ~/.ssh/id_ed25519.pubСкопируйте весь вывод, который начинается с
ssh-ed25519 ...и заканчивается вашим комментарием.Подключитесь по SSH к удаленному серверу, используя аутентификацию по паролю:
ssh user@remote_hostВведите ваш пароль, когда будет предложено.
Создайте каталог
~/.sshи файлauthorized_keys, если они не существуют:mkdir -p ~/.ssh chmod 700 ~/.ssh touch ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keysДобавьте ваш открытый ключ в
authorized_keys: Вставьте скопированное ранее содержимое открытого ключа в файлauthorized_keys.echo "ssh-ed25519 AAAA..." >> ~/.ssh/authorized_keys(Замените
ssh-ed25519 AAAA...на фактическое содержимое вашего открытого ключа)
Подключение с помощью SSH-ключей
Как только ваш открытый ключ окажется на сервере, вы сможете подключиться, просто указав пользователя и хост:
ssh user@remote_host
Если у вас несколько пар ключей или ваш закрытый ключ находится не в стандартном расположении (~/.ssh/id_rsa или ~/.ssh/id_ed25519), вам может потребоваться указать его с помощью опции -i:
ssh -i ~/.ssh/my_custom_key user@remote_host
Если ваш закрытый ключ защищен парольной фразой, вас попросят ввести ее. Чтобы избежать повторного ввода парольной фразы во время сеанса, вы можете использовать ssh-agent.
Преимущества безопасности аутентификации по SSH-ключам
- Снижает риск угадывания пароля: Если вход по паролю отключен, злоумышленники не смогут подобрать пароль для этой учетной записи через SSH.
- Более надежные учетные данные: Правильно сгенерированный SSH-ключ невозможно угадать человеку.
- Отсутствие загрузки закрытого ключа: Ваш закрытый ключ остается локальным во время аутентификации.
- Удобство для автоматизации: Ключи позволяют выполнять скриптовые входы без пароля, что необходимо для инструментов автоматизации и CI/CD конвейеров.
- Защита парольной фразой: Добавление парольной фразы к вашему закрытому ключу обеспечивает дополнительный уровень безопасности. Даже если ваш файл закрытого ключа будет украден, он останется непригодным для использования без парольной фразы.
Управление вашими SSH-ключами
ssh-agent
ssh-agent — это программа, которая работает в фоновом режиме и хранит ваши расшифрованные закрытые ключи в памяти. Когда вы пытаетесь подключиться к SSH-серверу, ваш SSH-клиент может запросить у ssh-agent необходимый закрытый ключ, что избавляет от необходимости многократно вводить парольную фразу.
Чтобы запустить ssh-agent и добавить ваш ключ:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
Вы введете свою парольную фразу один раз при добавлении ключа в агент.
Именование и организация ключей
Для управления несколькими ключами (например, для разных организаций, проектов или личного использования) рассмотрите возможность использования осмысленных имен:
ssh-keygen -t ed25519 -f ~/.ssh/id_work_project -C "work_project_key"
ssh-keygen -t ed25519 -f ~/.ssh/id_personal_github -C "personal_github_key"
Затем вы можете указать, какой ключ использовать, с помощью опции -i, или настроить файл ~/.ssh/config, чтобы автоматически выбирать правильный ключ на основе хоста.
Пример ~/.ssh/config:
Host github.com
IdentityFile ~/.ssh/id_personal_github
User git
Host work-server
Hostname 192.168.1.100
IdentityFile ~/.ssh/id_work_project
User devuser
Лучшие практики и советы
- Никогда не передавайте свой закрытый ключ: Это золотое правило. Ваш закрытый ключ — это ваша цифровая идентичность.
- Используйте надежную парольную фразу: Защитите свой закрытый ключ надежной парольной фразой, аналогичной надежному паролю. Это сделает ваш ключ бесполезным, даже если он попадет в чужие руки.
- Меняйте ключи, когда есть причина: Создавайте новый ключ, когда устройство потеряно, подрядчик уходит, ключ был случайно передан, или старый алгоритм больше не соответствует вашей политике.
- Ограничьте права доступа к файлам: Убедитесь, что ваш файл закрытого ключа имеет права
600(rw-------), а ваш каталог~/.ssh—700(rwx------). - Отключайте аутентификацию по паролю осторожно: Как только вход по ключу заработает из второго терминала, на многих серверах следует установить
PasswordAuthentication noв/etc/ssh/sshd_config. Перед изменением этого параметра на удаленных системах убедитесь, что у вас есть доступ к консоли. - Используйте
ssh-agent: Для удобства и безопасности используйтеssh-agentдля управления вашими ключами, особенно теми, у которых есть парольные фразы.
Простая ментальная модель
Открытый ключ — это замок, который вы устанавливаете на учетную запись сервера. Закрытый ключ — это учетные данные, которые вы храните на своем компьютере. Парольная фраза защищает эти учетные данные, если файл будет скопирован. Файл authorized_keys — это список доступа.
Большинство проблем с SSH-ключами возникает из-за их путаницы: копирование закрытого ключа на сервер, вставка открытого ключа под неправильного пользователя, использование неправильного файла идентификации или оставление слишком открытых прав доступа, чтобы OpenSSH им доверял. Называйте ключи по назначению, защищайте закрытые ключи парольными фразами, используйте ssh-agent для удобства, удаляйте старые открытые ключи, когда доступ должен быть прекращен, и тестируйте изменения из второго терминала, прежде чем отключать вход по паролю.