Что такое код ldap_mod_replace

ldap_mod_replace

(PHP 4, PHP 5, PHP 7)

ldap_mod_replace — Replace attribute values with new ones

Description

Replaces one or more attributes from the specified dn . It performs the modification at the attribute level as opposed to the object level. Object-level modifications are done by the ldap_modify() function.

Parameters

The distinguished name of an LDAP entity.

Return Values

Returns TRUE on success or FALSE on failure.

Notes

See Also

  • ldap_mod_del() — Delete attribute values from current attributes
  • ldap_mod_add() — Add attribute values to current attributes

User Contributed Notes

If you do not wish to set up SSL on your active directory, and you are running on Windows, you can use COM and ADSI to set the new password for a user, or to active a user:

// to set a user password
// server is the ldap server
// newuser_dn is the full dn of the user you want to modify
// newuser_password is the password you wish to set for the user

$ADSI = new COM ( «LDAP:» );
$user = $ADSI -> OpenDSObject ( «LDAP://» . $server . «/» . $newuser_dn , $adminuser , $adminpassword , 1 );
$user -> SetPassword ( $newuser_password );
$user -> SetInfo ();

// to activate a user
$ADSI = new COM ( «LDAP:» );
$user = $ADSI -> OpenDSObject ( «LDAP://» . $server . «/» . $newuser_dn , $adminuser , $adminpassword , 1 );
$user -> AccountDisabled = false ;
$user -> SetInfo ();

Here’s an easy way to encode AD «unicodepwd» values from linux.

Then write something like this.
function ADUnicodePwdValue ( $plain_txt_value )
<
return str_replace ( «\n» , «» , shell_exec ( «echo -n ‘\»» . $plain_txt_value . «\»‘ | recode latin1..utf-16le/base64» ));
>

$user [ «unicodepwd» ] = ADUnicodePwdValue ( «my_password» );

?>

[EDITOR thiago NOTE: The following text was sent by boyvanderlaak at gmail dot com as an important complement]

if you do not have access to your linux box but have Multibyte String enabled you could try the following for AD 2008:

[ «unicodePwd» ] = mb_convert_encoding ( ‘»‘ . $newPassword . ‘»‘ , ‘utf-16le’ );
?>

You can use arrays for multiple attributes example:

[ mail ] = array( «example@example.com» , «example2@example.com» );
$results = ldap_mod_add ( $ldapConnID , $dn , $entry );
?>
or as i did for creating anew user:
[ «objectClass» ] = array( «top» , «person» , «organizationalPerson» , «user» );
?>

Here is some great information from the OpenLDAP FAQs regarding changing a userPassword attribute with PHP:

$userpassword = «» . base64_encode( pack( «H*», sha1( $pass ) ) );

this can not be used to change a password on an AD server that requires you to send the old and new password.

in order to do this use on shuts an sever make an admin-account that allows to change other ppl pw without suppling the old password first.

To modify an attribute with a single value:
$entry[mail] = «newmail@aelana.com»;
$results = ldap_mod_add($ldapConnID,$dn, $entry);

To modify an attribute with multiple values:
$entry[mail][] = «newmail@aelana.com»;
$entry[mail][] = «altnewmail@aelana.com»;
$results = ldap_mod_add($ldapConnID,$dn, $entry);

To modify multiple attributes
$entry[mail][] = «newmail@aelana.com»;
$entry[mail][] = «altnewmail@aelana.com»;
$entry[c] = «US»;
$results = ldap_mod_add($ldapConnID,$dn, $entry);

Before you modify values in your ldap directory, first make sure that you have permission to do so. In openldap adding the following acl in slap.conf will allow the user to modify their own userpassword.

access to attr=userPassword
by self write
by anonymous auth
by * none

Changing a user password in Active Directory.
Securely connect (using ldaps) to the Active Directory and bind using an administrator account.

In this example, $userDn contains the dn of the user I want to modify, and $ad is the Active Directory ldaps connection)

$newPassword = «MyPassword»;
$newPassword = «\»» . $newPassword . «\»»;
$len = strlen($newPassword);
for ($i = 0; $i

LDAPModA structure

The LDAPMod structure holds data required to perform a modification operation.

Syntax

Members

Specifies one of the following values to indicate the modification operation to perform.

You can use the bitwise OR operator to combine the operation value with LDAP_MOD_BVALUES to indicate that the mod_vals union uses the modv_bvals member. If LDAP_MOD_BVALUES is not set, the union uses the modv_strvals member.

LDAP_MOD_ADD (0x00)

Adds a value to the entry. The supplied values are appended to the existing values in the attribute.

LDAP_MOD_DELETE (0x01)

Deletes a value in the entry. The supplied values are deleted from the current attribute values.

LDAP_MOD_REPLACE (0x02)

Replaces a value in the entry. The supplied values replace the existing attribute values.

Pointer to a null-terminated string that specifies the name of the attribute to modify.

Pointer to an array of values, if any, to add, delete, or replace. If mop_op does not include the LDAP_MOD_BVALUES flag, the modv_strvals member is a pointer to an array of null-terminated strings. If mop_op includes LDAP_MOD_BVALUES, the modv_bvals member is a pointer to an array of berval pointers, which is useful for specifying binary values.

Pointer to a null-terminated array of null-terminated strings. The last element of the array must be a NULL pointer.

Pointer to a NULL-terminated array of berval pointers. The last element of the array must be a NULL pointer.

Remarks

Assign values to the fields of the LDAPMod structure before you call a modification function ( ldap_add*, or ldap_modify*).

ldap_modify* with the LDAP_MOD_REPLACE operation does not delete an attribute when passed a null pointer. However, LDAP_MOD_DELETE deletes the entire attribute when mod_vals is set to NULL.

When passing a LDAPMod structure into the ldap_add* functions, only the LDAP_MOD_BVALUES flag is significant. Creating a new object implies adding values to it.

Что такое код ldap_mod_replace

721 просмотра

1 ответ

1 Репутация автора

Я пытаюсь создать портал самообслуживания на своем сервере OpenLDAP, чтобы пользователи могли обновлять свою запись GECOS, номер телефона и т. Д. Они НЕ будут обновлять свой пароль в соответствии с требованиями.

Проблема в том, что я не могу обновить какие-либо атрибуты на сервере LDAP. Я использую вызов PHP ldap_mod_replace с допустимым DN (корневым административным DN прямо сейчас), чтобы обновить эти атрибуты. Я получаю ошибку:

(53) Сервер не хочет выполнять

Привязка успешна к серверу. Используя тот же DN привязки, я могу обновить любой атрибут, который захочу, используя сторонний инструмент (JXplorer).

Вот фрагмент точного кода, где выполняется обновление, отредактированное для защиты IP:

После вызова этой функции я проверяю на наличие ошибки снаружи, именно так я и попал сюда с сообщением об ошибке.

Я все еще пробовал эти решения, но безрезультатно. Что здесь не так?

Ответы (1)

плюса

646 Репутация автора

ldap_mod_replace Следует использовать , чтобы изменить значение или несколько значений для одного единственного атрибута типа только. Вы должны использовать ldap_modify для обновления нескольких типов атрибутов в одной операции изменения LDAP.

Руководство, вероятно, несколько сбивает с толку, так как ldap_mod_replace принимает аргумент, который заставляет вас верить, что изменение нескольких типов атрибутов с помощью этого метода разрешено. Это не так.

PHP Предупреждение: ldap_mod_replace (): Изменить: Сервер не желает выполнять в

Ниже мой код, но получаю сообщение об ошибке, как:
PHP Warning: ldap_mod_replace(): Modify: Server is unwilling to perform in

Вот код:

Не уверен, что пошло не так в коде выше, может кто-нибудь, пожалуйста, разобраться в этом и скажите мне, как решить эту проблему?

Server is unwilling to perform означает, что вы не являются обязательными, как пользователь с достаточными правами на это действие.

Илон Маск рекомендует:  EncodeDateTime - Функция Delphi

Это вопрос контроля учетных данных / доступ с LDAP не обязательно кодом.

ldap_mod_replace () [function.ldap-мод-заменить]: Изменить: Сервер не желает выполнять

November 2020

13.5k раз

при изменении unicodePwd в AD через PHP. Тем не менее, я могу искать, добавлять, удалять и изменять любые атрибуты пользователей.

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

Вот код, я использую:

2 ответы

Есть целый ряд вещей, которые вы должны получить именно право установить пароль в AD через LDAP.

вам нужно использовать соединение SSL (LDAPS: //)

пароль должен быть заключен в кавычки

(цитируем) пароль должен быть закодирован в 16-битной кодировке Unicode (UTF-16LE)

Если предположить , что пароль , который вы пытаетесь установить это обычные символы ASCII, преобразование юникода может быть достигнуто путем добавления \ 000 байт после каждого байта строки ASCII, как показано в этом примере кода .

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

После поиска много и тратить много времени, я наконец-то смог изменить активный каталог пароля пользователя из PHP кода с использованием библиотеки LDAP.

Нам необходимо подключение к LDAP — с активным сервером каталогов из кода PHP; и что вы должны изменить unicodePwd поле.

Ошибка в привязке к LDAP (ldap_bind) при использовании SSL-соединения?

Всем доброго дня!

Столкнулся с проблемой при бинде к LDAP (Active Directory на Windows 2008 сервере) при использовании SSL-соединения (ldaps://. ).
При выполнении следующего кода:

на строке с функцией ldap_bind выдает ошибку:

Если вместо ldaps:// использовать ldap://, то есть, незащищенное соединение, то этот же код выполняется без ошибок.

Мне критично использовать именно SSL-соединение, так как оно, судя по всему, необходимо для смены пароля пользователя LDAP посредством задания параметра unicodePwd функцией ldap_mod_replace.

Или, возможно, есть иной способ смены пароля в AD, помимо вышеописанного?

Что такое код ldap_mod_replace

The LDAPMod structure holds data required to perform a modification operation.

Syntax

Members

Specifies one of the following values to indicate the modification operation to perform.

You can use the bitwise OR operator to combine the operation value with LDAP_MOD_BVALUES to indicate that the mod_vals union uses the modv_bvals member. If LDAP_MOD_BVALUES is not set, the union uses the modv_strvals member.

LDAP_MOD_ADD (0x00)

Adds a value to the entry. The supplied values are appended to the existing values in the attribute.

LDAP_MOD_DELETE (0x01)

Deletes a value in the entry. The supplied values are deleted from the current attribute values.

LDAP_MOD_REPLACE (0x02)

Replaces a value in the entry. The supplied values replace the existing attribute values.

mod_type

Pointer to a null-terminated string that specifies the name of the attribute to modify.

mod_vals

Pointer to an array of values, if any, to add, delete, or replace. If mop_op does not include the LDAP_MOD_BVALUES flag, the modv_strvals member is a pointer to an array of null-terminated strings. If mop_op includes LDAP_MOD_BVALUES, the modv_bvals member is a pointer to an array of berval pointers, which is useful for specifying binary values.

modv_strvals

Pointer to a null-terminated array of null-terminated strings. The last element of the array must be a NULL pointer.

modv_bvals

Pointer to a NULL-terminated array of berval pointers. The last element of the array must be a NULL pointer.

Remarks

Assign values to the fields of the LDAPMod structure before you call a modification function ( ldap_add*, or ldap_modify*).

ldap_modify* with the LDAP_MOD_REPLACE operation does not delete an attribute when passed a null pointer. However, LDAP_MOD_DELETE deletes the entire attribute when mod_vals is set to NULL.

When passing a LDAPMod structure into the ldap_add* functions, only the LDAP_MOD_BVALUES flag is significant. Creating a new object implies adding values to it.

Requirements

Minimum supported client

Minimum supported server

Windows Server 2008

Unicode and ANSI names

ldapmodW (Unicode) and ldapmodA (ANSI)

Some name

I am in the process of writing an Active Directory password reset page for users who have forgotten their password at some point. I am connecting and binding as an administrative user and attempting to use the ldap_mod_replace function to change the unicodePwd attribute for a specific test user. I have tried multiple ways of going about this, and each time, I can connect fine, the user binds correctly, but once I reach the ‘replace’ function, I get an ldap_error[‘Server is unwilling to perform’]. I cannot figure out what the next step should be in trying to get this working. Any help/speculation would be appreciated. Here’s my source code.

«»;
$ldap = ldap_connect($ldapserver);
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
/** Test connection by using anonymous bind **/
echo «»Userid anonymous bind to server
«»;
ldap_bind($ldap);
if (ldap_errno($ldap) !== 0)
<
exit(‘Could not connect to LDAP server — ‘.ldap_error($ldap));
>
/** Now try to bind with the username and password **/
echo «»Now binding using user info
«»;
ldap_bind($ldap, $userbindDN, $userbindPass);
if (ldap_errno($ldap) !== 0)
<
exit(‘ERROR: User ID/Password Invalid — ‘.ldap_error($ldap));
>
/** We got this far, let’s bind with an admin user **/
echo «»Now binding using admin info
«»;
ldap_bind($ldap, $authbindDN, $authbindPass);
if (ldap_errno($ldap) !== 0)
<
exit(‘ERROR: Unable to bind with admin user info — ‘.ldap_error($ldap));
>
$searchResults = ldap_search($ldap, $baseDN, ‘CN=’.$uid);
// no matching records
$info = ldap_get_entries($ldap, $searchResults);
if ($searchResults === false)
<
exit(‘User ($uid) not found in AD’);
>
if (!is_resource($searchResults))
<
exit(‘Error in search results.’);
>
$entry = ldap_first_entry($ldap, $searchResults);
if (!is_resource($entry))
<
exit(‘Couldn\’t get entry’);
>
$userDn = ldap_get_dn($ldap, $entry);
// Check Pwds not really used in this script but.
if ($passwd1 == $passwd2) <
// prepare data
$newPassword = $passwd1;
$newPassword = «»\»»»» . $newPassword . «»\»»»»;
$len = strlen($newPassword);
for($i = 0; $i

«»;
echo «»Username = «».$uid.»»
«»;
echo «»User login
«»;
echo «»User DN = $userDn
«»;
$result = ldap_mod_replace($ldap, $userDn , $userdata);
pr2($result);
if($result)
<
echo «»User modified!
«» ;
>else <
echo «»There was a problem!
«»;
echo ldap_error($ldap).»»
«»;
>
/** Now try to bind with the username and new password to insure change**/
echo «»Now testing new password to insure change
«»;
ldap_bind($ldap, $userbindDN, $passwd1);
if (ldap_errno($ldap) !== 0)
<
exit(‘ERROR: User ID/Password Invalid — ‘.ldap_error($ldap));
>else <
echo «»Password Verified OK. Password change complete
«»;
>
>
?>

Изменение пароля пользователя php ldap ldap_modify ldap_mod_replace

Какую функцию я должен использовать, когда пользователь хочет изменить свой пароль в активной директории, используя php?

Они будут привязываться к серверу с помощью своего текущего имени пользователя и пароля, а затем вводить новый пароль для внесения этого изменения.

Я использовал ldap_mod_replace раньше, но мне пришлось использовать учетную запись AD с более высокими привилегиями, чтобы заменить их пароль новым.

Я также попробовал ldap_modify, но он сказал, что у пользователя были неверные учетные данные, хотя пользователь и пароль связаны.

* Новые пароли закодированы правильно.

1 ответ

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

Пароли меняются через LDAP одним из двух способов:

  • передать запрос на изменение на сервер
  • передать расширенный запрос на изменение пароля на сервер (требуется текущий пароль)

Запрос на изменение имеет следующие параметры: различающееся имя для изменения и список изменений. Единственное соединение, которое запрос на изменение имеет к текущему состоянию аутентификации соединения, — это разрешение выдавать запрос на изменение серверу (современные серверы каталогов профессионального качества могут запрещать операции по состоянию аутентификации соединения) и является ли состояние аутентификации разрешено изменять запись, идентифицированную отличительным именем (которое может отличаться от состояния аутентификации). запросы на изменение не приводят к «неверным учетным данным», только запросы на привязку (которые устанавливают состояние аутентификации соединения) могут привести к «недействительным учетным данным». Если состоянию аутентификации не разрешено изменять свой собственный пароль, то должно использоваться состояние аутентификации с этими разрешениями.

LDAP. Настройка отказоустойчивого LDAP сервера

В этой статье я расскажу вам о сервере службы каталогов 389 Directory Server (он же Fedora Directory Server, он же Redhat Directory Server). Так уж повелось, что для доступа к серверу каталогов используется протокол LDAP. Если вы не работали с LDAP, я очень рекомендую ознакомиться со статьями в Wikipedia (тут про cлужбу каталогов, а тут про протокол LDAP).

Илон Маск рекомендует:  Что такое код zip_entry_open

Итак, сначала кратко о том, зачем же вообще использовать сервер службы каталогов (далее — LDAP-сервер). LDAP-сервера, в основном, применяются для централизованного хранения учетных записей, и всего, что с ними связано. LDAP-сервер представляет собой иерархическую БД, а значит в нем можно хранить любые данные.

Казалось бы, вполне логичен вопрос: а почему именно LDAP? Что мешает хранить учетные записи в MySQL или PostgreSQL? Ответ очевиден — ничего =)

Но над любой RDBMS служба каталогов обладает целым рядом преимуществ:

  • Это стандарт. Многие приложения поддерживают аутентификацию/авторизацию через LDAP;
  • Данные хранятся как иерархическое дерево, что позволяет делать эффективные операции поиска, выделив нужную часть дерева;
  • Число операций чтения в тысячи раз превышают число операций записи, в связи с этим появляется огромное число плюсов: нет необходимости применения транзакций и rollback’ов, репликация работает без проблем, которые присущи RDBMS;
  • Приложение должно видеть одну и ту же информацию на всех серверах службы каталогов, если сервер не хранит информацию, нужную клиентскому приложению, он может сам запросить ее у другого сервера или перенаправить само приложение к другому серверу;
  • Из-за описанных выше свойств службы каталогов, этот сервис отлично масштабируется горизонтально.

Выбор сервера службы каталогов пал на 389 Directory Server. История этого LDAP сервера тесно связана с компанией Netscape (если интересно, почитать историю можно тут).

Ключевые особенности этого LDAP-сервера:

  • Мультимастер репликация. На все сервера, участники MM-репликации, можно записывать данные одновременно, причем конфликты репликации разрешаются автоматически благодаря ведению changelog базы и системе автоматического разрешения конфликтов. MM-репликацию можно комбинировать с master-slave и каскадной репликацией, благодаря чему можно получить гибкий и масштабируемый сервис. Так же поддерживается частичная репликация, что крайне полезно, если мы не хотим, чтобы некоторые данные присутствовали на реплике;
  • Мощный механизм ACL. С помощью ACL можно указать кому, когда, на каком LDAP-сервере, с каким атрибутом и какое действие выполнять. ACL хранится вместе с данными как операционные атрибуты, благодаря этому для них, как и для других данных, работают операции репликации и резервного копирования.
  • Синхронизация с Microsoft Active Directory. Поддерживается двунаправленная синхронизация пользователей, групп и паролей (для синхронизации паролей из AD в 389-ds необходимо поставить специальный софт на каждый контроллер домена)
  • SSL/TLS. Простой поддержкой SSL/TLS сейчас никого не удивишь. 389-ds поддерживает аутентификацию/авторизацию на основании SSL-сертификатов. Так же есть возможность шифрования атрибутов при записи на диск. При ручном вводе ключа при запуске сервера это может защитить от утечки данных путем копирования файлов с БД.
  • Управление сервером через протокол LDAP. Сервер поддерживает конфигурацию путем изменения атрибутов в cn=config, большинство параметров применяются без перезагрузки сервера. Так же на сервере можно запускать резервное копирование/восстановление и другие task-и путем добавления новой записи в cn=tasks,cn=config.
  • Plugins. Весь функционал реализован в виде plugin-ов (MM-репликация, синхронизация с AD, ACL, и т.п.). Написать и добавить свой plugin довольно легко, т.к. имеется хорошая документация с примерами.

После обзора возможностей 389 Directory Server познакомимся поближе с его структурой.

Общая структура 389 Directory Server

389 DS состоит из нескольких компонентов.

  • Сам сервер каталогов. Это приложение ns-slapd, именно этот процесс принимает и обрабатывает запросы от клиента, производит репликацию, читает и записывает данные в базу, передает управление плагинам, и т.д.
  • Сервер администрирования (Administration Server). Он управляет сервером каталогов. Сервер предоставляет интерфейс управления через протокол HTTP(S), так же предоставляет веб-интерфейс для просмотра логов и статуса репликации. Физически это apache + модули для управления ns-slapd.
  • Консоль администрирования. Java-приложение, которое подключается к серверу администрирования и позволяет настраивать сервер каталогов через удобный интерфейс. Есть версия под windows и linux, под mac os работает через проброс X-сессии с linux-машины.

Сначала я хотел написать теоретическую и практическую части отдельно, но потом стало ясно, что первая часть стала бы слишком скучной, а вторая слишком сухой. Поэтому сразу за куском теории будет идти практическое применение.

Итак, задача. Необходимо настроить отказоустойчивый сервис службы каталогов. Для этого настроим два сервера, настроим multimaster-репликацию между ними и поднимем перемещающийся IP-адрес (pacemaker + openais).

Если один из серверов станет недоступен, другой возьмет на себя этот IP и сервис продолжит работу.

После восстановления сервера данные будут реплицированы на него и IP-адрес переключится обратно на LDAP00, или же, в зависимости от настройки кластера, останется на LDAP01.

На одном сервере может быть несколько изолированных инстансов ns-slapd со своими настройками, схемой, правилами репликации и т.д. Чтобы иметь возможность управлять этими инстансами из консоли управления на каждом сервере должен стоять сервер Administration Server (далее admin server). admin server сам нуждается в одном инстансе LDAP сервера, поскольку хранит там run-time конфигурацию. По умолчанию конфигурация admin server хранится вместе с пользовательскими данными, но я считаю это небезопасным, поэтому у нас будет два инстанса на каждом сервере: один будет содержать конфигурацию для admin server-а, а второй данные. В такой схеме в случае отказа одной из нод сохраняется не только работоспособность LDAP-сервиса, но и возможность управления им.

Для нашего сервиса службы каталогов мы используем два сервера ldap00 и ldap01. На каждом из них будут установлены два инстанса LDAP сервера, один для нужд admin server-ов, второй для наших данных.
План установки будет такой:

  1. Установка первого сервера на ldap00;
  2. Настройка репликации на ldap00;
  3. Установка и настройка ldap инстанса на ldap01;
  4. Установка admin server-а на ldap01;
  5. Установка и настройка ldap инстансов для хранения пользовательских данных.

Установка первого сервера на ldap00

Готовые rpm собраны в репозитории EPEL для Centos, RHEL и Fedora Core. Если у вас одна из этих систем — подключите репозиторий EPEL и выполните установку через yum.

Мы используем SLES, поэтому нам пришлось собирать все пакеты под эту систему в нашем OpenSUSE Build Service. Если у вас debian/ubuntu — прочтите этот документ.

Вместе с 389 DS идет набор perl скриптов, которые используются для установки инстансов сервера.

Вот некоторые из них:

  • setup-ds.pl — устанавливает инстанс LDAP-сервера, сервер создается не подключенным к admin server-у;
  • setup-ds-admin.pl — устанавливает admin server, при необходимости устанавливает инстанс LDAP-сервера для хранения своей конфигурации;
  • register-ds-admin.pl — подключает инстанс к admin server-у, при необходимости устанавливает admin server;
  • remove-ds.pl — удаляет инстанс;
  • remove-ds-admin.pl — удаляет admin server и все инстансы;
  • dsktune — выводит параметры системы, которые нужно изменить, чтобы добиться большей производительности.

Для начала запустим dsktune:

# dsktune
389 Directory Server system tuning analysis version 10-AUGUST-2007.

NOTICE: System is x86_64-unknown-linux2.6.27.42-0.1-xen (1 processor).

NOTICE: The net.ipv4.tcp_keepalive_time is set to 7200000 milliseconds
(120 minutes). This may cause temporary server congestion from lost
client connections.

WARNING: There are only 1024 file descriptors (hard limit) available, which
limit the number of simultaneous connections.

WARNING: There are only 1024 file descriptors (soft limit) available, which
limit the number of simultaneous connections.

Утилита написала о системных параметрах, которые нужно подкрутить. В моем случае это net.ipv4.tcp_keepalive_time и лимит открытых файлов.

tcp_keepalive_time — это время от последнего посланного пакета до первой посылки keepalive. При большом значении, если клиент «умер», соединение останется открытым долгое время (по умолчанию 120 минут). Установим это значение в 10 минут.

echo 600 > /proc/sys/net/ipv4/tcp_keepalive_time

Добавим в /etc/sysctl.conf:

для увеличения лимита открытых файлов добавляем в /etc/security/limits.conf:

запускаем еще раз dsktune и убедимся, что у нас все готово для установки.

Теперь запускаем скрипт setup-ds-admin.pl
Нас спросят, хотим ли мы установить 389 Directory и Administration Server, согласны ли мы с лицензией, еще раз запустят dsktune и, наконец, появится меню выбора типа установки.

1. Express
Allows you to quickly set up the servers using the most
common options and pre-defined defaults. Useful for quick
evaluation of the products.

Илон Маск рекомендует:  Как изменить вид тега optgroup через стили

2. Typical
Allows you to specify common defaults and options.

3. Custom
Allows you to specify more advanced options. This is
recommended for experienced server administrators only.

To accept the default shown in brackets, press the Enter key.

Choose a setup type [2]:

Выбираем третий пункт (мы же experienced server administrators =) )

Далее будет предложено указать FQDN и имя/группу, от которого(ой) будет запускаться LDAP-сервер.

If you do not yet have a configuration directory server, enter ‘No’ to
be prompted to set up one.

Do you want to register this software with an existing
configuration directory server? [no]:

Тут нас спрашивают, хотим ли мы использовать существующий сервер каталогов для сохранения информации о сервере. Так как это наш первый сервер, отвечаем No.

Далее идут вопросы об admin server-е: administrator ID, пароль, Administration Domain, ответы на них оставляем по умолчанию (кроме пароля).

Затем надо будет указать, какой порт будет слушать LDAP-сервер. Мы договорились, что это инстанс, который хранит лишь конфигурацию для admin server-а, поэтому пересаживаем его на порт 6389. Далее указываем Directory server identifier. Назовем свой инстанс config-instance. На вопрос о суффиксе корневого дерева отвечаем по умолчанию, корневого дерева в этом инстансе не будет, так что его потом можно удалить.

Затем нас ждет вопрос о Directory Manager DN.

Directory Manager — это пользователь с правами root-а в LDAP-сервере. У каждого инстанса есть свой локальный Directory Manager.

Далее следуют вопросы о пароле к Directory Manager-у, хотим ли мы поставить примеры записей в наш root suffix и хотим ли мы заполнить наш новый инстанс какими-нибудь данными, спросят имя порта, IP-адрес и имя пользователя от которого admin server будет работать. После этого последний раз спросят подтверждение и начнут установку.

Настройка репликации на ldap00

Для подключения к серверу нужно поставить и запустить консоль управления 389-console.

В качестве Adminstration URL нужно ввести адрес admin server-а и порт который вы указали при установке.

Далее мы попадаем в панель управления серверами. У нас сейчас только один инстанс, выберем его.

Из консоли управления удаляем суффикс dc=edu,dc=scalaxy,dc=local

У нас остался всего один суффикс и база, в которой находятся конфигурационные данные для admin server-а.

Теперь немного теории о принципах репликации.

В репликации участвуют два типа серверов, supplier и consumer.

supplier — сервер, который копирует реплику на другой сервер.

обязанности supplier сервера:

  • отвечать на запросы клиентов на чтение и запись;
  • поддержание информации о состоянии изменений реплики;
  • инициализация репликации на consumer сервера.

supplier сервер должен быть всегда доступен, поскольку запись производится только на этом сервере, а потом реплицируется на другие севера.

Если связь с supplier сервером будет потеряна, то запись в каталог станет невозможна.

consumer — сервер, который сохраняет реплику с другого сервера. В случае с мультимастер репликацией, два сервера одновременно являются supplier-ом и consumer-ом.

consumer должен:

  • отвечать на read запросы клиентов;
  • пересылать запросы на обновления данных на сервер;
  • при получении запроса на добавление, удаление или обновления записи, запрос пересылается на supplier сервер.

Каждый supplier сервер имеет свой changelog, в котором хранится информация обо всех изменениях, которые произошли на реплике.

Supplier сервер повторяет эти изменения на каждом consumer сервере.

Теперь, когда мы немного подкованы теоретически, можно настраивать мультимастер репликацию инстанса с конфигурацией.

Ведение changelog-а изменений по умолчанию выключено, включается он во вкладке Replication. Changelog включается для всех баз одновременно.

Дальше включаем репликацию для базы NetscapeRoot. Необходимо указать Replica ID и Supplier DNs.

Supplier DN — это имя пользователя, которому разрешено выполнять репликацию на LDAP-сервере. Такого пользователя нужно создать на всех LDAP-серверах, которые участвуют в мультимастер репликации.

Быстрее всего это сделать через утилиту ldapmodify. Эта утилита позволяет модифицировать данные в LDAP в интерактивном режиме или брать команды из ldif файла.

ldapmodify -h 127.0.0.1 -p 6389 -x -D «cn=root» -W
Enter LDAP Password:
dn: cn=replication manager,cn=config
changetype: add
objectClass: inetorgperson
objectClass: person
objectClass: top
objectClass: organizationalPerson
cn: replication manager
sn: RM
userPassword:

Ответ должен быть
adding new entry «cn=replication manager,cn=config»

Итого, у нас получилось:

Сразу же создадим Replication Agreement для второго сервера. В контекстном меню для базы NetscapeRoot выбираем New Replication Agreement и заполняем аналогичным образом:

Нас предупредят, что подключение к серверу невозможно (так как его еще нет), доходим до последнего пункта, ставим Do not initialize consumer.

Установка и настройка ldap инстанса на ldap01

Теперь нужно настроить второй LDAP-сервер. С ним несколько иначе, т.к. установка admin server-а должна уже происходить в установленный LDAP-сервер и первичную настройку мы будем производить из консоли с помощью утилиты ldapmodify (что является нехилым плюсом, если стоит задача разобраться, как же работает этот сервер каталогов).

Сначала на втором сервере с помощью скрипта setup-ds.pl нужно создать инстанс, который не управляется admin server-ом.

Ответы на вопросы скрипта аналогичны предыдущим.

После установки LDAP-сервера подключаемся к нему через ldapmodify и настраиваем.

Подключение производится примерно так:

ldapmodify -h 127.0.0.1 -p 6389 -D «cn=root» -W

dn: cn=changelog5,cn=config
changetype: add
objectclass: top
objectclass: extensibleObject
cn: changelog5
nsslapd-changelogdir: /var/lib/dirsrv/slapd-ldap01/changelogdb

changelogdir должен указывать на директорию с названием вашего инстанса.

2) добавляем пользователя replication manager:

dn: cn=replication manager,cn=config
changetype: add
objectClass: inetorgperson
objectClass: person
objectClass: top
objectClass: organizationalPerson
cn: replication manager
sn: RM
userPassword:

20380119031407Z означает, что срок действия пароля не ограничен.

3) Создаем суффикс netscaperoot:

dn: cn=»o=netscaperoot»,cn=mapping tree,cn=config
changetype: add
objectclass: top
objectclass: extensibleObject
objectclass: nsMappingTree
nsslapd-state: backend
nsslapd-backend: NetscapeRoot
cn: «o=netscaperoot»

4) Создаем базу для суффикса netscaperoot:

