Привет, уважаемый %username%! Уважаю твое личное время, поэтому без лишних слов - сразу к делу. В этой статье я кратко опишу, как настроить доступ к удаленному серверу по SSH с использованием Keycloak. Разберем, в чем преимущества этого решения и что именно происходит в процессе такой авторизации.
[От,С]сылки
Будем использовать open-source решение от Cloudflare - OPKSSH (OpenPubkey SSH):
ссылка на репозиторий, тыц
ссылка на пост в официальном блоге: тыц
статья про OpenPubkey на хабре: тыц (согласитесь, не густо)
Quick start guide
Серверная часть
Качаем и запускаем скрипт установки:
wget -qO- "https://github.com/openpubkey/opkssh/blob/main/scripts/install-linux.sh" | sudo bash
Укажем Keycloak в качестве провайдера OpenID. Все настройки можно найти в папке /etc/opk. Заполним файл /etc/opk/providers:
# Issuer Client-ID expiration-policy
https://keycloak.corp.local/realms/opkssh OPKSSH 24h
Добавляем тестового пользователя в систему:
sudo useradd -m -s /bin/bash opkssh_user
sudo passwd -l opkssh_user # Отключаем парольный вход для пущей безопасности
Разрешим пользователю авторизоваться через OPKSSH. В параметрах команды opkssh add
укажем локального пользователя, его адрес электронной почты и issuer URL:
sudo opkssh add opkssh_user opkssh_user@corp.local https://keycloak.corp.local/realms/opkssh
Keycloak
Создаем нового клиента через админ-панель:
Client ID:
OPKSSH
Client Protocol:
openid-connect
Valid redirect URL:
http://localhost:3000/*
Клиентская часть (в моем случае это Windows 10, также поддерживается Linux и MacOS)
Качаем исполняемый файл для нашей операционной системы:
curl https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-windows-amd64.exe -Lo opkssh.exe
Скачанный файл не требует установки, мы будем запускать его из командной строки каждый раз при необходимости авторизоваться в Keycloak. Возможно, стоит позаботиться о том, чтобы он лежал в директории, указанной в системной переменной PATH. Я ограничился тем, что разместил файл в своей домашней папке.
Следующим шагом создадим файл конфигурации %USERPROFILE%\.opk\config.yml:
opkssh login --create-config
В файле конфигурации удалим ненужных провайдеров (в моем случае всех) и добавим Keycloak:
---
default_provider: keycloak
providers:
- alias: keycloak
issuer: https://keycloak.corp.local/realms/opkssh
client_id: OPKSSH
client_secret: bla-bla-bla-secret
redirect_uris:
- http://localhost:3000/login-callback
На этом настройка всех компонент закончена, можно проверять доступ.
Подключаемся к удаленному серверу с использованием OPKSSH
В командной строке инициируем процесс авторизации командой
opkssh login
Автоматически открывается страница Keycloak в браузере по умолчанию
Вводим верные логин/пароль, после чего страницу можно закрывать
Приложение OPKSSH завершает свою работу
Подключаемся к удаленной системе используя встроенный в Windows SSH-клиент. Без пароля, без указания ключа или сертификата, без SMS.
Доступ активен в течении 24 часов с момента авторизации, затем процедуру авторизации в Keycloak необходимо будет повторить
Как это работает
Что происходит на стороне клиента
При выполнении команды
opkssh login
автоматически создаются публичный и приватный ключи.После этого открывается окно браузера со страницей авторизации SSO (в нашем случае Keycloak). OPKSSH использует протокол OpenPubkey, добавляя в тело запроса токена только что созданный публичный ключ.
В результате успешной авторизации Keycloak возвращает токен, содержащий публичный ключ. По сути, этот токен подтверждает, что ключ создан пользователем, подтвердившим свою личность.
-
В папке %USERPROFILE%\.ssh сохраняется сертификат, который содержит в себе:
публичный ключ
токен, полученный от Keycloak.
В папке %USERPROFILE%\.ssh сохраняется сертификат, который содержит в себе приватный ключ.
При подключении к удаленному серверу по SSH, сертификаты, найденные в папке %USERPROFILE%\.ssh, автоматически используются для аутентификации и шифрования.
Что происходит на стороне сервера
SSH-сервер, получив сертификат при установлении соединения, делегирует его проверку верификатору OpenPubkey. Этот функционал предоставляет нам стандартный механизм AuthorizedKeysCommand.
-
Верификатор OpenPubkey извлекает из сертификата токен и проверяет:
валидный ли токен
не устарел ли токен (время жизни токена указывается для OpenID-провайдера в настройках OPKSSH на самом сервере)
подписан ли токен необходимым OpenID-провайдером
совпадает ли публичный ключ в токене и публичный ключ в сертификате
Наконец верификатор OpenPubkey извлекает из токена email и проверяет, разрешен ли доступ данному пользователю.
После всех проверок верификатор OpenPubkey в соответствии настроенным политикам разрешает или запрещает запрашиваемый доступ
Основная прелесть OpenPubkey SSH в том, что не требуется модификация ни SSH-клиента, ни SSH-сервера, ни OpenID-провайдера.
Что еще умеет OPKSSH
Проект хоть еще и не дорос до версии 1.0, но активно развивается и поддерживается.
Вот некоторые из неупомянутых мной возможностей:
Одновременное использование нескольких OpenID-провайдеров.
Использование групп из oidc для принятия решения о предоставлении доступа.
Поддержка собственных плагинов, позволяющих добавить дополнительную логику принятия решения о предоставлении доступа.
Предоставление доступа под необходимой учетной записью авторизованному пользователю без установки ключей и передачи паролей.
Для чего все это надо
Пароли ненадежны. Они могут утечь или быть перехвачены, удаленная система может быть подвержена брутфорс-атакам.
Связка приватного и публичного ключа намного надежнее. Но распространение ключей надо как-то организовать, к тому же у ключей нет срока действия. Утечка приватного ключа, как и утечка пароля, может позволить закрепиться злоумышленнику во внутренней инфраструктуре.
Сертификаты, обладая аналогичной криптографической стойкостью, добавляют важный функционал: ограничение времени действия, возможность досрочного отзыва. Но их классическое использование требует развертывания PKI (инфраструктуры открытых ключей), а длительные сроки действия все так же позволяют злоумышленнику продолжительное время использовать незаметно похищенный у пользователя сертификат.
Сертификаты, которые генерируются в процессе использования OPKSSH, имеют короткое время жизни и не требуют развернутой PKI. Настройка такого доступа при наличии готового решения SSO требует минимум времени и усилий, а эффект по усилению информационной безопасности проявляется сразу.
Использовать ли такой подход в своей инфраструктуре - решать вам.
Комментарии (6)
savostin
25.08.2025 07:50Пароли ненадежны. Они могут утечь или быть быть перехвачены, удаленная система может быть подвержена брутфорс-атакам.
А в keycloak вы как авторизуетесь?
johnsqurrel
25.08.2025 07:50Утечка приватного ключа, как и утечка пароля, может позволить закрепиться злоумышленнику во внутренней инфраструктуре.
а может и не позволить. если приватный ключ не беспарольный, а закрыт хорошей не-словарной пассфразой символов на 200.
Fafhrd
25.08.2025 07:50Автоматически открывается страница Keycloak в браузере по умолчанию
текнолоджия для локалхоста с DE
whocoulditbe
Хаб: Информационная безопасность
Вы серьёзно?
Обратная сторона такого решения - зависимость от кейклока. Достаточно положить сервер с ним и схема превращается в тыкву без альтернативных способов входа.
iontzev Автор
Такова участь любого централизованного решения управления доступами. Но никто не мешает вам настроить альтернативные способы входа. Можно указать несколько OpenID-провайдеров, можно ходить по паролю, можно быстренько раскидать ключи на критичные сервера. Quick start guide в статье - это минимальный набор команд для "попробовать". Дальше можно и нужно корректировать решение под свои хотелки и требования
13werwolf13
безопасников никогда не интересовали подобные "мелочи"
как впрочем судя по
curl xxx | sudo bash
их и безопасность не интересует. в нормальных инфраструктурах у юзверя вообще нет возможности дёрнуть что-то с sudo.чем это лучше чем аутентификация по ключам которые берутся из ldap и имеют срок жизни решительно непонятно, зато шайнинью
Проект хоть еще и не дорос до версии 1.0...
.