OpenLDAP в качестве центра аутентификации для Nextcloud и ProFTPD

Привет, Хабр! На связи Холодаев Алексей, младший системный администратор Cloud4Y. Сегодня хочу поделиться опытом использования OpenLDAP в качестве центра аутентификации для Nextcloud и ProFTPD.

В ходе работы над одним из проектов возникла задача по созданию нескольких сотен пользователей на Nextcloud и ProFTPD. На ProFTPD пользователи должны создаваться с FTP квотой, а на Nextcloud — с Nextcloud квотой. Все серверы работают под управлением ОС Linux Debian 10. Заниматься каждым сервером отдельно было как-то не весело. Поэтому я обратил свой взор на центр аутентификациии LDAP, желая использовать его в качестве центра аутентификации для Nextcloud и ProFTPD. Делюсь инструкцией, как это можно сделать.

Изначально я выбрал реализацию OpenLDAP server, после чего развернул виртуальную машину на Debian 10. Обновил ОС и перезагрузил её:

sudo apt-get -y update

sudo apt-get -y upgrade

sudo reboot

Затем установил OpenLDAP server и LDAP утилиты командойapt-get -y install slapd LDAP -utils

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

Если у вас спросили в ходу установки не все настройки, выполните команду переконфигурации  OpenLDAP server: dpkg-reconfigure slapd и задайте все настройки заново.

Пароль администратора LDAP сервера:

Подтвердите пароль:

494f06ce5d46508203084388fc136f21.png

Далее нажимаем No, т.к. мы не будем создавать начальную конфигурацию сервера, а сконфигурируем его сами.

2950777454391d849192f91cad009459.png

Задаём имя нашего домена:

49eb5a107678d8a3a765a4cfa0106ced.png

Вводим имя организации:

999d1aaa12e227f20f33c28e169177a0.png

Далее вводим пароль администратора:

62c17cc913e223117bda2f7153a211fb.png

Повторяем пароль администратора:

fddc97348e20de85294e4cd946324507.png

Выбираем тип базы данных MDB:

a33bb661acc5f6e24e942132a7de2b55.png

Здесь нажимаем No, т.к. мы не хотим, чтобы база удалялась при очистке slapd:

f319f32457fd7fafb7d852ad9adbc657.png

Нажимаем Yes, т.к. мы хотим переместить старую базу прежде чем создать новую:

2386fbefaa913009ca12da644134efc7.png

Выполняем команду slapcat и убеждаемся, что база данных создана:

d2f7317a069d700b2201786960cc914c.png

Чтобы иметь возможность создавать пользователей с квотами FTP и квотами Nextcloud, нужно внести дополнительные атрибуты в схему LDAP OpenLDAP сервера. Также необходимо внести объектный класс, содержащий эти атрибуты.

По умолчанию редактировать схему LDAP в OpenLDAP сервере может только корневой пользователь ОС (используется SAML аутентификация).

Все изменения в схему LDAP будем вносить через LDIF файл. Он будет содержать следующий текст:

dn: cn=test,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: test
olcAttributeTypes: ( 1.3.6.1.1.1.1.28 NAME 'ftpQuota'
 DESC 'Quota FTP'
 EQUALITY caseIgnoreIA5Match
 SUBSTR caseIgnoreIA5SubstringsMatch
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
 SINGLE-VALUE )
olcAttributeTypes: ( 1.3.6.1.1.1.1.29 NAME 'NextQuota'
 DESC 'Quota Nextcloud '
 EQUALITY caseIgnoreIA5Match
 SUBSTR caseIgnoreIA5SubstringsMatch
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
 SINGLE-VALUE )
olcObjectClasses:( 1.3.6.1.1.1.2.48 NAME 'FtpNext'
 DESC 'Abstraction of an account with POSIX attributes'
 SUP top AUXILIARY
 MUST ( ftpQuota $ NextQuota ) )

Созданный файл назовём test.ldif

У файлов LDIF есть определённый синтаксис, который необходимо соблюдать при их написании. Подробнее вы можете узнать в официальной документации по LDAP.

Атрибуты создаются типа String, на что указывает строчка EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch в LDIFфайле.

С помощью утилиты ldapadd этот набор схемы был добавлен на OpenLDAP server командой:

LDAP add -H LDAP i:/// -Y EXTERNAL -f test.ldif

Параметр –Y EXTERNAL задаётся для выполнения команды от имени корневого пользователя операционной системы.

Параметр –H ldapi:///задаёт адрес LDAP сервера. В данном случае он пустой , т.к. я выполняю команду локально. Если вы будете выполнять команду не локально, то нужно будет использовать ldap://ip_адрес сервера.

Параметр -f test.ldif задаёт имя файлаldif.

После успешного добавления набора схемы мы можем создавать пользователей в OpenLDAP с квотой Nextcloud и квотой ProFTPD.

Создавать пользователей в OpenLDAP  тоже удобнее через LDIF файл. Вот пример user.LDIF файла создания пользователя с квотой Nextcloud и квотой ftp:

dn: cn=Vasya,dc=example,dc=com
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
objectClass: FtpNext
cn: Vasya
uid: Vasya
ftpQuota: false,hard,10485760,0,0,0,0,0
NextQuota: 3GB
uidNumber: 8345
gidNumber: 8345
homeDirectory: /mnt/ncdata/Vasya
userPassword: {MD5}5EIJWlXNgJp99AMqzuaYSw==
loginShell: /bin/bash

Пароль пользователя генерируется командой slappasswd –h {md5} –s passwd

Где параметр –h {md5} говорит о том, что надо использовать алгоритм шифрования md5. Параметром –s passwd задаётся пароль, который надо зашифровать. Именно в зашифрованном виде пароль вводится в LDIF файл.

Добавляется пользователь от имени администратора базы LDAP командой:

LDAP add –D "cn=admin,dc=example,dc=com” –w XLD220190bac –f user.ldif

Также создадим группу в LDAP, куда буду входить наши создаваемые пользователи FTPи Nextcloud.

Создадим LDIF файл NextFtp.ldif.

dn: cn=NextFtp,ou=Group,dc=example,dc=com
objectClass: top
objectClass: posixGroup
cn: NextFtp
gidNumber: 10678

И добавим группу командой

LDAP add –D "cn=admin,dc=example,dc=com” –w XLD220190bac –f NextFtp.ldif

Затем внесём в эту группу пользователя Vasya, которого создали выше. Для этого создадим LDIF файл modgrnext.ldif

dn: cn=NextFtp,ou=Group,dc=example,dc=com
changetype: modify
add: memberuid
memberuid: Vasya

LDAP add –D "cn=admin,dc=example,dc=com” –w XLD220190bac –f modgrnext.ldif

Рассмотрим теперь облачное хранилище данных Nextcloud. Для возможности использовать аутентификацию LDAP сервера необходимо установить и включить соответствующий модуль. Заходим в облако Nextcloud под учёткой администратора. Заходим в пункт Приложения в учётной записи администратора.

1ace23b4d1ad286d42055cba91a3d5b8.png

Нажимаем кнопку Включить напротив надписи LDAP user and group backend

ab8420811894ff24ec907c86650da553.png

Система просит пароль администратора. Вводим, нажимаем Подтвердить:

dd1d291e33a7173c255fa91103ac9477.png

Затем нажимаем Настройки в аккаунте администратора:

597b93afcd403287f6ca2eb23da9e909.png

Переходим в Интеграция LDAP / AD:

ffd480fca47508f2563f0eb241057bea.png

В поле сервер вводим ip-адрес LDAP сервера через LDAP://. Порт по умолчанию 389.

Вводим учётные данные администратора LDAP сервера. Указываем базу, где искать пользователей. После ввода настроек нажимаем Сохранить учётные данные. Затем нажимаем Проверить базу поиска DN.

Должна появиться надпись Конфигурация в порядке, означающая, что всё настроено правильно и связь с сервером LDAP есть.

