Autenticação cruzada de kerberos com ssh

4

Como posso configurar a autenticação cross-realm de servidor em um servidor openssh usando kerberos sem ter que adicionar princípios para ambos os realms no arquivo .k5login?

    
por Iain Conochie 07.09.2014 / 18:38

1 resposta

6

Quando recebe um nome de conta (fornecido pelo SSH) e um nome principal, a biblioteca Kerberos usa a função krb5_kuserok() para permitir ou negar acesso.

Por padrão, krb5_kuserok() permite acesso se o nome principal estiver listado em ~/.k5userok . Se esse arquivo não existir, ele verifica se a função krb5_aname_to_localname () retorna o mesmo nome de conta.

Agora, por padrão, krb5_aname_to_localname() retorna o nome principal (sem território) se o principal tiver exatamente um componente de nome e seu domínio corresponder exatamente à região padrão do sistema; caso contrário, retorna o nome principal inteiro com o domínio.

Portanto, a maneira mais fácil de alterar isso é ensinar krb5_aname_to_localname() como traduzir nomes principais estrangeiros . Existem vários métodos:

Se você quiser um mapeamento um-para-um simples para todo o território, você pode escrever uma regra de tradução em krb5.conf que simplesmente remove o território. (Note que estes exemplos são para o MIT Kerberos; você precisará ajustá-los um pouco para o 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
        }

Neste exemplo, [1:...] verifica se o lado "local" (à esquerda) tem exatamente um componente; [1:$1@$0] constrói uma única cadeia de caracteres a partir do primeiro componente + um @ + o nome da região (essencialmente resultando no nome principal original); (.*@EXAMPLE\.COM) corresponde a string construída contra um regex para verificar se termina com um nome de região especificado; s/@.*// substitui o regex @.* (tudo seguindo o sinal @ ) por uma string vazia. O resultado será usado como o nome da conta do sistema.

A segunda regra funciona da mesma maneira, mas substitui o reino por "@athena", resultando em nomes de usuários como root@athena . Estou apenas incluindo-o como um exemplo, pois o cliente SSSD LDAP / AD pode usar essa sintaxe, permitindo várias regiões por host.

A terceira regra é exatamente o que descrevi no começo.

Se você quiser apenas mapear nomes específicos, você pode adicionar uma seção auth_to_local_names ; a configuração ficaria assim: (nota: Heimdal usa auth_to_local )

[libdefaults]
        default_realm = NULLROUTE.EU.ORG

[realms]
        NULLROUTE.EU.ORG = {
                auth_to_local_names = {
                        grawity/[email protected] = grawity
                        [email protected] = root
                }
        }

Isso traduz apenas dois nomes principais em uma única conta local.

Se você está procurando um método automatizado, versões recentes do MIT Kerberos têm uma API para plug-ins" localauth " que podem fornecer suas próprias implementações tanto para a verificação de autorização como para a conversão principal / conta.

Por exemplo, o cliente SSSD do IPA / AD recentemente (cerca de um mês atrás) começou a fornecer seu próprio plug-in para traduzir nomes principais de usuários do FreeIPA e do Active Directory.

    
por 07.09.2014 / 20:18

Tags