Аутентификация ключа SSH с помощью LDAP

Короче говоря:

Хотел бы способ сделать ключевую аутентификацию SSH через LDAP.

Проблема:

Мы используем LDAP (slapd) для служб каталогов, и мы недавно переместились в использование нашего собственного AMI для создания экземпляров. Причина, которую укусил AMI, важна, то, что, идеально, мы хотели бы смочь войти в систему с SSH через ключевую аутентификацию, как только экземпляр работает и не должен ожидать нашего несколько медленного инструмента управления конфигурацией к началу сценарий для добавления корректных ключей к экземпляру.

Идеальный сценарий - то, что, при добавлении пользователя к LDAP мы добавляем их ключ также, и они были бы сразу смочь войти в систему.

Ключевая аутентификация - необходимость, потому что основанный на пароле вход в систему является и менее безопасным и надоедливым.

Я считал этот вопрос, который предполагает, что существует патч для OpenSSH по имени OpenSSH-lpk, чтобы сделать это, но это больше не необходимо с сервером OpenSSH> = 6.2

Добавленный sshd_config (5) опция AuthorizedKeysCommand поддерживать выборку authorized_keys от команды в дополнение к (или вместо) от файловой системы. Команда выполняется в соответствии с учетной записью, указанной AuthorizedKeysCommandUser sshd_config (5) опция

Как я могу настроить OpenSSH и LDAP для реализации этого?

60
задан 13 April 2017 в 15:14
4 ответа

Обновить LDAP, чтобы включить схему OpenSSH-LPK

Сначала нам нужно обновить LDAP с помощью схемы, чтобы добавить атрибут sshPublicKey для пользователей:

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 )
    )

Создайте сценарий, который запрашивает в LDAP открытый ключ пользователя:

Сценарий должен выводить открытые ключи для этого пользователя, например:

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

Обновление sshd_config чтобы указать на сценарий из предыдущего шага

  • AuthorizedKeysCommand / path / to / script
  • AuthorizedKeysCommandUserbody

Bonus : обновите sshd_config , чтобы разрешить аутентификацию по паролю из внутренних сетей RFC1918, как показано в этом вопросе:

Разрешить аутентификацию по паролю на SSH-сервере только из внутренней сети

Полезные ссылки:

РЕДАКТИРОВАТЬ: Добавлен пользователь никто как предлагается TRS-80

64
ответ дан 28 November 2019 в 19:32

Для любого, кто получил ошибку при запуске ldapsearch:

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

как я (на FreeBSD), исправление заключается в изменении первой команды sed на:

/^ /{H;d;};

(добавление точки с запятой после 'd').

.
5
ответ дан 28 November 2019 в 19:32

Просто хотел поделиться своим "методом", моя клиентская сторона - это Debian/Ubuntu Specific, но моя серверная сторона в основном та же самая, что и выше, но с чуть более "HowTo:"

Server :

Enable Public Key Attribute :

Credit :

https://blog. shichao.io/2015/04/17/setup_openldap_server_with_openssh_lpk_on_ubuntu.html

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

Теперь используйте это для добавления ldif :

ldapadd -Y EXTERNAL -H ldapi:/// -f ~/openssh-lpk.ldif

Добавление пользователя с открытым SSH ключом в phpLDAPadmin

Сначала создайте пользователя с "Generic: Аккаунт пользователя". Затем перейдите в раздел атрибутов "objectClass", нажмите кнопку "add value" и выберите атрибут "ldapPublicKey". После отправки, вернитесь на страницу редактирования пользователя, в верхней части нажмите кнопку "Добавить новый атрибут", выберите "sshPublicKey", вставьте публичный ключ в текстовую область и, наконец, нажмите кнопку "Обновить объект". "

sshPublicKey атрибут не показывается - OpenLDAP PHPLDAP SSH ключ Auth

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

Create Test Keys :

ssh-keygen -t rsa
4
ответ дан 28 November 2019 в 19:32

Это не полный ответ, а просто дополнение к ответу c4urself . Я бы добавил это в качестве комментария, но у меня недостаточно репутации для комментариев, поэтому, пожалуйста, не голосуйте против!

Это сценарий, который я использую для AuthorizedKeysCommand (на основе версия c4urself). Он работает независимо от того, возвращается ли значение в кодировке base64 или нет. Это может быть особенно полезно, если вы хотите сохранить несколько авторизованных ключей в LDAP - просто разделите ключи символами новой строки, как в файле 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
3
ответ дан 28 November 2019 в 19:32

Теги

Похожие вопросы