Вопрос или проблема
Как один сервис может аутентифицироваться в другом, зарегистрированном в Kerberos? В моем случае оба принадлежат разным учетным записям сервисов, поэтому они не могут запустить kinit, как может делать обычный пользователь. Итак, когда один сервис хочет что-то от другого, как он получает билет Kerberos без TGT (билет, выдающий билет)?
Более конкретно, я запускаю веб-сервер Apache для предоставления доступа к репозиториям Subversion. Его учетная запись и SPN (Service Principal Name) зарегистрированы в Kerberos. Я также запускаю сервер Jenkins, который иногда нужно проверять в этих репозиториях. Обычные пользователи могут аутентифицироваться на обоих серверах: на Apache только после запуска kinit, а на Jenkins через LDAP. Как учетная запись сервиса Jenkins аутентифицируется на Apache для доступа к репозиторию Subversion, если она не может запустить kinit?
Это звучит похоже, но без хорошего ответа. И плагин для Kerberos в Jenkins предназначен для аутентификации пользователя в Jenkins, а не Jenkins в Apache. Существует также это неоднозначное, устаревшее решение, но я не уверен, применимо ли оно еще. И кажется, этот вопрос должен быть независимым от какого-либо конкретного сервера, просто один сервер пытается аутентифицироваться в другом, который в Kerberos.
.
Ответ или решение
Теория: Kerberos — это безопасный протокол аутентификации, который широко используется для проверки подлинности пользователей и сервисов в распределённых системах. Он основан на симметричном шифровании и обмене заявками, что обеспечивает высокий уровень безопасности. Один из ключевых компонентов Kerberos — это билет для предоставления услуг (Ticket Granting Ticket, TGT), который заявки получают от сервера Центра распределения ключей (Key Distribution Center, KDC). С помощью TGT сервера могут запрашивать сервисные билеты для доступа к другим ресурсам в сети.
Задача, изложенная в вашем вопросе, заключается в аутентификации одного сервиса (например, Jenkins) для получения доступа к другому сервису (например, Apache), оба из которых зарегистрированы в Kerberos, но работают от разных сервисных аккаунтов. Поскольку сервисные аккаунты не могут использовать kinit
как обычные пользователи, задача аутентификации делается более сложной.
Пример: В корпоративной сети, в которой развернуты серверы Jenkins и Apache, каждый сервис имеет свой собственный сервисный аккаунт и Service Principal Name (SPN) в Kerberos. Пока обычные пользователи могут получить TGT через kinit
, сервисы нуждаются в иной механике для получения доступа без ручного вмешательства, и это может быть достигнуто через ключевые пары и доверенные хранилища учётных данных.
Применение: Чтобы Jenkins мог аутентифицироваться на Apache без запуска kinit
, можно воспользоваться следующими подходами:
-
Использование ключевого таба (Keytab файл): Этот файл содержит заранее аутентифицированные данные, которые позволяют сервису запрашивать билеты у KDC. Администратор системы может создать keytab файл для Jenkins, содержащий необходимые credentials, и настроить Jenkins на его использование для получения TGT.
-
Настройка доверительных отношений между сервисами: Рассмотрение создания доверительных отношений в Kerberos, что может упростить аутентификацию между сервисами. Это может включать настройку доверительных доменов или применение креста доверия в Kerberos.
-
Сервисное делегирование: В случае, когда одного keytab достаточно для нескольких операций, можно настроить делегирование, при котором один сервис обеспечивает аутентификацию другого, передавая свои права.
-
Кастомные плагины или скрипты: Создание кастомных решений, которые будут взаимодействовать с Kerberos API, чтобы запрашивать и предоставлять необходимые билеты напрямую от имени сервисов.
-
Конфигурация SPNEGO и автоматизация билетов: Использование SPNEGO (Simple and Protected GSS-API Negotiation Mechanism) для автоматического запроса и использования билетов, что может быть интегрировано с такими приложениями, как Apache.
Каждый из этих методов требует детальной настройки и понимания работы вашей инфраструктуры и её политик безопасности. Например, в случае использования keytab файла, нужно убедиться, что доступ к этому файлу строго защищён и он находится на сервере Jenkins в безопасном месте, чтобы предотвратить его компрометацию.
Заключение: Недостатком использования keytab файла может быть риск утечки данного файла, что может скомпрометировать сервис, но правильное управление доступом и регулярные изменения ключей могут минимизировать этот риск. Kerberos предлагает мощную и защищённую систему для аутентификации сервисов друг перед другом, и применение подходящих практик может гарантировать долгосрочную безопасность и надёжность вашей системы.