Давайте немного поговорим о 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.
- Клиент инициализирует SSH-соединение с сервером и отправляет идентификатор своего открытого ключа.
- Сервер проверяет
~/.ssh/authorized_keys
файл пользователя, в который клиент пытается войти.
Если найден открытый ключ с соответствующим идентификатором, сервер генерирует случайное число и использует открытый ключ для шифрования сообщения.
Сервер отправляет зашифрованное сообщение обратно клиенту. - Клиент расшифровывает номер, используя свой закрытый ключ.
- Клиент объединяет расшифрованный номер и общий сеансовый ключ для генерации хеш-значения MD5.
- Клиент отправляет этот MD5-хэш обратно на сервер в качестве ответа на зашифрованное сообщение с номером.
- Сервер использует общий сеансовый ключ и исходный номер для вычисления хэш-значения MD5.
- Сервер сравнивает свои вычисления с теми, которые отправил клиент.
- Если два значения совпадают, это доказывает, что у клиента правильный закрытый ключ.
Клиент аутентифицирован и соединение установлено.
Если подтверждение связи по 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 для внесения изменений в код.
Вам ни в коем случае не обязательно быть экспертом по защищенной оболочке, но знание основ может иметь большое значение. Я надеюсь, что этот пост предоставил вам именно это – основы.