Многие облачные приложения построены на популярном протоколе 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 и алгоритмы на основе эллиптических кривых, каждый из которых обладает своими особенностями:
- RSA: алгоритм RSA, разработанный в 1978 году, основан на факторизации целых чисел. Поскольку факторизация больших полупростых чисел (произведений двух больших простых чисел) является сложной вычислительной задачей, безопасность RSA зависит от размера выбранных факторов. Длина ключа варьируется от 1024 до 16384 бит.
- DSA: DSA (алгоритм цифровой подписи) основан на дискретных логарифмах и возведении в степень по модулю. Несмотря на сходство с RSA, он использует другой математический подход для связывания открытого и закрытого ключей. Длина ключа DSA ограничена 1024 битами.
- ECDSA и EdDSA: эти алгоритмы основаны на эллиптических кривых, в отличие от DSA, в котором используется возведение в степень по модулю. Они предполагают, что не существует эффективного решения задачи дискретного логарифмирования на эллиптических кривых. Хотя ключи короче, они обеспечивают тот же уровень безопасности.
Генерация ключей
Каждая операционная система имеет свои собственные утилиты для быстрой генерации SSH-ключей.
В Unix-подобных системах команда для генерации пары ключей является:
ssh-keygen -t rsa
Здесь тип алгоритма шифрования указывается с помощью флага -t
. Другие поддерживаемые типы:
dsa
ecdsa
ed25519
Вы также можете указать длину ключа с помощью флага -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 существует два основных подхода:
-
Использование ssh-keygen из OpenSSH: клиент OpenSSH предоставляет ту же команду
ssh-keygen
, что и Linux, и выполняет те же действия. -
Использование 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
на свой путь и имя файла.
-
Замените
name
именем пользователя на удаленном сервере. -
Замените
server_address
на адрес хоста. Если имена пользователей на клиенте и сервере совпадают, вы можете сократить команду:
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'
Эта последовательность команд выполняет следующее:
-
Создаёт на сервере специальный каталог
.ssh
(если он ещё не существует) с правильными разрешениями (700) для чтения и записи. -
Создаёт или добавляет в файл
authorized_keys
открытые ключи всех авторизованных пользователей. Открытый ключ из локального файла (id_rsa.pub
) будет добавлен в него. -
Устанавливает соответствующие разрешения (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, копируя открытый ключ на сервер и обеспечивая безопасное соединение.