Краткое введение в SSH

ssh

Давайте немного поговорим о SSH.

Прежде всего, вы могли бы спросить себя, что такое SSH?
Ну, вкратце, SSH расшифровывается как Secure Shell.

Хорошо, но что это значит?
Он позволяет вам получить криптографически защищенный доступ к командной строке (shell) на удаленном компьютере.

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

В Linux и macOS SSH-клиент командной строки обычно поставляется с предустановленной системой. Как таковой, его можно использовать непосредственно в окне терминала. Для Windows SSH-клиент обычно не устанавливается вместе с системой, но существует множество SSH-клиентов, которые можно установить вручную. В этой статье основное внимание будет уделено macOS.

Что такое SSH-клиент?
Это программа, которая позволяет устанавливать безопасные и аутентифицированные SSH-соединения с SSH-серверами. Она будет запущена на вашем компьютере.

Что такое SSH-сервер?
Это программа, которая запускается на удаленном компьютере и прослушивает SSH-соединение.

Итак, как вы можете видеть, SSH работает на client-server модели. Сервер постоянно прослушивает новые запросы на подключение по SSH, обычно через TCP порт 22, и клиент может инициализировать SSH-соединение с сервером в любой момент времени.

Аутентификация на основе пароля

Установить SSH-соединение довольно просто. Но, прежде чем это можно будет сделать, вам нужно знать username и hostname или IP адрес сервера.

Итак, по сути, вы будете использовать SSH-клиент на своем компьютере для подключения к SSH-серверу на удаленном компьютере. Предполагая, что вы используете macOS или Linux, вы можете запустить следующую команду для подключения по SSH.

ssh <username>@<hostname>
  • username – пользователь сервера.
  • hostname – хост сервера. Если он неизвестен, вместо него можно указать IP-адрес.

Если вы подключаетесь к серверу в первый раз, вас попросят подтвердить идентификатор сервера. Если вы подтвердите это, открытый ключ сервера будет сохранен в вашем локальном ~/.ssh/known_hosts файле. При следующей попытке подключения ваш known_hosts файл будет проверен, и поскольку открытый ключ сервера уже добавлен туда, этот шаг будет пропущен.

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

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

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

logout

Основы работы с SSH-ключами

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

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

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

Сеансовый ключ

Существует еще один важный ключ, называемый сеансовым ключом. Этот ключ согласовывается обеими сторонами, клиентом и сервером, в процессе подключения. Сеансовый ключ генерируется с использованием версии алгоритма Диффи-Хеллмана. Этот алгоритм работает таким образом, что обе стороны вносят равный вклад в генерацию сеансового ключа. Из-за природы алгоритма сеансовый ключ представляет собой общий симметричный ключ. Это означает, что этот ключ может использоваться как для шифрования, так и для дешифрования.

Процесс аутентификации

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

  1. Клиент инициализирует SSH-соединение с сервером и отправляет идентификатор своего открытого ключа.
  2. Сервер проверяет ~/.ssh/authorized_keys файл пользователя, в который клиент пытается войти.
    Если найден открытый ключ с соответствующим идентификатором, сервер генерирует случайное число и использует открытый ключ для шифрования сообщения.
    Сервер отправляет зашифрованное сообщение обратно клиенту.
  3. Клиент расшифровывает номер, используя свой закрытый ключ.
  4. Клиент объединяет расшифрованный номер и общий сеансовый ключ для генерации хеш-значения MD5.
  5. Клиент отправляет этот MD5-хэш обратно на сервер в качестве ответа на зашифрованное сообщение с номером.
  6. Сервер использует общий сеансовый ключ и исходный номер для вычисления хэш-значения MD5.
  7. Сервер сравнивает свои вычисления с теми, которые отправил клиент.
  8. Если два значения совпадают, это доказывает, что у клиента правильный закрытый ключ.
    Клиент аутентифицирован и соединение установлено.

Если подтверждение связи по SSH прошло успешно, соединение между клиентом и сервером будет установлено. Этот процесс безопасен, поскольку для установления соединения между клиентом и сервером используется криптографическая аутентификация.

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

К настоящему моменту вы могли бы спросить себя, как я могу сгенерировать эти SSH-ключи?
SSH-ключи могут быть сгенерированы очень быстро с помощью следующей команды.

ssh-keygen -t rsa -b 4096 -C <email_address> -f <file_name>

Эта команда создаст SSH-ключи, используя ваш адрес электронной почты в качестве метки. При желании вы можете передать -f флаг, где вы можете указать имя файла для SSH-ключей. Если -f флаг не указан, вам будет предложено ввести имя файла или вы можете нажать enter, чтобы принять значение по умолчанию. Если вы нажметеenter, по умолчанию будет использоваться имя файла id_rsa.

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

Когда команда завершит выполнение, вы увидите следующие файлы в вашем ~/.ssh каталоге.

├── <file_name>
├── <file_name>.pub
└── ...

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

Включить аутентификацию на основе ключа

Чтобы включить аутентификацию на основе ключа на сервере, вам необходимо сообщить серверу о вашем открытом ключе. Для этого вам необходимо добавить свой открытый ключ в ~/.ssh/authorized_keys файл на сервере.

cat ~/.ssh/<file_name>.pub | pbcopy

Эта команда скопирует ваш открытый ключ в буфер обмена. Теперь сохраненный открытый ключ необходимо добавить в ~/.ssh/authorized_keys файл на сервере. Для этого войдите на сервер, используя аутентификацию по паролю.

Как только вы получите доступ к серверу, выполните следующую команду.

pbpaste >> ~/.ssh/authorized_keys

Он вставит ваш ранее скопированный SSH-ключ и добавит его в конце содержимого ~/.ssh/authorized_keys файла.

Выполните следующую команду, чтобы подтвердить, что ваш открытый ключ сохранен.

cat ~/.ssh/authorized_keys

Вы должны увидеть содержимое authorized_keys файла, напечатанного в окне терминала. Ваш открытый ключ должен быть напечатан в качестве последнего элемента.

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

Этот способ аутентификации часто используется на CI / CD для автоматизации процессов и аутентификации компьютеров без взаимодействия с пользователем.

Заключение

Сегодня SSH и SSH-ключи невероятно важны и используются повсеместно. От онлайн-сервисов до автоматической аутентификации друг друга в вашей учетной записи Github для внесения изменений в код.

Вам ни в коем случае не обязательно быть экспертом по защищенной оболочке, но знание основ может иметь большое значение. Я надеюсь, что этот пост предоставил вам именно это – основы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.