Как я могу настроить межсерверную аутентификацию на уровне сервера на сервере openssh, используя kerberos, не добавляя принципы для обеих областей в файле .k5login?
1 ответ
Получив имя учетной записи (предоставленной SSH) и имя участника, библиотека Kerberos использует krb5_kuserok()
чтобы разрешить или запретить доступ.
По умолчанию krb5_kuserok()
разрешает доступ, если имя участника указано в ~/.k5userok
. Если этот файл не существует, он проверяет, возвращает ли функция krb5_aname_to_localname() то же имя учетной записи.
Теперь по умолчанию krb5_aname_to_localname()
возвращает имя субъекта ( без области), если принципал имеет ровно один компонент имени и его область точно соответствует области системы по умолчанию; в противном случае он возвращает все основное имя с областью.
Поэтому самый простой способ изменить это - научить krb5_aname_to_localname()
переводить имена иностранных участников. Есть несколько методов:
Если вам нужно простое сопоставление «один к одному» для всей области, вы можете написать правило перевода в krb5.conf
которое просто удаляет область. (Обратите внимание, что эти примеры предназначены для MIT Kerberos; вам нужно будет немного их настроить для Heimdal.)
[realms] NULLROUTE.EU.ORG = { auth_to_local = RULE:[1:$1@$0](.*@EXAMPLE\.COM)s/@.*// auth_to_local = RULE:[1:$1@$0](.*@ATHENA\.MIT\.EDU)s/@.*/@athena/ auth_to_local = DEFAULT }
В этом примере [1:...]
проверяет, что "локальная" (левая) сторона имеет ровно один компонент; [1:$1@$0]
создает одну строку из 1-го компонента + an + имя области (по сути, в результате получается исходное имя участника); (.*@EXAMPLE\.COM)
сопоставляет созданную строку с регулярным выражением, чтобы убедиться, что она заканчивается указанным именем области; s/@.*//
заменяет регулярное выражение @.*
(все, что следует за знаком @
) пустой строкой. Результат будет использоваться в качестве имени системной учетной записи.
Второе правило работает таким же образом, но заменяет область на «@athena», в результате чего появляются имена пользователей, например root@athena
. Я просто включил его в качестве примера, так как клиент SSSD LDAP/AD может использовать этот синтаксис, позволяя использовать несколько областей для каждого хоста.
Третье правило как раз то, что я описал в начале.
Если вы хотите отобразить только определенные имена, вы можете добавить раздел auth_to_local_names
; конфигурация будет выглядеть так: (примечание: Heimdal использует auth_to_local
)
[libdefaults] default_realm = NULLROUTE.EU.ORG [realms] NULLROUTE.EU.ORG = { auth_to_local_names = { grawity/admin@EXAMPLE.COM = grawity root@ATHENA.MIT.EDU = root } }
Это переводит только два основных имени в одну локальную учетную запись.
Если вы ищете автоматизированный метод, в последних версиях MIT Kerberos есть API для плагинов "localauth", которые могут предоставить свои собственные реализации как для проверки авторизации, так и для перевода принципала / учетной записи.
Например, клиент SSSD IPA/AD недавно (около месяца назад) начал предоставлять свой собственный плагин для перевода основных имен пользователей FreeIPA и Active Directory.