Spec-Zone.ru › MariaDB

Настройка аутентификации PAM и сопоставления пользователей с аутентификацией LDAP

В этой статье мы рассмотрим настройку аутентификации PAM с использованием плагина аутентификации pam и сопоставление пользователей и групп с модулем PAM pam_user_map. Основная аутентификация будет выполняться модулем PAM pam_ldap, который выполняет аутентификацию LDAP. Мы также настроим сервер OpenLDAP.

Гипотетические требования

В этом руководстве мы будем исходить из следующих гипотетических требований:

  • Пользователь LDAP foo должен быть сопоставлен с пользователем MariaDB bar. (foo: bar)
  • Любой пользователь LDAP в группе LDAP dba должен быть сопоставлен с пользователем MariaDB dba. (@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().

Содержимое, воспроизведенное на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проверяется заранее компанией MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают точку зрения MariaDB или любой другой стороны.

© 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API