dn: cn=NetscapeRoot,cn=ldbm database,cn=plugins,cn=config
changetype: add
objectclass: extensibleObject
objectclass: nsBackendInstance
nsslapd-suffix: o=netscaperoot

Кстати, 389 DS по умолчанию для хранения записей каталога использует модифицированную версию нереляционной базы данных Berkeley DB. Если есть желание, подробнее вы можете прочитать тут.

5) Создаем корневой o=NetScapeRoot:

dn: o=NetscapeRoot
changetype: add
objectClass: organization
objectClass: top
o: NetscapeRoot

6) Разрешаем репликацию для o=netscaperoot:

dn: cn=replica,cn=»o=netscaperoot», cn=mapping tree, cn=config
changetype: add
objectClass: nsDS5Replica
objectClass: top
nsDS5ReplicaId: 2
nsDS5ReplicaRoot: o=netscaperoot
cn: replica
nsDS5Flags: 1
nsDS5ReplicaBindDN: cn=replication manager,cn=config
nsds5ReplicaChangeCount: 0
nsds5ReplicaPurgeDelay: 604800
nsDS5ReplicaType: 3

Не забываем изменить nsDS5ReplicaId на номер вашего сервера (nsDS5ReplicaType — тип репликации, 3 — multimaster).

На данном этапе у нас уже есть настроенная репликация в одну сторону с ldap00 на ldap01.