bb9d7f71206f91c1b5ce786cf2cbd7db.png

Выбираем указанные ниже фильтры для выборки пользователей, которые имеют объектные классы posixAccount и FtpNext, т.е. принадлежат Nextcloud. Нажимаем Продолжить.

771560d74306fc15af8c1ad0726376af.png

Здесь оставляем всё без изменений и нажимаем Продолжить.

7ecf48e6712ec70319d74c1f7ef5d753.png

Теперьнам нужно сделать так, чтобы Nextcloud брал квоты пользователей также из LDAP. Для этого нажимаем кнопку Дополнительно.

fc65cf5c62b8a7b777a8b1cb510d3760.png

Раскрываем настройки Специальные атрибуты.

1fe7e48a4357ce5685c884ab37c4f54c.png

Вводим в поле квоты атрибут из LDAP, который отвечает за квоту в Nextcloud, созданный нами ранее. Вводим квоту по умолчанию, если поля квота не обнаружится. Правило наименования домашнего каталога также берём из LDAP атрибута homeDirectory (т.к. наименование домашних каталогов пользователей в Nextcloud по умолчанию некрасивое).

c5fd5e34159ea9d49346271689bf1269.png

Нажимаем Проверить конфигурацию. Если всё настроено правильно, появится окно о том, что конфигурация проверена успешно.

Нажимаем на настройку аккаунта и выбираем Пользователи.

253a1961c5f5bdb5c485cf1f60861199.png

Пользователь Vasya, которого мы создали ранее, появился в Nextcloud.

64404cd92ff2d7ca5671f36d856e4382.png

Теперь мы можем входить под этим пользователем в облако Nextcloud.

6463d2887edfce4d07cfacbb5a0083f2.png

Заходим в настройки аккаунта Vasya:

727f9d4729c6ec3d1204a52a6f4024c4.png

И видим, что применилась квота, которую мы вводили при создании пользователя.

f7cd10d649ce3db2c4d8ec7ef2092e57.png

Значит, наша конфигурация работает.

Настройка ProFTPD сервера

На сервере нужно установить LDAP -client libnss-LDAP командой apt-get install libnss-LDAP

Вводим ip-адресOpenLDAP сервера:

24b876954f8a6011d2398476e13dbb77.png

Имя базы, в которой будет осуществлён поиск:

02708f41edffaaf9c69bc9f760eec650.png

ВерсиюLDAP надо выбрать 3:

040db3ee28bf1ec212228e2978a2e6db.png

Далее система предложит согласиться на ввод админских данныхLDAP сервера, соглашаемся:

3914c56c9659606b80e38fc9121a167c.png

На ввод логина для базы данных отказываемся (это не админская учёткаOpenLDAP сервера):

518560a30f307aa2cdeb2fda06d50e1f.png

Вводим учётные данные администратораOpenLDAP сервера и нажимаем Enter:

c7c234a9b5bd988d3e948e18d5da5b6d.png

Далее вас попросят ввести пароль администратора.

LDAP клиент настроен. Теперь необходимо переключить аутентификацию в Debian через LDAP клиента. Для этого надо сделать настройки в файле /etc/nsswitch.conf. Например, так:

passwd:     files systemd LDAP 
group:     files systemd LDAP 
shadow:     files LDAP 
gshadow:    files LDAP 

hosts:     files dns
networks:    files

protocols:   db files
services:    db files
ethers:     db files
rpc:      db files

netgroup:    nis

Далее командой getent passwd проверим, работает ли у нас аутентификация в ОС Debian через LDAP сервер. Видим, что пользователь Vasya возращается на запрос к Openldap серверу.

36aa62df8723a598f9407236c2c28a5b.png

Для использования аутентификации LDAP на profpd сервере необходимо установить модуль LDAP командой apt-get install ProFTPD-mod-LDAP.

В файле /etc/ProFTPD/modules.conf необходимо раскомментировать две строчки для загрузки LDAP модулей.

