Структура хранения данных в Calculate Directory Server

Основным хранилищем данных Calculate Directory Server является LDAP сервер openldap. Данные в LDAP организованы в виде древовидной структуры узлов хранения, начальный узел называется базовым. Каждый узел имеет уникальное имя Distinguished Name сокращенно DN, DN обязательно содержит имя базового узла. Например если базовый узел называется dc=calculate, то ou=Services,dc=calculate - будет узлом отходящим от базового узла.

Каждый узел содержит в себе именованные атрибуты. Обратившись к узлу и указав название атрибута можно получить его значение. Например чтобы получить адрес электронной почты пользователя test достаточно обратиться к атрибуту mail узла пользователя.

Пример получения почтового адреса пользователя: DN uid=test,ou=Users,ou=Unix,ou=Services,dc=calculate, атрибут mail. Каждый узел имеет правила по которым он будет создан, эти правила прописываются в специальных атрибутах классах. Классы и наборы классов определены в файлах схем которые находятся в директории /etc/openldap/schema. При запуске LDAP сервера он перечитывает файлы схем формируя классы которые затем можно использовать для создания узлов с определенными атрибутами и правилами.

Пример дерева LDAP

Возможные структуры хранения данных пользователя

Структура хранения всех данных пользователя в одном узле

Структура представляет собой ветку (узел) в дереве LDAP в котором находятся узлы пользователей, в каждом из которых находятся все данные одного пользователя.
Пример данной структуры для ftp и unix:

dc=calculate
  ou=FTP,dc=calculate

    Уникальное имя узла пользователя test
    uid=test,ou=Users,dc=calculate
      атрибуты
      cn: Иванов Иван Иванович
      gidNumber: 1000
      homeDirectory: /home/test
      sn: test
      uid: test
      uidNumber: 1000
      userPassword: 111

    уникальное имя узла пользователя test1
    uid=test1,ou=Users,dc=calculate
      cn: Петров Петр Петрович
      gidNumber: 1001
      homeDirectory: /home/test1
      sn: test1
      uid: test1
      uidNumber: 1001
      userPassword: 222

В этом случае домашняя директория и директория ftp совпадают, также совпадает пароль для ftp и пароль для аутентификации в сервисе unix.

Достоинства данной структуры состоят в простоте удаления данных пользователя.

Недостатки состоят в том что невозможно задать разные данные пользователя для разных сервисов. Такие атрибуты как пароль, название группы, ID пользователя и. т. д, имеются в одном экземпляре, это значит что невозможно иметь для разных сервисов разные значения атрибутов, например пароль, директория хранения данных. Возникают проблемы при доступе разных сервисов к одному атрибуту. Например при неправильном функционировании или взломе сервиса имеющего возможность записи в LDAP, возможно удаление или модификация данных не принадлежащих этому сервису. Появляются разнородные записи имеющие разные правила создания и атрибуты в одной ветке, что затрудняет индексацию и поиск, также может возникнуть ситуация, если значения атрибутов пользователя совпадают у разных сервисов в этом случае невозможно определить для какого сервиса был создан пользователь (невозможно удалить пользователя из сервиса), в примере приведена такая ситуация.

Структура хранения данных пользователя с распределением на разные узлы

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

Пример данной структуры для unix и jabber:

dc=calculate
  ou=Unix,dc=calculate

    уникальное имя узла пользователя test для сервиса unix
    uid=test,ou=Unix,dc=calculate
      атрибуты
      cn: Иванов Иван Иванович
      gidNumber: 1000
      homeDirectory: /home/test
      sn: test
      uid: test
      uidNumber: 1000
      userPassword: 111

    уникальное имя узла пользователя test1 для сервиса unix
    uid=test1,ou=Unix,dc=calculate
      cn: Петров Петр Петрович
      gidNumber: 1001
      homeDirectory: /home/test1
      sn: test1
      uid: test1
      uidNumber: 1001
      userPassword: 222

  ou=Jabber,dc=calculate
    уникальное имя узла пользователя test для сервиса Jabber
    uid=test,ou=Jabber,dc=calculate
      cn: test
      departmentNumber: Менеджер
      initials: Yes
      jpegPhoto: binary
      mail: test@jabber.office.ru
      sn: Иванов Иван Иванович
      uid: test1
      userPassword: j111

    уникальное имя узла пользователя test1 для сервиса Jabber
    uid=test1,ou=Jabber,dc=calculate
      cn: test1
      departmentNumber: Менеджер
      initials: Yes
      jpegPhoto: binary
      mail: test1@jabber.office.ru
      sn: Петров Петр Петрович
      uid: test1
      userPassword: j222

Достоинства данной структуры состоят в разделении прав на ветки, каждый сервис работает со своей веткой и не может повредить ветку другого сервиса. Есть возможность иметь разные значения атрибутов, пользователь может иметь разные данные, в том числе пароли, директории, почтовые адреса для каждого сервиса. Эта схема упрощает поиск, индексацию и обработку данных. Возможно перенести данные на другой сервер, простым копированием ветки сервиса, включить репликацию веток отдельно для каждого сервиса.

Недостатком является относительная сложность добавления данных пользователя в разные ветки.

Структура хранения данных в Calculate Directory Server

Для Calculate Directory Server (CDS) используется более универсальная структура с хранением данных пользователей сервисов на разных узлах.

Пример структуры для unix, ftp, jabber:

dc=calculate
  ou=Services,dc=calculate
    ou=Unix,ou=Services,dc=calculate
      ou=Users,ou=Unix,ou=Services,dc=calculate

        Уникальное имя узла пользователя test для сервиса Unix
        uid=test,ou=Users,ou=Unix,ou=Services,dc=calculate
          ....
        уникальное имя узла пользователя test1 для сервиса Unix
        uid=test1,ou=Users,ou=Unix,ou=Services,dc=calculate
          ....
    ou=FTP,ou=Services,dc=calculate
      ou=Users,ou=FTP,ou=Services,dc=calculate

        Уникальное имя узла пользователя test для сервиса FTP
        uid=test,ou=Users,ou=FTP,ou=Services,dc=calculate
          ....
        уникальное имя узла пользователя test1 для сервиса FTP
        uid=test1,ou=FTP,ou=Unix,ou=Services,dc=calculate
          ....
    ou=Jabber,ou=Services,dc=calculate
      ou=Users,ou=Jabber,ou=Services,dc=calculate

        Уникальное имя узла пользователя test для сервиса Jabber
        uid=test,ou=Users,ou=Jabber,ou=Services,dc=calculate
          ....
        уникальное имя узла пользователя test1 для сервиса Jabber
        uid=test1,ou=Users,ou=Jabber,ou=Services,dc=calculate

В структуре хранения введена дополнительная ветка ou=Services,dc=calculate, она необходима для отделения данных сервисов от других служебных данных LDAP структуры. Имеющаяся сложность добавления записей нивелирована использованием фирменных утилит Calculate.

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

cl-useradd -p -c "Иванов Иван Иванович" test unix
cl-useradd -p -c "Петров Петр Петрович" test1 unix
cl-useradd -p test ftp
cl-useradd -p test1 ftp
cl-groupadd Менеджер jabber
cl-useradd -p test jabber
cl-useradd -p test1 jabber

опция -p позволяет задать пароль для пользователя.

Используя bash можно написать простой сценарий добавления или удаления пользователей сразу из всех установленных сервисов.

Для задания пароля пользователя в скрипте используйте опцию -P.
Пример для samba сервиса:

echo "password" | cl-useradd -P user samba

для устаревших утилит (calculate-server < 2.1.11)

echo -e "password\npassword" | cl-useradd -P user samba