Последним этапом будет:

7) Настройка репликации от ldap01 на ldap00:

dn: cn=Multimaster replication, cn=replica, cn=»o=netscaperoot», cn=mapping
tree, cn=config
changetype: add
objectClass: top
objectClass: nsDS5ReplicationAgreement
cn: Multimaster replication
description: replication for netscaperoot
nsDS5ReplicaBindDN: cn=replication manager,cn=config
nsDS5ReplicaBindMethod: SIMPLE
nsds5replicaChangesSentSinceStartup:
nsDS5ReplicaCredentials:

nsDS5ReplicaHost: ldap00.edu.scalaxy.local
nsDS5ReplicaPort: 6389
nsDS5ReplicaRoot: o=netscaperoot
nsDS5ReplicaTransportInfo: LDAP
nsds5replicaUpdateInProgress: FALSE

nsDS5ReplicaBindDN — имя пользователя, от имени которого будет производится репликация
nsDS5ReplicaCredentials — пароль

8) Первичная инициилизация репликации с ldap00 на ldap01:

На первом сервере выполняем эту команду:
dn: cn=Multimaster replication,cn=replica,cn=»o=netscaperoot»,cn=mapping tree,cn=config
changetype: modify
replace: nsds5beginreplicarefresh
nsds5beginreplicarefresh: start

Эта команда реплицирует данные с ldap00 на ldap01, эта операция обязательна, тк на втором сервер сейчас пустой o=netscaperoot.

Теперь мы имеем полностью реплицируемые каталоги с конфигурацией admin server-а.

Установка admin server-а на ldap01

Нужно поднять admin server на втором сервере. Запускаем скрипт register-ds-admin.pl

Когда нам предложат указать Configuration directory server URL, вводим LDAP URL второго сервера ldap://ldap01.edu.scalaxy.local:6389/o=NetscapeRoot

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

Установка и настройка ldap инстансов для хранения пользовательских данных

Теперь подключаться через консоль управления можно к любому admin server-у.

На каждом из серверов в Server Group создаем новый инстанс LDAP server-а, это будет LDAP-server, в котором мы будем хранить наши данные.

Настраиваем мультимастер репликацию между двумя инстансами по тому же принципу (теперь вы можете настроить репликацию как через GUI, так и через консоль).

Поздравляю! Вы настроили отказоустойчивый сервис службы каталогов! Далее нужно настроить openais+pacemaker, чтобы исключить простои в работе сервиса.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL