Eu tenho uma pequena rede que inclui um NAS. no qual provisionei, com algum esforço, um servidor Kerberos. O servidor Kerberos permite que os hosts Linux na rede criem montagens NFS seguras. As chaves de serviço criadas no KDC são distribuídas aos hosts apropriados e as montagens são configuradas com segurança Kerberos. As montagens inseguras são bloqueadas pela política configurada no NAS.
Inconvenientemente, os usuários podem acessar arquivos nas montagens somente se tiverem tickets ativos no host do KDC. Esse requisito é restritivo, devido à inconveniência, e ainda mais ao limitar o acesso às montagens por tarefas automatizadas executadas com permissões regulares de usuário.
Nos primeiros dias do NFS, os arquivos em um volume remoto apareciam como locais, começando na inicialização e continuamente por toda a sessão do sistema. O gerenciamento de segurança e identidade são benefícios importantes do Kerberos no NFS, mas exigir que os usuários recebam tíquetes geralmente é desnecessário. Como a distribuição de chaves e o acesso controlado aos hosts evitam o acesso indesejado às montagens NFS, não preciso de tíquetes de usuário.
Idealmente, eu gostaria que os usuários acessassem montagens que tenham segurança Kerberos sem solicitar um tíquete do KDC ou mesmo precisar de um principal registrado nele. Qualquer usuário teria acesso o tempo todo a qualquer arquivo, desde que o acesso não fosse restringido por permissões por arquivo.
Quão próximo desse cenário-alvo é possível por meio das ferramentas existentes?
A resposta curta é que o mecanismo de autenticação NFS Kerberos atual (RPCSEC_GSS) não oferece suporte a isso. O principal que está fazendo a chamada é aquele que obtém acesso. Portanto, se você não quiser que os usuários obtenham tíquetes manualmente , precisará fazer com que o host obtenha tíquetes automaticamente para eles.
No futuro, o protocolo RPCSEC_GSSv3 mais recente pode ter opções para permitir que os hosts representem usuários arbitrários, mas ainda não foi concluído nem implementado.
Se você deseja permitir que os hosts representem qualquer UID, não precisa do Kerberos - volte para o
sec=sys
modo de segurança que era usado "antigamente". Nesse modo, o host literalmente especifica um identificador simbólico do usuário. (As verificações de permissão ainda acontecem, é claro.)No final, não há diferença funcional entre permitir que um host represente qualquer usuário via Kerberos (autenticado usando o /etc/krb5.keytab do host), versus permitir que um host represente qualquer usuário por meio de declaração UID básica (autenticado usando o IPsec do host ou chave privada WireGuard ou) – e o último lhe dará um desempenho muito maior do que o GSSAPI pode alcançar.
No Kerberos, ao usar apenas as ferramentas existentes (sem implementar diretamente algum tipo de autenticação no nível do host para RPC), o mais próximo que você tem é a delegação restrita com transição de protocolo (S4U2Self + S4U2Proxy), onde um serviço tem permissão para obter tickets para outros serviços em nome de um usuário. É comumente usado em ambientes Active Directory, mas também é suportado pelos KDCs do MIT Kerberos (e provavelmente pelos KDCs do Heimdal – o código está lá, graças ao Samba, mas não sei como habilitá-lo no Heimdal).
Para habilitar isso em um MIT Kerberos KDC, você precisará usar o backend LDAP; o back-end HDB baseado em arquivo não oferece suporte ao armazenamento de campos adicionais.
Defina o
ok_to_auth_as_delegate
sinalizador principal no principal do host do cliente (pode ser feito por meio do kadmin ou por ORing0x200000
nokrbTicketFlags
atributo LDAP).Defina o atributo LDAP do principal do cliente
krbAllowedToDelegateTo
para uma lista de principais de serviço NFS para os quais ele pode criar os tickets falsos. (Um serviço por valor.)Teste se os recursos do S4U funcionam, como root:
Instale o gss-proxy no cliente e edite o incluído
nfs-client.conf
para usar S4U2Proxy em vez de keytabs de clientes individuais:Este exemplo é baseado em https://github.com/gssapi/gssproxy/blob/main/docs/NFS.md#user-impersonation-via-constrained-delegation .
Configure o daemon rpc.gssd do cliente para usar gss-proxy adicionando
GSS_USE_PROXY=1
ao ambiente:Se o Kerberos for usado exclusivamente para NFS e se cada host precisar apenas de um conjunto limitado de usuários, o host poderá armazenar keytabs de cliente (que contêm as chaves derivadas de senha) para esses usuários. Isso é aproximadamente equivalente a armazenar as senhas dos usuários, pois o keytab permite