Хотел бы способ аутентификации ключа 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 для реализации этого?
Сначала нам нужно обновить 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 )
)
Скрипт должен выводить открытые ключи для этого пользователя, например:
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
AuthorizedKeysCommandUser nobody
Бонус: Обновить sshd_config
чтобы разрешить аутентификацию по паролю из внутренних сетей RFC1918, как показано в этом вопросе:
Разрешить парольную аутентификацию на SSH-сервере только из внутренней сети
EDIT: добавлен пользователь nobody
как предложено TRS-80
Для тех, кто получает ошибку при запуске ldapsearch:
sed: 1: "/^ /{H;d};": extra characters at the end of d command
как и я (на FreeBSD), исправление состоит в том, чтобы изменить первую команду sed на:
/^ /{H;d;};
(добавление точки с запятой после "d").
Это не полный ответ, просто дополнение к 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
Просто хотел поделиться своим "методом", моя клиентская сторона специфична для Debian / Ubuntu, но моя серверная сторона в основном такая же, как и выше, но с немного большим "HowTo:"
Сервер:
Включить атрибут открытого ключа:
Кредит:
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: User Account». Затем перейдите в раздел атрибутов «objectClass», нажмите «добавить значение» и выберите атрибут «ldapPublicKey». После отправки вернитесь на страницу редактирования пользователя, нажмите «Добавить новый атрибут» в верхней части, выберите «sshPublicKey», вставьте открытый ключ в текстовую область и, наконец, нажмите «Обновить объект» ».
Атрибут sshPublicKey не отображается - OpenLDAP PHPLDAP SSH Key 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
Создать тестовые ключи:
ssh-keygen -t rsa