ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)
Пятница, 31 января, 2025

Как использовать SSH-ключи для аутентификации

Как использовать SSH-ключи для аутентификации

Многие облачные приложения построены на популярном протоколе SSH, который широко используется для управления сетевой инфраструктурой, передачи файлов и выполнения удалённых команд.

SSH расшифровывается как Secure Socket Shell, что означает, что он предоставляет оболочку (интерфейс командной строки) для соединения между несколькими удаленными хостами, гарантируя, что соединение является безопасным (зашифрованным и аутентифицированным).

SSH-подключения доступны во всех популярных операционных системах, включая Ubuntu, Windows и Debian. Протокол устанавливает зашифрованный канал связи в незащищённой сети с помощью пары открытых и закрытых ключей.

 

Ключи: Основа SSH

SSH работает по модели «клиент-сервер». Это означает, что у пользователя есть SSH-клиент (терминал в Linux или графическое приложение в Windows), а на стороне сервера работает демон, который принимает входящие соединения от клиентов.

На практике канал SSH позволяет удалённо управлять терминалом сервера. Другими словами, после успешного подключения всё, что вводится в локальной консоли, выполняется непосредственно на удалённом сервере.

Протокол SSH использует пару ключей для шифрования и расшифровки информации: открытый ключ и закрытый ключ.

Эти ключи связаны математически. Открытый ключ является общедоступным, хранится на сервере и используется для шифрования данных. Закрытый ключ является конфиденциальным, хранится на клиенте и используется для расшифровки данных.

Конечно, ключи генерируются не вручную, а с помощью специальных инструментов — keygens. Эти утилиты генерируют новые ключи с использованием алгоритмов шифрования, лежащих в основе технологии SSH.

 

Подробнее О том, как работает SSH

Обмен открытыми Ключами

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

Например, хост A генерирует пару открытого и закрытого ключей. Открытый ключ отправляется хосту B. Хост B делает то же самое, отправляя свой открытый ключ хосту A.

Используя алгоритм Диффи-Хеллмана, хост A может создать ключ, объединив свой закрытый ключ с открытым ключом хоста B. Аналогичным образом хост B может создать идентичный ключ, объединив свой закрытый ключ с открытым ключом хоста A.

В результате оба хоста независимо друг от друга генерируют один и тот же ключ симметричного шифрования, который затем используется для безопасной связи. Отсюда и термин «симметричное шифрование».

 

Проверка сообщения

Для проверки сообщений хосты используют хеш-функцию, которая выводит строку фиксированной длины на основе следующих данных:

 

Результат хеширования этих элементов называется HMAC (код аутентификации сообщения на основе хеширования). Клиент генерирует HMAC и отправляет его на сервер. Затем сервер создаёт свой собственный HMAC, используя те же данные, и сравнивает его с HMAC клиента. Если они совпадают, проверка проходит успешно, что подтверждает подлинность сообщения и отсутствие в нём изменений.

 

Аутентификация хоста

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

Существует несколько методов аутентификации:

 

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

 

Алгоритмы шифрования

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

Существует три основных класса таких алгоритмов: RSA, DSA и алгоритмы на основе эллиптических кривых, каждый из которых обладает своими особенностями:

 

Генерация ключей

Каждая операционная система имеет свои собственные утилиты для быстрой генерации SSH-ключей.

В Unix-подобных системах команда для генерации пары ключей является:

ssh-keygen -t rsa

 

Здесь тип алгоритма шифрования указывается с помощью флага -t. Другие поддерживаемые типы:

 

Вы также можете указать длину ключа с помощью флага -b . Однако будьте осторожны, так как безопасность соединения зависит от длины ключа:

ssh-keygen -b 2048 -t rsa

 

После ввода команды терминал предложит вам указать путь к файлу и его имя для хранения сгенерированных ключей. Вы можете принять путь по умолчанию, нажав Enter, что приведёт к созданию стандартных имён файлов: id_rsa (закрытый ключ) и id_rsa.pub (открытый ключ).

Таким образом, открытый ключ будет храниться в файле с расширением .pub, а закрытый ключ — в файле без расширения.

Далее команда предложит вам ввести парольную фразу. Хотя это необязательно (это не связано с самим протоколом SSH), рекомендуется использовать парольную фразу, чтобы предотвратить несанкционированное использование ключа сторонним пользователем в локальной системе Linux. Обратите внимание, что при использовании парольной фразы вам нужно будет вводить её при каждом подключении.

Чтобы изменить кодовую фразу позже, вы можете использовать:

ssh-keygen -p

 

Или же вы можете указать все параметры сразу с помощью одной команды:

ssh-keygen -p old_password -N new_password -f path_to_files

 

Для Windows существует два основных подхода:

  1. Использование ssh-keygen из OpenSSH: клиент OpenSSH предоставляет ту же команду ssh-keygen , что и Linux, и выполняет те же действия.

  2. Использование PuTTY: PuTTY — это графическое приложение, которое позволяет пользователям создавать открытые и закрытые ключи одним нажатием кнопки.

 

Установка клиентских и серверных компонентов

Основным инструментом для подключения по SSH на платформах Linux (как на стороне клиента, так и на стороне сервера) является OpenSSH. Хотя он обычно предустановлен в большинстве операционных систем, могут возникнуть ситуации (например, с Ubuntu), когда потребуется установка вручную.

