Настройка аутентификации PAM и сопоставления пользователей с аутентификацией LDAP
В этой статье мы рассмотрим настройку аутентификации PAM с использованием плагина аутентификации pam и сопоставление пользователей и групп с модулем PAM pam_user_map. Основная аутентификация будет выполняться модулем PAM pam_ldap, который выполняет аутентификацию LDAP. Мы также настроим сервер OpenLDAP.
Гипотетические требования
В этом руководстве мы будем исходить из следующих гипотетических требований:
- Пользователь LDAP
fooдолжен быть сопоставлен с пользователем MariaDBbar. (foo: bar) - Любой пользователь LDAP в группе LDAP
dbaдолжен быть сопоставлен с пользователем MariaDBdba. (@dba: dba)
Настройка сервера OpenLDAP
Прежде чем мы сможем использовать аутентификацию LDAP, нам сначала нужно настроить сервер OpenLDAP. Обычно это делается на сервере, полностью отделенном от сервера базы данных.
Установка компонентов сервера и клиента OpenLDAP
На сервере, выполняющем роль сервера OpenLDAP, в первую очередь нужно установить компоненты OpenLDAP.
В дистрибутивах Linux, таких как RHEL, CentOS и аналогичных, использующих пакеты RPM:
sudo yum install openldap openldap-servers openldap-clients nss-pam-ldapd
Настройка сервера OpenLDAP
Далее, давайте настроим сервер OpenLDAP. Самый простой способ сделать это — скопировать шаблон файла конфигурации, который входит в установку. В многих установках он будет находиться по пути /usr/share/openldap-servers/DB_CONFIG.example. Например:
sudo cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG sudo chown ldap. /var/lib/ldap/DB_CONFIG
Настройка порта OpenLDAP
Иногда полезно изменить порт, используемый OpenLDAP. Например, некоторые облачные среды блокируют известные службы аутентификации, таким образом блокируя стандартный порт LDAP.
В некоторых системах порт можно изменить, установив SLAPD_URLS в /etc/sysconfig/slapd. Например:
SLAPD_URLS="ldapi:/// ldap://0.0.0.0:3306/"
Я использовал 3306, поскольку это порт, обычно используемый mysqld, поэтому я знаю, что он не заблокирован.
Запуск сервера OpenLDAP
Далее, запустим сервер OpenLDAP и настроим его на автоматический запуск при перезагрузке. В системах systemd, это можно сделать так:
sudo systemctl start slapd sudo systemctl enable slapd
Установка стандартных объектов LDAP
Для использования LDAP в аутентификации, нам также нужно установить некоторые стандартные objectClasses, такие как posixAccount и posixGroup. В LDAP такие вещи, как objectClasses, определяются в файлах LDIF. В многих установках эти конкретные objectClasses определены в /etc/openldap/schema/nis.ldif. nis.ldif также зависит от core.ldif и cosine.ldif. Однако core.ldif обычно устанавливается по умолчанию.
Мы можем установить их с помощью ldapmodify:
sudo ldapmodify -a -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif sudo ldapmodify -a -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
Создание пользователя-менеджера каталогов LDAP
Далее, создадим пользователя-менеджера каталогов. Это можно сделать, используя систему конфигурации OpenLDAP olc для изменения директивы olcRootDN на DN пользователя-менеджера каталогов, что означает, что этот пользователь будет иметь привилегии LDAP и не будет ограничен контролем доступа. Также установим пароль root для пользователя, изменив директиву olcRootPW.
Также установим суффикс DN для нашей базы данных LDAP-бекенда, изменив директиву olcSuffix.
Давайте воспользуемся утилитой slappasswd для генерации хэша пароля из текстового пароля. Просто выполните команду:
slappasswd
Эта утилита должна выдать хэш пароля, похожий на этот: {SSHA}AwT4jrvmokeCkbDrFAnGvzzjCMb7bvEl
Система конфигурации OpenLDAP olc также использует файлы LDIF. Теперь, когда у нас есть хэш пароля, давайте создадим файл LDIF для создания пользователя-менеджера каталогов:
tee ~/setupDirectoryManager.ldif <<EOF
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to *
by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
by dn.base="cn=Manager,dc=support,dc=mariadb,dc=com" read
by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=support,dc=mariadb,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=support,dc=mariadb,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}AwT4jrvmokeCkbDrFAnGvzzjCMb7bvEl
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange
by dn="cn=Manager,dc=support,dc=mariadb,dc=com" write
by anonymous auth
by self write
by * none
olcAccess: {1}to dn.base=""
by * read
olcAccess: {2}to *
by dn="cn=Manager,dc=support,dc=mariadb,dc=com" write
by * read
EOF
Обратите внимание, что я использую домен dc=support,dc=mariadb,dc=com для своего каталога. Вы можете изменить его на соответствующий вам.
Теперь давайте запустим файл ldif с помощью ldapmodify:
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f ~/setupDirectoryManager.ldif
После этого шага мы будем использовать нового пользователя-менеджера каталогов для внесения изменений в каталог LDAP.
Создание структуры каталога
Далее, давайте создадим структуру каталога, создав части нашего дерева.
tee ~/setupDirectoryStructure.ldif <<EOF dn: dc=support,dc=mariadb,dc=com objectClass: top objectClass: dcObject objectclass: organization o: MariaDB Support Team dc: support dn: cn=Manager,dc=support,dc=mariadb,dc=com objectClass: top objectClass: organizationalRole cn: Manager description: Directory Manager dn: ou=People,dc=support,dc=mariadb,dc=com objectClass: top objectClass: organizationalUnit ou: People dn: ou=Groups,dc=support,dc=mariadb,dc=com objectClass: top objectClass: organizationalUnit ou: Groups dn: ou=System Users,dc=support,dc=mariadb,dc=com objectClass: top objectClass: organizationalUnit ou: System Users EOF
Теперь давайте воспользуемся новым пользователем-менеджером каталогов и запустим файл LDIF с помощью ldapmodify:
ldapmodify -a -x -D cn=Manager,dc=support,dc=mariadb,dc=com -W -f ~/setupDirectoryStructure.ldif
Создание пользователей и групп LDAP
Давайте создадим пользователей и группы LDAP, используемые в этом гипотетическом сценарии.
Сначала создадим пользователя foo:
tee ~/createFooUser.ldif <<EOF
dn: uid=foo,ou=People,dc=support,dc=mariadb,dc=com
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
cn: foo
uid: foo
uidNumber: 16859
gidNumber: 100
homeDirectory: /home/foo
loginShell: /bin/bash
gecos: foo
userPassword: {crypt}x
shadowLastChange: -1
shadowMax: -1
shadowWarning: 0
EOF
ldapmodify -a -x -D cn=Manager,dc=support,dc=mariadb,dc=com -W -f ~/createFooUser.ldif
Затем создадим пару пользователей для добавления в группу dba:
tee ~/createDbaUsers.ldif <<EOF
dn: uid=gmontee,ou=People,dc=support,dc=mariadb,dc=com
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
cn: gmontee
uid: gmontee
uidNumber: 16860
gidNumber: 100
homeDirectory: /home/gmontee
loginShell: /bin/bash
gecos: gmontee
userPassword: {crypt}x
shadowLastChange: -1
shadowMax: -1
shadowWarning: 0
dn: uid=bstillman,ou=People,dc=support,dc=mariadb,dc=com
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
cn: bstillman
uid: bstillman
uidNumber: 16861
gidNumber: 100
homeDirectory: /home/bstillman
loginShell: /bin/bash
gecos: bstillman
userPassword: {crypt}x
shadowLastChange: -1
shadowMax: -1
shadowWarning: 0
EOF
ldapmodify -a -x -D cn=Manager,dc=support,dc=mariadb,dc=com -W -f ~/createDbaUsers.ldif
Обратите внимание, что каждому из этих пользователей нужен пароль, который можно установить для каждого пользователя с помощью ldappasswd:
ldappasswd -x -D cn=Manager,dc=support,dc=mariadb,dc=com -W -S uid=foo,ou=People,dc=support,dc=mariadb,dc=com ldappasswd -x -D cn=Manager,dc=support,dc=mariadb,dc=com -W -S uid=gmontee,ou=People,dc=support,dc=mariadb,dc=com ldappasswd -x -D cn=Manager,dc=support,dc=mariadb,dc=com -W -S uid=bstillman,ou=People,dc=support,dc=mariadb,dc=com
Затем создадим нашу группу dba:
tee ~/createDbaGroup.ldif <<EOF dn: cn=dba,ou=Groups,dc=support,dc=mariadb,dc=com objectClass: top objectClass: posixGroup gidNumber: 678 EOF ldapmodify -a -x -D cn=Manager,dc=support,dc=mariadb,dc=com -W -f ~/createDbaGroup.ldif
Затем добавим этих двух пользователей в неё:
tee ~/addUsersToDbaGroup.ldif <<EOF dn: cn=dba,ou=Groups,dc=support,dc=mariadb,dc=com changetype: modify add: memberuid memberuid: gmontee dn: cn=dba,ou=Groups,dc=support,dc=mariadb,dc=com changetype: modify add: memberuid memberuid: bstillman EOF ldapmodify -a -x -D cn=Manager,dc=support,dc=mariadb,dc=com -W -f ~/addUsersToDbaGroup.ldif
Нам также нужно создать пользователей LDAP с теми же именами, что и пользователи MariaDB bar и dba. См. здесь для получения дополнительной информации о причинах. Эти пользователи не будут использоваться для входа, поэтому им не нужны пароли. Вместо People organizationalUnit, мы создадим их в System Users organizationalUnit.
tee ~/createSystemUsers.ldif <<EOF
dn: uid=bar,ou=System Users,dc=support,dc=mariadb,dc=com
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
cn: bar
uid: bar
uidNumber: 16862
gidNumber: 100
homeDirectory: /home/bar
loginShell: /bin/bash
gecos: bar
userPassword: {crypt}x
shadowLastChange: -1
shadowMax: -1
shadowWarning: 0
dn: uid=dba,ou=System Users,dc=support,dc=mariadb,dc=com
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
cn: dba
uid: dba
uidNumber: 16863
gidNumber: 100
homeDirectory: /home/dba
loginShell: /bin/bash
gecos: dba
userPassword: {crypt}x
shadowLastChange: -1
shadowMax: -1
shadowWarning: 0
EOF
ldapmodify -a -x -D cn=Manager,dc=support,dc=mariadb,dc=com -W -f ~/createSystemUsers.ldif
Настройка сервера MariaDB
На этом этапе мы можем перейти к настройке сервера MariaDB.
Установка библиотек LDAP и PAM
Сначала нам нужно убедиться, что установлены библиотеки LDAP и PAM.
В дистрибутивах Linux, таких как RHEL, CentOS и аналогичных, использующих пакеты RPM, необходимо установить следующие пакеты:
sudo yum install openldap-clients nss-pam-ldapd pam pam-devel
Настройка LDAP
Далее, настроим LDAP в системе. Для этого можем использовать authconfig:
sudo authconfig --enableldap \ --enableldapauth \ --ldapserver="ldap://172.30.0.238:3306" \ --ldapbasedn="dc=support,dc=mariadb,dc=com" \ --enablemkhomedir \ --update
Не забудьте заменить -–ldapserver и -–ldapbasedn на значения, соответствующие вашей среде.
Установка модуля PAM pam_user_map
Следующие шаги относятся к серверу MariaDB в версиях 10.2.32.7, 10.3.23., 10.4.13.6, 10.5.2 и более ранних. В более поздних выпусках модуль pam_user_map PAM уже включён в базовую установку.
Далее, давайте установим модуль pam_user_map PAM.
Перед компиляцией модуля из исходного кода нам, возможно, потребуется установить некоторые зависимости.
В дистрибутивах Linux, таких как RHEL, CentOS и аналогичных, использующих пакеты RPM, нам нужно установить gcc и pam-devel:
sudo yum install gcc pam-devel
В дистрибутивах Linux, таких как Debian, Ubuntu и аналогичных, использующих пакеты DEB, нам нужно установить gcc и libpam0g-dev:
sudo apt-get install gcc libpam0g-dev
После этого мы можем скомпилировать и установить библиотеку с помощью следующего:
wget https://raw.githubusercontent.com/MariaDB/server/10.4/plugin/auth_pam/mapper/pam_user_map.c gcc pam_user_map.c -shared -lpam -fPIC -o pam_user_map.so sudo install --mode=0755 pam_user_map.so /lib64/security/
Настройка модуля pam_user_map PAM
Далее, давайте настроим модуль pam_user_map PAM в соответствии с нашими гипотетическими требованиями.
Файл конфигурации модуля PAM pam_user_map находится по адресу /etc/security/user_map.conf. В соответствии с нашими гипотетическими требованиями он будет выглядеть следующим образом:
foo: bar @dba:dba
Установка плагина аутентификации PAM
Далее, давайте установим плагин аутентификации pam.
Войдите в сервер MariaDB и выполните следующие команды:
INSTALL SONAME 'auth_pam';
Настройка службы PAM
Далее, давайте настроим службу PAM. Мы назовём нашу службу mariadb, поэтому файл конфигурации службы PAM будет находиться по адресу /etc/pam.d/mariadb на большинстве систем.
Настройка PAM для разрешения только аутентификации LDAP
Поскольку мы выполняем только аутентификацию LDAP с модулем PAM pam_ldap и сопоставление групп с модулем PAM pam_user_map, наш файл конфигурации будет выглядеть следующим образом:
auth required pam_ldap.so auth required pam_user_map.so account required pam_ldap.so
Настройка PAM для разрешения аутентификации LDAP и локальных Unix-пользователей
Если мы хотим разрешить аутентификацию от пользователей LDAP и локальных Unix-пользователей через pam_unix, при этом отдавая приоритет локальным пользователям, мы можем сделать это так:
auth [success=1 new_authtok_reqd=1 default=ignore] pam_unix.so audit auth required pam_ldap.so try_first_pass auth required pam_user_map.so account sufficient pam_unix.so audit account required pam_ldap.so
Настройка модуля pam_unix PAM
Если вы также хотите разрешить аутентификацию локальных Unix-пользователей, модуль PAM pam_unix добавляет некоторые дополнительные шаги конфигурации на многих системах. В основном, нужно предоставить пользователю, выполняющему mysqld доступ к /etc/shadow.
Если пользователь mysql выполняет mysqld, то это можно сделать, выполнив следующее:
sudo groupadd shadow sudo usermod -a -G shadow mysql sudo chown root:shadow /etc/shadow sudo chmod g+r /etc/shadow
Для того, чтобы это изменение вступило в силу, требуется перезапуск сервера. Перезагрузка сервера.
Создание пользователей MariaDB
Далее, давайте создадим пользователей MariaDB. Помните, что наша служба PAM называется mariadb.
Сначала давайте создадим пользователя MariaDB для сопоставления пользователей: foo: bar
Это означает, что нам нужно создать пользователя bar:
CREATE USER 'bar'@'%' IDENTIFIED BY 'strongpassword'; GRANT ALL PRIVILEGES ON *.* TO 'bar'@'%' ;
Затем давайте создадим пользователя MariaDB для сопоставления групп: @dba: dba
Это означает, что нам нужно создать пользователя dba:
CREATE USER 'dba'@'%' IDENTIFIED BY 'strongpassword'; GRANT ALL PRIVILEGES ON *.* TO 'dba'@'%' ;
Затем, чтобы разрешить сопоставление пользователей и групп, нам нужно создать анонимного пользователя, который аутентифицируется с помощью pam плагина аутентификации, который также может PROXY в качестве пользователей bar и dba. Перед созданием прокси-пользователя, возможно, потребуется очистить некоторые значения по умолчанию:
DELETE FROM mysql.db WHERE User='' AND Host='%'; FLUSH PRIVILEGES;
Затем давайте создадим анонимного прокси-пользователя:
CREATE USER ''@'%' IDENTIFIED VIA pam USING 'mariadb'; GRANT PROXY ON 'bar'@'%' TO ''@'%'; GRANT PROXY ON 'dba'@'%' TO ''@'%';
Тестирование нашей конфигурации
Далее, давайте проверим нашу конфигурацию, проверив, происходит ли сопоставление. Мы можем проверить это, войдя в систему как каждый из наших пользователей и сравнив возвращаемое значение USER(), которое является исходным именем пользователя, и возвращаемое значение CURRENT_USER(), которое является аутентифицированным именем пользователя.
Тестирование аутентификации LDAP
Сначала давайте протестируем пользователя foo:
$ mysql -u foo -h 172.30.0.198 [mariadb] Password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 134 Server version: 10.3.10-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> SELECT USER(), CURRENT_USER(); +------------------------------------------------+----------------+ | USER() | CURRENT_USER() | +------------------------------------------------+----------------+ | foo@ip-172-30-0-198.us-west-2.compute.internal | bar@% | +------------------------------------------------+----------------+ 1 row in set (0.000 sec)
Мы можем убедиться, что наш LDAP-пользователь foo был правильно сопоставлен с пользователем MariaDB bar, посмотрев на возвращаемое значение CURRENT_USER().
Затем давайте протестируем нашего пользователя gmontee в группе dba:
$ mysql -u gmontee -h 172.30.0.198 [mariadb] Password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 135 Server version: 10.3.10-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> SELECT USER(), CURRENT_USER(); +----------------------------------------------------+----------------+ | USER() | CURRENT_USER() | +----------------------------------------------------+----------------+ | gmontee@ip-172-30-0-198.us-west-2.compute.internal | dba@% | +----------------------------------------------------+----------------+ 1 row in set (0.000 sec)
И затем давайте протестируем нашего пользователя bstillman в группе dba:
$ mysql -u bstillman -h 172.30.0.198 [mariadb] Password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 136 Server version: 10.3.10-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> SELECT USER(), CURRENT_USER(); +------------------------------------------------------+----------------+ | USER() | CURRENT_USER() | +------------------------------------------------------+----------------+ | bstillman@ip-172-30-0-198.us-west-2.compute.internal | dba@% | +------------------------------------------------------+----------------+ 1 row in set (0.000 sec)
Мы можем убедиться, что наши LDAP-пользователи gmontee и bstillman в группе LDAP dba были правильно сопоставлены с пользователем MariaDB dba, посмотрев на возвращаемые значения CURRENT_USER().
Тестирование аутентификации локальной Unix
Если вы выбрали вариант, который также позволяет локальную аутентификацию Unix, то давайте протестируем это. Давайте создадим пользователя Unix и быстро зададим ему пароль:
sudo useradd alice sudo passwd alice
И давайте также сопоставим этого пользователя с dba:
@dba:dba foo: bar alice: dba
И нам известно, что существующий анонимный пользователь уже имеет привилегию PROXY для пользователя dba, поэтому это должно работать без дополнительной конфигурации. Давайте протестируем это:
$ mysql -u alice -h 172.30.0.198 [mariadb] Password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 141 Server version: 10.3.10-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> SELECT USER(), CURRENT_USER(); +--------------------------------------------------+----------------+ | USER() | CURRENT_USER() | +--------------------------------------------------+----------------+ | alice@ip-172-30-0-198.us-west-2.compute.internal | dba@% | +--------------------------------------------------+----------------+ 1 row in set (0.000 sec)
Мы можем убедиться, что наш Unix-пользователь alice был правильно сопоставлен с пользователем MariaDB dba, посмотрев на возвращаемые значения CURRENT_USER().
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/configuring-pam-authentication-and-user-mapping-with-ldap-authentication/