Компания Cloudflare опубликовала Opkssh для аутентификации в SSH через OpenID Connect

Компания Cloudflare представила инструментарий opkssh (OpenPubkey SSH), позволяющий интегрировать в OpenSSH средства централизованной аутентификации с возможностью входа через провайдеров OpenID Connect. При помощи opkssh можно избавиться от ручной работы по управлению и настройке SSH-ключей, а также организовать подключение к серверу с любых хостов, без необходимости создания закрытых ключей на каждом клиентском компьютере и без ручного копирования открытых ключей на сервер. Для подключения достаточно выполнить на сервере привязку к учётной записи у провайдера OpenID. Код инструментария написан на языке Go и распространяется под лицензией Apache 2.0.

Opkssh совместим с OpenID-провайдерами Google, Microsoft/Azure и Gitlab, что позволяет настроить вход через имеющиеся учётные записи в сервисах gmail.com, microsoft.com и gitlab.com. При использовании opkssh вместо не ограниченных по времени ключей SSH генерируются временные ключи, действующие считанные часы и формируемые на основе подтверждения от провайдера OpenID. Утечка подобных ключей после окончания срока действия не представляет угрозы безопасности. По умолчанию время действия ключа составляет 24 часа, после которых необходимо повторно идентифицировать себя через OpenID.

Интеграция с OpenSSH основана на возможности создания расширений протокола SSH, допускающих прикрепление произвольных данных к сертификатам SSH. После прохождения аутентификации через OpenID клиент формирует открытый ключ, содержащий PK-токен, подтверждающий принадлежность ключа заявленному пользователю. Токен интегрируется в протокол SSH через поле с дополнительными данными SSH-сертификата. Создание PK-токенов и их проверка на стороне сервера осуществляется с использованием криптографического протокола OpenPubKey.

OpenPubKey позволяет сгенерировать открытый ключ и привязать его к токену, выданному OpenID-провайдером. Через цифровую подпись провайдер подтверждает, что этот ключ создан заявленным аутентифицированным пользователем. Например, OpenID-провайдер Google может подтвердить, что пользователь аутентифицирован как [email protected]. На стороне севера выполняется проверка подписан ли прикреплённый токен провайдером OpenID и соответствует ли цифровая подпись заявленному открытому ключу, т.е. сервер может удостовериться,
что именно пользователь [email protected] создал открытый ключ для подключившегося SSH-клиента.


Интеграция с OpenSSH организована через указание программы opkssh в файле конфигурации “sshd_config” через директиву “AuthorizedKeysCommand” (например: “AuthorizedKeysCommand /usr/local/bin/opkssh verify %u %k %t”). Настройка связывания учётных записей с OpenID осуществляется на стороне сервера SSH. На стороне клиента SSH изменения настроек не требуется, но перед входом необходимо запустить команду “opkssh login” и в появившемся окне браузера выбрать провайдера OpenID и выполнить через него аутентификацию.

Утилита opkssh сгенерирует ключи SSH и получит PK-токен, подтверждающий, что пользователь прошёл аутентификацию и позволяющий проверить, что созданные ключи принадлежат заявленному пользователю. Открытый ключ SSH, к которому через поле с дополнительными данными прикреплён PK-токен, будет записан в файл ~/.ssh/id_ecdsas и начнёт передаваться при подключении к серверу утилитой ssh.

Подключение к серверу производится с использованием штатной для SSH схемы “ssh логин@сервер”, при этом на сервере логин предварительно должен быть отождествлён с учётной записью в OpenID, которую использует пользователь. Таким образом работа сводится к тому, что ssh-клиент отправляет на ssh-сервер публичный ключ, а сервер запускает команду “opkssh verify” для проверки ключа.

Для привязки учётной записи к OpenID администратор сервера выполняет команду “opkssh add”. Например, для того чтобы разрешить вход на сервер под пользователем “root” с OpenID-аутентификацией через учётную запись [email protected] в Gmail следует выполнить “sudo opkssh add root [email protected] google”, после чего клиент сможет подключаться под параметрами данной учётной записи командой “ssh root@хост_сервера”.

Привязку учётной записи также можно выполнить вручную через файл конфигурации /etc/opk/auth_id (или ~/.opk/auth_id), в который для вышеприведённого примера будет записана строка “root [email protected] https://accounts.google.com”. Дополнительно через файл
/etc/opk/providers можно определить список допустимых OpenID-провайдеров, их параметры и список разрешённых идентификаторов клиентов.


Release. Ссылка here.