9. Ограничения


9.1. Введение

Как правило, желательно установить ограничения на то, сколько ресурсов сервера может потребляться каждым клиентом LDAP. OpenLDAP предоставляет два набора ограничений: ограничения по размеру, лимитирующие количество записей, которые клиент может получить за одну операцию, и ограничения по времени, лимитирующие промежуток времени на выполнение операции. Оба типа ограничений могут принимать различные значения в зависимости от того, кем инициирована операция.


9.2. Мягкие и жёсткие ограничения

Администратор сервера может определить как мягкие, так и жёсткие ограничения. Мягкие ограничения можно рассматривать как значения ограничений по умолчанию. Жёсткие ограничения не могут быть превышены непривилегированными LDAP-пользователями.

При запросе поисковых операций клиенты LDAP могут определять свои собственные ограничения по размеру и по времени. Эта возможность существовала еще со времён самых ранних версий X.500.

Если клиент определил ограничение, то наименьшее значение из определённого им и жёсткого ограничения станет фактическим ограничением при выполнении операции.

Если клиент не определил ограничение, тогда сервер применяет мягкое ограничение.

Мягкие и жёсткие ограничения часто рассматриваются вместе как административные ограничения. Поэтому, когда клиент LDAP пытается выполнить поисковую операцию, которая вернёт больше данных, чем позволяют ограничения, он получит ошибку adminLimitExceeded (превышены административные ограничения). Обратите внимание, что сервер обычно возвращает некоторое количество результатов, даже если ограничения превышены: данная возможность полезна клиентам, которые хотят только убедиться в существовании определённых записей и не нуждаются в получении их всех.

На rootdn не накладываются никакие ограничения.


9.3. Глобальные ограничения

Ограничения, определённые в глобальной части конфигурации сервера, выступают в качестве ограничений по умолчанию, которые используются в случае, если для той или иной базы данных не установлены более конкретные ограничения.

В конфигурационном файле slapd.conf(5) применяются директивы sizelimit и timelimit. При использовании механизма манипуляции данными slapd config применяются соответствующие атрибуты olcSizeLimit и olcTimeLimit. В обоих случаях синтаксис этих значений одинаков.

В простой форме записи мягкие и жёсткие ограничения устанавливаются в одно и то же значение:

   sizelimit {<целое число>|unlimited}
   timelimit {<целое число>|unlimited}

Значения по умолчанию: для sizelimit - 500 записей, для timelimit - 3600 секунд.

Расширенная форма позволяет отдельно задавать мягкие и жёсткие ограничения:

   sizelimit size[.{soft|hard|unchecked}]=<целое число> [...]
   timelimit time[.{soft|hard}]=<целое число> [...]

Таким образом, чтобы установить мягкие ограничения по размеру в 10 записей, а жёсткие - в 75 записей, потребуется следующая директива:

  sizelimit size.soft=10 size.hard=75

Ключевое слово unchecked устанавливает ограничение на количество записей, которые рассмотрит сервер после того, как он создал первоначальный набор записей-кандидатов на возвращение в ответ на поисковый запрос с использованием индексов. В больших каталогах это может быть очень важно, поскольку, если ответ на поисковый запрос невозможно найти с помощью индексов, то сервер будет пересматривать миллионы записей. Поэтому всегда старайтесь настроить правильное индексирование.


9.4. Ограничения для отдельной базы данных

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

В конфигурационном файле slapd.conf(5) используется директива limits. При использовании механизма манипуляции данными slapd config применяется соответствующий атрибут olcLimits. В обоих случаях синтаксис этих значений одинаков.

   limits <who> <limit> [<limit> [...]]

Условия limits могут быть указаны несколько раз, чтобы задать разные ограничения для разных сущностей. Сервер проверяет поочерёдно каждое условие, пока не найдёт такое, которое совпадает с сущностью, запросившей операцию. Если соответствие не найдено, применяются глобальные ограничения.

9.4.1. Определение того, на кого накладываются ограничения

Часть <who> условия limits может принимать любое из следующих значений:

Таблица 9.1: Спецификаторы сущностей
СпецификаторСущности
*Все, включая анонимных пользователей и пользователей, прошедших аутентификацию
anonymousАнонимные (не прошедшие аутентификацию) пользователи
usersПользователи, прошедшие аутентификацию
selfПользователь, ассоциированный с целевой записью
dn[.<basic-style>]=<regex>Пользователи, записи которых соответствуют регулярному выражению
dn.<scope-style>=<DN>Пользователи в диапазоне DN
group[/oc[/at]]=<шаблон>Члены группы