LoadModule mod_LDAP .c
LoadModule mod_quotatab_LDAP .c
  • Модуль mod_LDAP .c нужен для аутентификации ProFTPD через LDAP.

  • Модуль mod_quotatab_LDAP .c нужен для поиска квот ProFTPD на сервере LDAP.

Затем в конфигурационном файле /etc/ProFTPD/ProFTPD.conf прописываем следующие настройки:


QuotaEngine on
QuotaLock /tmp/quota
QuotaDirectoryTally on
QuotaDisplayUnits Mb
QuotaLog "/var/log/ProFTPD/quota.log"
QuotaShowQuotas on
QuotaTallyTable file:/var/log/ftpquota.tally
  • Директива QuotaEngine on включает поддержку квот.

  • Директива QuotaLock задаёт имя файла блокировки синхронизации.

  • Директива QuotaDisplayUnits Mb задаёт показ квот в Mb.

  • Директива QuotaShowQuotas on задаёт показывание квоты по запросу SITE QUOTA.

  • Директива QuotaLog »/var/log/ProFTPD/quota.log» задаёт файл логирования использования квот.

  • Директива QuotaDirectoryTally настраивает модуль mod_quotatab для учёта операций с каталогами (например, создание каталога, удаление каталога) при подсчёте.

  • Директива QuotaTallyTable file:/var/log/ftpquota.tally задаёт файл таблицы подсчёта для квоты.

и ещё вот эти настройки:


LDAP Server 192.168.2.32
LDAP BindDN "cn=admin,dc=example,dc=com" "XLD220190bac"
LDAP Users "dc=example,dc=com" "(&(uid=%v)(objectclass=posixAccount)(objectclass=FtpNext))"
LDAP DefaultGID 106
LDAP DefaultUID 65534
LDAP ForceDefaultGID off
LDAP ForceDefaultUID off
LDAP DefaultQuota false,hard,10485760,0,0,0,0,0
QuotaLimitTable LDAP :
             
  • LDAP Server задаёт ip-адрес сервера LDAP.

  • LDAP Users задаёт имя базы данных в LDAP сервере, где находятся пользователи.

  • LDAP BindDN задаёт учётную запись администратора базы данных LDAP.

  • LDAP DefaultGID задаёт gid номер по умолчанию.

  • LDAP DefaultUID задаёт uid номер по умолчанию.

  • LDAP DefaultUID задаёт квоту ProFTPD по умолчанию.

  • QuotaLimitTable LDAP указывает, что квоту нужно брать из LDAP сервера.

Также здесь прописана директива DefaultRoot ~ Она нужна, чтобы пользователи не поднимались выше своих домашних директорий.

После настройки необходимые файлы создаются командой:

ftpquota --create-table --type=tally --units=Mb --table-path=/var/log/ftpquota.tally

Затем перезапускается FTP-сервер /etc/init.d/ProFTPD restart.

Создадим директорию ncdata в директории /mnt.

Назначим права на директорию ncdata командой:

chown –R root:NextFTP /mnt/ncdata

Выполним команду для смены пользователя и создания домашней директории пользователя на ProFTPD сервере:

su - Vasya

После этого можно подключиться и проверить FTP квоты, назначенные нами ранее.

Теперь подключимся к серверу ProFTPD и проверим, применилась ли квота:

a2037924f0c5b34f7d1c2e95fed63995.png

Зашли на FTP и квота применилась. Таким методом можно использовать OpenLDAP сервер в качестве центра аутентификации для Nextcloud и ProFTPD.

Спасибо за внимание!

Что ещё интересного есть в блоге Cloud4Y

→ Вирусу Микеланджело — 30 лет

→ Сделайте Linux похожим на Windows 95

→ Как не позволить техническому долгу одолеть вас

→ WD-40: средство, которое может почти всё

→ 30 лучших Python-проектов на GitHub на начало 2022 года

Подписывайтесь на наш Telegram-канал, чтобы не пропустить очередную статью. Пишем только по делу.

© Habrahabr.ru