autenticação de chave SSH usando LDAP

52

Resumindo:

Gostaria de uma maneira de fazer a autenticação de chave SSH via LDAP.

Problema:

Usamos o 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 da AMI é importante é que, idealmente , gostaríamos de poder fazer o login com SSH via autenticação de chave assim que a instância estivesse em execução e não precisar esperar pelo nosso gerenciamento de configuração um pouco lento ferramenta para iniciar um script para adicionar as chaves corretas à instância.

O cenário ideal é que, ao adicionar um usuário ao LDAP, também adicionemos a chave e ele poderá fazer o login imediatamente.

A autenticação de chaves é um must porque o login baseado em senha é menos seguro e incômodo.

Li esta questão que sugere que existe um patch para o OpenSSH chamado OpenSSH-lpk para fazer isso, mas isso não é mais necessário com o servidor OpenSSH > = 6.2

Added a sshd_config(5) option AuthorizedKeysCommand to support fetching authorized_keys from a command in addition to (or instead of) from the filesystem. The command is run under an account specified by an AuthorizedKeysCommandUser sshd_config(5) option

Como posso configurar o OpenSSH e o LDAP para implementar isso?

    
por c4urself 19.12.2014 / 21:13

4 respostas

59

Atualizar o LDAP para incluir o esquema OpenSSH-LPK

Primeiramente, precisamos atualizar o LDAP com um esquema para adicionar o atributo sshPublicKey aos usuários:

dn: cn=openssh-lpk,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: openssh-lpk
olcAttributeTypes: ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey'
    DESC 'MANDATORY: OpenSSH Public key'
    EQUALITY octetStringMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
olcObjectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY
    DESC 'MANDATORY: OpenSSH LPK objectclass'
    MAY ( sshPublicKey $ uid )
    )

Crie um script que consulte o LDAP para a chave pública de um usuário:

O script deve gerar as chaves públicas para esse usuário, por 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 anterior

  • AuthorizedKeysCommand /path/to/script
  • AuthorizedKeysCommandUser nobody

Bônus : atualize sshd_config para permitir a autenticação de senha de redes RFC1918 internas, como visto nesta pergunta:

Permitir somente a autenticação de senha para o servidor SSH a partir de interna rede

Links úteis:

EDIT: Adicionado usuário nobody como sugerido TRS-80

    
por 19.12.2014 / 21:13
5

Para quem recebe o erro ao executar o ldapsearch:

sed: 1: "/^ /{H;d};": extra characters at the end of d command

como eu estava (no FreeBSD), a correção é mudar o primeiro comando sed para:

/^ /{H;d;};

(adicionando um ponto e vírgula após o 'd').

    
por 08.03.2016 / 14:18
4

Só queria compartilhar meu "método", meu lado do cliente é Debian / Ubuntu Specific, 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:

link

cat << EOL >~/openssh-lpk.ldif
dn: cn=openssh-lpk,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: openssh-lpk
olcAttributeTypes: ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey'
  DESC 'MANDATORY: OpenSSH Public key'
  EQUALITY octetStringMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
olcObjectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY
  DESC 'MANDATORY: OpenSSH LPK objectclass'
  MAY ( sshPublicKey $ uid )
  )
EOL

Agora use isso para adicionar o ldif:

ldapadd -Y EXTERNAL -H ldapi:/// -f ~/openssh-lpk.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 de atributo "objectClass", clique em "add value" 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 mostrando - OpenLDAP PHPLDAP SSH Key Auth

Cliente Ubuntu:

apt-get -y install python-pip python-ldap
pip install ssh-ldap-pubkey
sh -c 'echo "AuthorizedKeysCommand /usr/local/bin/ssh-ldap-pubkey-wrapper\nAuthorizedKeysCommandUser nobody" >> /etc/ssh/sshd_config' && service ssh restart

Criar chaves de teste:

ssh-keygen -t rsa
    
por 18.09.2016 / 21:44
2

Esta não é uma resposta completa, apenas uma adição à resposta da própria pessoa . Eu teria acrescentado isso como um comentário, mas não tenho reputação suficiente para comentar, então, por favor, não faça downvote!

Este é o script que estou usando para o 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 - basta separar as chaves com caracteres de nova linha, semelhantes ao arquivo authorized_keys.

#!/bin/bash
set -eou pipefail
IFS=$'\n\t'

result=$(ldapsearch '(&(objectClass=posixAccount)(uid='"$1"'))' 'sshPublicKey')
attrLine=$(echo "$result" | sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;/sshPublicKey:/p')

if [[ "$attrLine" == sshPublicKey::* ]]; then
  echo "$attrLine" | sed 's/sshPublicKey:: //' | base64 -d
elif [[ "$attrLine" == sshPublicKey:* ]]; then
  echo "$attrLine" | sed 's/sshPublicKey: //'
else
  exit 1
fi
    
por 15.11.2016 / 11:39