Resumidamente:
Gostaria de uma forma de fazer autenticação de chave SSH via LDAP.
Problema:
Usamos LDAP (slapd) para serviços de diretório e recentemente passamos a usar nossa própria AMI para criar instâncias. A razão pela qual o bit AMI é importante é que, idealmente , gostaríamos de poder fazer login com SSH por meio de autenticação de chave assim que a instância estiver em execução e não ter que esperar que nossa ferramenta de gerenciamento de configuração um tanto lenta inicie um script para adicionar as chaves corretas para a instância.
O cenário ideal é que, ao adicionar um usuário ao LDAP, adicionemos também sua chave e eles possam fazer login imediatamente.
A autenticação de chave é obrigatória porque o login baseado em senha é menos seguro e incômodo.
Eu li esta pergunta que sugere que há um patch para OpenSSH chamado OpenSSH-lpk para fazer isso, mas isso não é mais necessário com o servidor OpenSSH >= 6.2
Adicionada uma opção sshd_config(5) AuthorizedKeysCommand para suportar a busca de author_keys de um comando além de (ou em vez de) do sistema de arquivos. O comando é executado em uma conta especificada por uma opção AuthorizedKeysCommandUser sshd_config(5)
Como posso configurar OpenSSH e LDAP para implementar isso?
Atualize o LDAP para incluir o esquema OpenSSH-LPK
Primeiro precisamos atualizar o LDAP com um esquema para adicionar o
sshPublicKey
atributo para usuários:Crie um script que consulte o LDAP em busca da chave pública de um usuário:
O script deve gerar as chaves públicas para esse usuário, exemplo:
ldapsearch '(&(objectClass=posixAccount)(uid='"$1"'))' 'sshPublicKey' | sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;s/sshPublicKey: //gp'
Atualize
sshd_config
para apontar para o script da etapa anteriorAuthorizedKeysCommand /path/to/script
AuthorizedKeysCommandUser nobody
Bônus : atualização
sshd_config
para permitir a autenticação de senha de redes RFC1918 internas, conforme visto nesta pergunta:Permitir apenas a autenticação de senha para o servidor SSH da rede interna
Links Úteis:
EDIT: Adicionado usuário
nobody
como sugerido TRS-80Esta não é uma resposta completa, apenas uma adição à resposta de c4urself . Eu teria adicionado isso como um comentário, mas não tenho reputação suficiente para comentar, então, por favor, não rejeite!
Este é o script que estou usando para
AuthorizedKeysCommand
(baseado na versão do c4urself). Ele funciona independentemente de o valor ser retornado na codificação base64 ou não. Isso pode ser especialmente útil se você quiser armazenar várias chaves autorizadas no LDAP -- simplesmente separe as chaves com caracteres de nova linha, semelhante ao arquivo author_keys.Para quem está recebendo o erro ao executar o ldapsearch:
como eu estava (no FreeBSD), a correção é alterar o primeiro comando sed para:
(adicionando um ponto e vírgula após o 'd').
Só queria compartilhar meu "método", meu lado do cliente é específico do Debian/Ubuntu, mas meu lado do servidor é basicamente o mesmo que acima, mas com um pouco mais de "HowTo:"
Servidor :
Ativar atributo de chave pública:
Crédito:
https://blog.shichao.io/2015/04/17/setup_openldap_server_with_openssh_lpk_on_ubuntu.html
Agora use isso para adicionar ldif:
Adicionando um usuário com chave pública SSH no phpLDAPadmin
Primeiro, crie um usuário com o modelo “Generic: User Account”. Em seguida, vá para a seção do atributo “objectClass”, clique em “adicionar valor” e escolha o atributo “ldapPublicKey”. Depois de enviar, volte para a página de edição do usuário, clique em “Adicionar novo atributo” na parte superior e escolha “sshPublicKey”, cole a chave pública na área de texto e, finalmente, clique em “Atualizar objeto”.
Atributo sshPublicKey não exibido - OpenLDAP PHPLDAP SSH Key Auth
Cliente Ubuntu:
Criar chaves de teste: