Как я могу настроить межсерверную аутентификацию на уровне сервера на сервере 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.
