Привет, Хабр! На связи Холодаев Алексей, младший системный администратор 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 сервера:

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

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

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

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

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

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

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

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

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

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

Чтобы иметь возможность создавать пользователей с квотами 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 под учёткой администратора. Заходим в пункт Приложения в учётной записи администратора.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 серверу.

Для использования аутентификации 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 прописываем следующие настройки:

<IfModule mod_quotatab.c>
QuotaEngine on
QuotaLock /tmp/quota
QuotaDirectoryTally on
QuotaDisplayUnits Mb
QuotaLog "/var/log/ProFTPD/quota.log"
QuotaShowQuotas on
QuotaTallyTable file:/var/log/ftpquota.tally
</IfModule>
  • Директива 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 задаёт файл таблицы подсчёта для квоты.

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

<IfModule mod_LDAP .c>
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 :
</IfModule>             
  • 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 и проверим, применилась ли квота:

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

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


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

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

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

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

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

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

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

Комментарии (7)


  1. unsignedchar
    21.03.2022 15:47
    +1

    Самое интересное и не упомянули. Какой админпанелью рулить этими дополнительными атрибутами? Как делегировать управление квотами кому то кроме ldap admin?


    1. Cloud4Y Автор
      22.03.2022 11:56

      Я рулил через панель phpldapadmin. Управление пользователями можно делегировать вновь созданному пользователю. Ldif файл будет выглядеть примерно так
      dn: olcDatabase={1}mdb,cn=config
      changetype: modify
      add: olcAccess
      olcAccess: {3}to dn.base="cn=test,dc=domain" by * manager

      где {1}mdb это база данных, test имя пользователя, domain имя домена, manager означает права управления пользователями

      Через список доступа(ACL)


  1. Kirikekeks
    21.03.2022 22:04

    Ну тоже отличный способ. Можно сделать файл user.list (user; group; mail; quota; passwd) и циклом while read line ; do .... < user.list завести и туда и туда, и юзерам разослать сразу же. Но тут кто к чему привык, по мне тащить привычки и навыки из Win мира в linux это дорога к депрессии :-)


  1. 13werwolf13
    22.03.2022 07:28

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

    вот фанатею с таких статей. допустим MDB лучше чем два других предложенных вариантов, но ЧЕМ? аавтор, ты же как-то сделал этот выбор, расскажи!!


    1. Cloud4Y Автор
      22.03.2022 11:23

      Привет!
      Механизм MDB использует библиотеку OpenLDAP Lightning Memory-Mapped Database (LMDB, высокоскоростная отображаемая в памяти база данных). В отличии от BDB и HDB для обеспечения высокой производительности ему не нужен большой кэш-файл.


      1. 13werwolf13
        22.03.2022 11:26

        Вот бы это было в теле статьи, со сравнением производительности и отказоустойчивости.. Эхх..


  1. AlexGluck
    22.03.2022 20:29

    Фтп в 2022, ну сколько можно... Я бы лучше подман ран фриипа сделал, так для сопровождения будет комфортнее.