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.