Правила спецификации условия <who> аналогичны используемым при контроле доступа.

9.4.2. Определение ограничений по времени

Синтаксис ограничений по времени:

   time[.{soft|hard}]=<целое число>

где <целое число> - количество секунд, которое потратит slapd, отвечая на поисковый запрос.

Если не указано ни одно из ключевых слов soft или hard, значение используется для обоих типов ограничений, например:

   limits anonymous time=27

Значение unlimited может быть использовано, чтобы полностью удалить жёсткое ограничение по времени, например:

   limits dn.exact="cn=anyuser,dc=example,dc=org" time.hard=unlimited

9.4.3. Определение ограничений по размеру

Синтаксис ограничений по размеру:

   size[.{soft|hard|unchecked}]=<целое число>

где <целое число> - максимальное количество записей, которое вернёт slapd, отвечая на поисковый запрос.

Доступные ключевые слова "soft", "hard" и "unchecked" имеют то же самое значение, что и в описанных выше настройках глобальных ограничений.

9.4.4. Ограничение по размеру и постраничный вывод результатов

Если клиент LDAP добавляет к операции поиска элемент управления pagedResultsControl, по умолчанию используются жёсткие ограничения по размеру, поскольку запрос определённого размера страницы считается явным запросом ограничения на количество возвращаемых записей. Однако, ограничение по размеру применяется к общему числу записей, возвращаемых в результате поиска, а не к одной странице.

Для поиска с постраничным выводом результатов можно принудительно установить дополнительные ограничения по размеру.

Ограничение size.pr контролирует максимальный размер страницы:

   size.pr={<целое число>|noEstimate|unlimited}

<Целое число> - это максимальный размер страницы, если он не был явно задан при запросе. Значение noEstimate в данной реализации программного обеспечения не имеет эффекта, поскольку сервер в любом случае не возвращает оценку предполагаемых размеров результата. Значение unlimited указывает на то, что к максимальному размеру страницы не применяется ограничений.

Ограничение size.prtotal контролирует общее количество записей, возвращаемых при поиске с постраничным выводом результатов. По умолчанию оно совпадает с нормальным ограничением size.hard.

   size.prtotal={<целое число>|unlimited|disabled}

Значение unlimited снимает ограничение на количество записей, возвращаемых при поиске с постраничным выводом результатов. Значение disabled может быть использовано для выборочного отключения возможности постраничного возврата результатов поиска.


9.5. Примеры настройки ограничений

9.5.1. Простые глобальные ограничения

Этот простой фрагмент глобальной конфигурации устанавливает ограничения по размеру и времени на все операции поиска всех пользователей, за исключением rootdn. Он ограничивает результаты поиска 50-ю записями, а общее время на выполнение операции - 10-ю секундами.

   sizelimit 50
   timelimit 10

9.5.2. Мягкие и жёсткие глобальные ограничения

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

   sizelimit size.soft=5 size.hard=100

Для предотвращения выполнения клиентами очень неэффективных операций поиска по неиндексированным значениям, добавим ограничение unchecked:

   sizelimit size.soft=5 size.hard=100 size.unchecked=100

9.5.3. Установка определённым пользователям ограничений большего размера

Установив ограничения по умолчанию в глобальной конфигурации, Вы можете дать определённым пользователям возможность получения большего количества результатов. Это можно сделать при настройке отдельной базы данных:

   limits dn.exact="cn=anyuser,dc=example,dc=org" size=100000
   limits dn.exact="cn=personnel,dc=example,dc=org" size=100000
   limits dn.exact="cn=dirsync,dc=example,dc=org" size=100000

Как правило, при настройке сервера лучше избегать упоминания конкретных пользователей, а установить ограничения большего размера группе:

   limits group/groupOfNames/member="cn=bigwigs,dc=example,dc=org" size=100000

9.5.4. Установка ограничений на возможность выполнения поиска с постраничным выводом результатов

Может возникнуть ситуация, когда некоторым приложениям требуется выполнять поиск с очень большим количеством результатов, для которого они используют постраничный вывод, но Вы не хотите разрешать обычным пользователям LDAP использовать элемент управления pagedResults. В этом случае могут помочь ограничения pr и prtotal:

   limits group/groupOfNames/member="cn=dirsync,dc=example,dc=org" size.prtotal=unlimited
   limits users size.soft=5 size.hard=100 size.prtotal=disabled
   limits anonymous size.soft=2 size.hard=5 size.prtotal=disabled

9.6. Дополнительная информация

Дополнительную информацию можно найти в slapd.conf(5), ldapsearch(1) и slapd.access(5)