Общая команда для установки SSH с последующим вводом пароля суперпользователя:

sudo apt-get install ssh

 

Однако в некоторых операционных системах SSH может быть разделён на отдельные компоненты для клиента и сервера.

 

Для Клиента

Чтобы проверить, установлен ли SSH-клиент на вашем локальном компьютере, просто выполните в терминале следующую команду:

ssh

 

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

 

sudo apt-get install openssh-client

 

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

 

Для Сервера

Аналогичным образом на удалённом хосте требуется серверная часть набора инструментов OpenSSH.

Чтобы проверить, доступен ли SSH-сервер на удалённом хосте, попробуйте подключиться локально через SSH:

ssh localhost

 

Если демон SSH запущен, вы увидите сообщение об успешном подключении. Если нет, вам нужно будет установить SSH-сервер:

sudo apt-get install openssh-server

 

Как и в случае с клиентом, терминал предложит вам ввести пароль суперпользователя. После установки вы можете проверить, активен ли SSH, выполнив команду:

sudo service ssh status

 

После подключения вы можете изменить настройки SSH по своему усмотрению, отредактировав файл конфигурации:

./ssh/sshd_config

 

Например, вы можете изменить порт по умолчанию на пользовательский. Не забывайте, что после внесения изменений в конфигурацию необходимо вручную перезапустить службу SSH, чтобы применить обновления:

sudo service ssh restart

 

Копирование SSH-ключа на Сервер

Использование специальной команды copy

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

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

ssh-copy-id -i ~/.ssh/id_rsa.pub name@server_address

 

Эта команда предполагает, что при создании ключа вы использовали пути и имена файлов по умолчанию. Если нет, просто замените ~/.ssh/id_rsa.pub на свой путь и имя файла.

ssh-copy-id -i ~/.ssh/id_rsa.pub server_address

 

Если вы установили парольную фразу при создании ключа SSH, терминал предложит вам ввести её. В противном случае ключ будет скопирован немедленно.

В некоторых случаях сервер может быть настроен на использование нестандартного порта (по умолчанию используется порт 22). В этом случае укажите порт с помощью флага -p:

ssh-copy-id -i ~/.ssh/id_rsa.pub -p 8129 name@server_address

Полуавтоматическое копирование

Существуют операционные системы, в которых команда ssh-copy-id может не поддерживаться, даже если возможно подключение по SSH к серверу. В таких случаях процесс копирования можно выполнить вручную с помощью ряда команд:

ssh name@server_address 'mkdir -pm 700 ~/.ssh; echo ' $(cat ~/.ssh/id_rsa.pub) ' >> ~/.ssh/authorized_keys; chmod 600 ~/.ssh/authorized_keys'

 

Эта последовательность команд выполняет следующее:

  1. Создаёт на сервере специальный каталог .ssh (если он ещё не существует) с правильными разрешениями (700) для чтения и записи.

  2. Создаёт или добавляет в файл authorized_keys открытые ключи всех авторизованных пользователей. Открытый ключ из локального файла (id_rsa.pub) будет добавлен в него.

  3. Устанавливает соответствующие разрешения (600) для файла authorized_keys, чтобы только владелец мог читать и записывать его.

 

Если файл authorized_keys уже существует, к нему просто будет добавлен новый ключ.

После этого можно будет подключаться к серверу с помощью той же команды SSH, но теперь для аутентификации будет использоваться открытый ключ, добавленный в authorized_keys:

ssh name@server_address

 

Ручное копирование

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

Независимо от способа, на удалённом хосте должен быть файл с именем ~/.ssh/authorized_keys, в котором перечислены все авторизованные открытые ключи.

Просто скопируйте открытый ключ клиента (по умолчанию находится в ~/.ssh/id_rsa.pub ) в этот файл.

Если пара ключей была сгенерирована с помощью графического приложения (обычно PuTTY в Windows), вам следует скопировать открытый ключ непосредственно из приложения и добавить его к существующему содержимому файла authorized_keys.

 

Подключение к Серверу

Чтобы подключиться к удалённому серверу в операционной системе Linux, введите в терминале следующую команду:

ssh name@server_address

 

В качестве альтернативы, если локальное имя пользователя совпадает с удалённым именем пользователя, вы можете сократить команду до:

ssh server_address

 

Затем система предложит вам ввести пароль. Введите его и нажмите Enter. Обратите внимание, что терминал не будет отображать вводимый вами пароль.

Как и в случае с командой ssh-copy-id , при подключении к удалённому серверу можно явно указать порт:

ssh client@server_address -p 8129

 

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

 

Заключение

Сегодня SSH является одним из наиболее широко используемых протоколов в разработке и системном администрировании. Поэтому важно иметь базовое представление о его работе.

Цель этой статьи — предоставить обзор SSH-соединений, вкратце объяснить алгоритмы шифрования (RSA, DSA, ECDSA и EdDSA) и продемонстрировать, как пары открытых и закрытых ключей можно использовать для установления безопасных соединений с личным сервером, чтобы сообщения, которыми вы обмениваетесь, оставались недоступными для третьих лиц.

Мы рассмотрели основные команды для UNIX-подобных операционных систем, которые позволяют пользователям создавать пары ключей и предоставлять клиентам доступ по SSH, копируя открытый ключ на сервер и обеспечивая безопасное соединение.

Exit mobile version