Коллеги, приветствую. Сегодня мы познакомимся с методом аутентификации по открытым ключам в SSH. Познакомимся с основными принципами и ключевыми понятиями. Разберем несколько способов формирования ключевой пары, а также произведем конфигурацию и подключение к SSH серверу на системах Windows и Linux. Если Вы в своей деятельности часто используете SSH и хотели бы увеличить безопасность подключений, то давайте вместе разбираться как можно применять аутентификацию по ключу на проектах.
Что это такое и зачем это нужно?
Одним из самых распространенных способов аутентификации в наше время является ввод пароля. Пароли мы используем к любым сервисам, в т.ч и для удаленного подключения ssh. Нам всем хорошо понятна концепция парольной аутентификации — просто вводим логин и пароль. Однако подобный способ аутентификации не является безопасным с точки зрения стойкости самого пароля. Все мы люди и не всегда удается держать в голове или под рукой надежные пароли для сервисов с которыми мы взаимодействуем.
Для решения этой проблемы, а также для повышения уровня безопасности может использоваться другой способ аутентификации — по открытому ключу. Даже если мы будем использовать сложный пароль, его стойкость будет все-равно ниже, чем у метода аутентификации по ключу.
Перед тем как мы начнем, нам понадобится немного разобраться в терминах и основных сущностях.
Симметричное и асимметричное шифрование
Мы начнем наше знакомство с понятия симметричного шифрования. Подобный тип появился очень давно. В его основе лежит главный принцип — информация шифруется и расшифровывается одним и тем же ключем.
Асимметричное шифрование противопоставляется симметричному. Этот тип появился в 70-х годах и позволил применять новые подходы, при которых процедуры шифрования и дешифровки информации производятся разными, но взаимосвязанными ключами. Именно на принципе использования разных частей ключей основана аутентификация по открытому ключу.
Ключевая пара
Одним из фундаментальных терминов в асимметричном шифровании является термин ключевой пары. Фактически он представляет собой совокупность открытой и закрытой частей ключа. Эти части математически связаны между собой таким образом, что открытой частью можно зашифровывать информацию, а закрытой частью расшифровывать.
Обратите внимание, что мы можем передавать открытую часть ключа по незащищенным каналам связи, не боясь компрометации закрытой части. При этом из открытой части нет возможности получить закрытую часть. В этом и заключается его функция и главное отличие от симметричного ключа, получение которого третьими лицами означает возможность доступа к зашифрованной информации.
Применение на практике
Теперь, после небольшой теории, давайте попробуем применить полученную информацию на более реальных задачах. Для возможности аутентификации по открытому ключу нам будет необходимо сгенерировать ключевую пару о которой мы говорили чуть ранее на стороне клиента. В этой статье мы рассмотрим несколько популярных способов формирования ключевой пары при помощи инструментов PuTTY и ssh-keygen.
Также нам будет необходимо установить и сконфигурировать SSH сервер. В качестве примера мы возьмем популярный проект — OpenSSH Server, который доступен для установки на различных операционных системах в т.ч — Windows и Linux.
Настройка доступа по ключам
Разворачиваем виртуальную машину
Для целей тестирования предлагаю создать небольшой тестовый стенд из одной виртуальной машины. Для автоматизации этого процесса можно скачать или склонировать репозиторий на GitHub и выполнить предварительные шаги по установке.
Этот репозиторий позволяет разворачивать виртуальные машины автоматически, без ручных действий, по заранее сформированному алгоритму.
Когда предварительные действия будут выполнены, перейдите в папку сценария Localhost_1.2 для развертывания CentOS, либо в папку Localhost_1.3 для развертывания Ubuntu, либо в папку Localhost_1.0 для развертывания Windows Server и выполните команду:
vagrant up
Тестовый стенд будет развернут автоматически, пока что можно выпить чашечку чая или кофе. Конечно, вам никто не мешает развернуть это любым другим удобным способом.
Спустя время, виртуальная машина будет готова и мы сможем подключиться к ней либо через менеджер виртуальных машин VirtualBox, либо при помощи ssh подключения по адресу 127.0.0.1:2222.
В качестве учетной записи для подключения указываем — vagrant. Пароль — vagrant.
В случае, если была выбрана виртуальная машина на Windows, мы можем подключиться к ней при помощи RDP по адресу 127.0.0.1:33389.
В качестве учетной записи для подключения указываем — Administrator. Пароль — vagrant.
Конфигурация сервера. Установка OpenSSH на Linux
Для установки OpenSSH сервера на CentOS выполним следующую команду:
sudo yum install openssh-server -y
Итогом должна быть установка, обновление или сообщение об актуальности версии OpenSSH. В моем случае установлена актуальная версия инструмента.
Для установки OpenSSH сервера на Ubuntu выполним следующие команды:
sudo apt-get update sudo apt-get install openssh-server -y
Результатом также будут установка, обновление или сообщение об актуальности версии OpenSSH.
Запустим службу sshd выполнив команду:
sudo systemctl start sshd sudo systemctl enable sshd
Конфигурация сервера. Установка OpenSSH на Windows
Компонент OpenSSH Server доступен в Windows из коробки начиная с версии Windows 10 1809 и Windows Server 2019. Для быстрой установки откроем Powershell от имени администратора и введем команду:
Get-WindowsCapability -Online | ? Name -like 'OpenSSH*' | Add-WindowsCapability -Online
Будет запущен процесс установки компонента OpenSSH Server.
В дополнение к вышеуказанной команде выполним еще пару команд. Запустим службу sshd и выберем тип запуска — Автоматический.
Start-Service sshd; Set-Service -Name sshd -StartupType 'Automatic'
Создадим разрешающее правило в Firewall Windows.
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True ` -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
Конфигурация клиента. Формирование ключевой пары на Windows (PuTTYgen)
Сначала попробуем сгенерировать ключевую пару при помощи PuTTY. Для этого нам достаточно скачать инструменты PuTTY и PuTTYgen с официального сайта — https://www.putty.org/.
Инструмент PuTTY нам понадобится для ssh подключения чуть позже, а с помощью PuTTYgen мы сможем сформировать ключевую пару прямо сейчас.
Запустим PuTTYgen и выберем Generate. Все остальные настройки можно оставить по умолчанию.
Далее водим по рабочему столу указателем мыши для формирования ключевой пары. В итоге перед нами появится такое окно.
Поздравляю, мы успешно сгенерировали ключевую пару при помощи PuTTYgen. Сохраним закрытую часть ключа в виде файла при помощи кнопки Save private key в надежное место. PuTTYgen спросит нас о том хотим ли мы пропустить создание ключевой фразы для закрытой части. В нашем случае мы соглашаемся и отвечаем — Да.
Не закрывая окно PuTTYgen переходим в раздел Public key for pasting into OpenSSH authorized_keys file и копируем из него все содержимое. Эта информация нам понадобится на этапе добавления открытого ключа на SSH сервер.
Конфигурация клиента. Формирование ключевой пары на Linux (ssh-keygen)
Теперь попробуем сгенерировать ключевую пару из под Linux при помощи инструмента ssh-keygen. Для теста воспользуемся Ubuntu.
Выполним команду ssh-keygen. Мастер сообщит нам о начале процедуры генерации ключевой пары. Инструмент также спросит о том, где разместить ключ и будем ли мы использовать ключевую фразу. Оставим все значения по умолчанию и продолжим.
В итоге в папке ~/.ssh должны появиться две части ключа. id_rsa — закрытая часть, id_rsa.pub — открытая часть.
Нам необходимо позаботиться о том, чтобы никто не имел прав доступа кроме нас самих к этим ключам. Для этого выполним команду:
chmod 600 ~/.ssh/id*
Скопируем открытую часть ключа себе в буфер обмена, т.к нам понадобится добавить эту информацию на сервер в следующем этапе. Для этого выполним команду:
cat ~/.ssh/id_rsa.pub
Конфигурация сервера. Разрешение аутентификации по ключу и добавление ключей на Linux.
Возвращаемся на наш сервер. На этом этапе нам необходимо добавить открытую часть ключа для аутентификации пользователя и разрешить аутентификацию по ключу.
После успешного логина добавим скопированную нами открытую часть ключа из предыдущего этапа в файл ~/.ssh/authorized_keys.
vi ~/.ssh/authorized_keys
Вставляем открытую часть ключа и сохраняем файл.
Фактически, мы только что связали с пользователем открытую часть ключа. У пользователя может быть несколько ключей для аутентификации. Все они должны быть перечислены в этом файле.
Теперь включим возможность аутентификации по ключу и отключим возможность подключения по паролю. Для этого выполним команду:
sudo sed -i 's/PubkeyAuthentication no/PubkeyAuthentication yes/g' /etc/ssh/sshd_config sudo sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config
Или откроем конфигурационный файл /etc/ssh/sshd_config любым удобным редактором.
sudo vi /etc/ssh/sshd_config
Находим строку PasswordAuthentication и устанавливаем значение no. Также находим строку PubkeyAuthentication и устанавливаем значение yes.
Для применения конфигурации перезапустим службу OpenSSH сервера выполнив команду:
sudo systemctl restart sshd
Конфигурация сервера. Разрешение аутентификации по ключу и добавление ключей на Windows.
Разрешим функцию аутентификации по открытому ключу, запретим вход по паролю. Заодно перезапустим службу sshd для применения конфигурации.
Для этого запустим PowerShell от имени администратора и выполним команду:
((Get-Content -path C:\ProgramData\ssh\sshd_config -Raw) ` -replace '#PubkeyAuthentication yes','PubkeyAuthentication yes' ` -replace '#PasswordAuthentication yes','PasswordAuthentication no')` | Set-Content -Path C:\ProgramData\ssh\sshd_config; Restart-Service sshd
Добавляем открытую часть ключа для аутентификации. Создаем папку .ssh в профиле пользователя а также, вместо ssh-rsa, записываем в файл authorized_keys открытую частью ключа.
New-item -Path $env:USERPROFILE -Name .ssh -ItemType Directory -Force echo "ssh-rsa" | Out-File $env:USERPROFILE\.ssh\authorized_keys -Encoding ascii
Подключение к серверу SSH по открытой части ключа на Windows.
Запустим PuTTY и введем адрес подключения к SSH серверу.
В разделе Connection > SSH > Auth укажем сохраненный файл закрытой части ключа и пробуем подключиться к нашему серверу.
По итогу мы пройдем процедуру аутентификации без указания пароля для учетной записи пользователя.
Результат ssh аутентификации по ключу на сервере CentOS или Ubuntu.
Результат ssh аутентификации по ключу на сервере Windows.
Подключение к серверу SSH по открытой части ключа на Linux.
Выполним подключение к серверу SSH. Для этого запустим на исполнение команду:
ssh vagrant@127.0.0.1 -p 2222
По итогу мы пройдем процедуру аутентификации без указания пароля для учетной записи пользователя.
Результат ssh аутентификации по ключу на сервере CentOS или Ubuntu.
Результат ssh аутентификации по ключу на сервере Windows.
Конвертация ключей
В статье использовалась небольшая хитрость, которая может пригодиться в рабочей деятельности.
Представьте простую и вполне реальную ситуацию. Вы сгенерировали ключевую пару и хотели бы распространить ее на других своих устройствах. Проблемой может стать желание перенести ключевую пару на Linux, которая была сгенерирована при помощи PuTTYgen под Windows.
К сожалению, если скопировать такой ключ и попытаться произвести вход на SSH сервер, мы скорее всего получим ошибку: Load key «/root/.ssh/id_rsa»: invalid format, либо подобные.
Это связано с тем, что закрытая часть ключа, генерируемая разными инструментами, будет сформирована в разных форматах. Сама структура файла будет отличаться и для решения проблемы потребуется процедура конвертации.
Самый просто способ — запустить PuTTYgen, загрузить сохраненную закрытую часть ключа при помощи кнопки Load.
Перейти в раздел Conversions и выбрать меню Export OpenSSH key.
Инструмент позволит нам сохранить закрытую часть в формате (PEM), который генерирует ssh-keygen.
Точно таким же методом мы можем производить обратное преобразование из PEM в формат PuTTY. Таким образом, нет необходимости создавать разные сущности ключей, мы сможем использовать одну.
Итоги
Коллеги, сегодня нам удалось познакомиться с методом аутентификации по открытому ключу. Мы узнали не только теоретическую часть, но и попробовали на практике посмотреть на работу этого способа аутентификации на разных системах. Надеюсь, что полученная информация пригодится в ваших существующих и будущих проектах. Если Вам есть, что обсудить или остались какие-либо вопросы, пожалуйста, оставляйте комментарии.
Мау
Thank you!!1