4

Как я могу настроить межсерверную аутентификацию на уровне сервера на сервере openssh, используя kerberos, не добавляя принципы для обеих областей в файле .k5login?

1 ответ1

6

Получив имя учетной записи (предоставленной 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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .