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.