headermask image

Notice: Undefined variable: t in /var/www/user97185/data/www/system-administrators.info/yandex-ad.php on line 15

Notice: Undefined variable: r in /var/www/user97185/data/www/system-administrators.info/yandex-ad.php on line 15
Рекомендую: Фриланс-биржа | Кэшбэк-сервис | Интернет-бухгалтерия

Списки управления доступом в LDAP

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

Проектирование списков управления доступом LDAP

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

Компоненты ACL

Каждая запись ACL содержит следующую информацию:

  1. Какие элементы и атрибуты определены в ACL
  2. К кому применяется ACL
  3. Какой уровень доступа предоставляется

В условии “what” вы можете указать определенное различающееся имя (DN) объекта, фильтр запроса LDAP, список атрибутов или определенную комбинацию всех вышеперечисленных элементов. Фильтрация по различающимся именам позволит вам выбрать точное значение, такое как ou=People,dc=ertw,dc=com, или значения, соответствующие регулярному выражению. С помощью фильтра запроса LDAP можно выбрать определенный класс objectClass или другие атрибуты объекта. Список атрибутов представляет собой список имен атрибутов, разделенных запятыми. Более сложным условием может являться такое условие, как “Все пароли пользователей подразделения ou=People,dc=ertw,dc=com, являющихся администраторами”.

При указании учетных записей, к которым применяется запись ACL, вам предоставляется большая гибкость. Обычно для идентификации пользователей используется различающееся имя под названием bindDN, под которым они привязываются к дереву объектов. Каждый элемент LDAP может иметь атрибут userPassword, использующийся для аутентификации определенного пользователя. В некоторых ситуациях вы можете использовать ключевое слово self, соответствующее имени текущего пользователя, выполнившего вход в систему. Это может оказаться полезным в случаях, когда вы хотите разрешить пользователям редактировать их собственные данные.

Если пользователь не привязан к дереву LDAP, он считается анонимным (anonymous). По умолчанию анонимные пользователи могут просматривать данные каталога, поэтому вы должны решить, стоит ли оставлять им такой доступ. Далее вы можете сгруппировать анонимных пользователей (также как и любых других) по IP-адресам или методу подключения к каталогу LDAP, такому как использование открытых паролей или шифрованное подключение.

После того как вы решили, доступ к каким объектам и кому необходимо предоставить, вы должны определиться с уровнем доступа, который может варьироваться от none (запретить все) до write (разрешить изменения). Также вы можете разрешить пользователю проходить аутентификацию на основе определенной записи, но запретить ее чтение, или, предположим, разрешить выполнять операции чтения (read), поиска (search) и сравнения (compare).

Независимо от настроек ACL любые учетные записи, определенные как rootDN (пользователи, являющиеся администраторами LDAP), всегда будут иметь полный доступ к соответствующей базе данных. Не существует других способов изменить это поведение, кроме как удалить конфигурацию rootDN из файла slapd.conf.

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

Основная форма записи ACL, представленная в нормальной форме Бэкуса-Наура, имеет следующий вид:
access to <what> [ by <who> [ <access> ] [ <control> ] ]+

Нормальная форма Бэкуса-Наура
Нормальная форма Бэкуса-Наура (БНФ) является способом описания синтаксиса языков программирования, данных и протоколов, в том числе синтаксиса ACL. Являясь краткой, и в то же время очень точной, БНФ часто используется при разработке протоколов Интернета.В нотации БНФ используется конструкция из двух частей, разделенных знаком ::=, который означает, что левая часть может быть заменена элементами, перечисленными в правой части. Элементы правой части конструкции БНФ, заключенные в угловые скобки (< и >), относятся к элементам левой части, заключенным в такие же скобки.Элементы, заключенные в квадратные скобки ([ и ]), являются необязательными. Вертикальная черта (|) означает “одно из нескольких”, а символы + и * означают “одно или несколько из предшествующих” и “ничего, одно или несколько из предшествующих” соответственно. Если вы имели дело с регулярными выражениями, вам будут знакомы многие использующиеся здесь обозначения.

контексте описания ACL с помощью БНФ используется следующий синтаксис. Каждая запись ACL состоит из символьной строки “access to”, после которой идет условие “what”, определенное где-либо в другом месте. Далее идут одна или более строк вида “by <who> [ <access> ] [ <control> ]“, в которых параметры who, access и control определены где-либо в другом месте, причем параметры access и control являются необязательными.

Остальной синтаксис мы рассмотрим в оставшейся части руководства.

Описание условия what

Условие what определяет, какие объекты и атрибуты попадают под действие правила ACL. Описание синтаксиса этого условия в нотации БНФ представлено в листинге 1.
Листинг 1. Описание синтаксиса условия what в нотации БНФ

<what>        ::= * |    [dn[.<basic-style>]=<regex> | dn.<scope-style>=<DN>]

[filter=<ldapfilter>] [attrs=<attrlist>]

<basic-style> ::= regex | exact

<scope-style> ::= base | one | subtree | children

<attrlist>    ::= <attr> [val[.<basic-style>]=<regex>]

| <attr> , <attrlist>

<attr>        ::= <attrname> | entry | children

Некоторые из элементов листинга 1, такие как DN и regex, не определены непосредственно в этом фрагменте кода. Формат различающегося имени вам уже знаком, а регулярные выражения лучше всего изучать отдельно от БНФ.

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

В листинге 2 приведены три условия what, определяющих различающееся имя (DN).
Листинг 2. Три примера условий what

dn.exact="ou=people,dc=ertw,dc=com"dn.regex="ou=people,dc=ertw,dc=com$"

dn.regex="^cn=Sean.*,dc=com$"

Первому условию удовлетворяет исключительно объект ou=people,dc=ertw,dc=com; эта запись ACL не будет соответствовать ни каким-либо дочерним объектам, таким как cn=Sean Walberg,ou=people,dc=ertw,dc=com, ни родительскому объекту.

Второе условие похоже на первое за исключением того, что в нем используется регулярное выражение и якорь строки – знак доллара ($). Якорь определяет не часть строки, а ее расположение. Знак доллара означает конец строки, и поэтому второму условию удовлетворяет любая строка, оканчивающаяся на ou=people,dc=ertw,dc=com, в том числе строка cn=Sean Walberg,ou=people,dc=ertw,dc=com. Обратите внимание на то, что без использования якоря строка поиска может располагаться в любом месте целевой строки, такой как ou=people,dc=ertw,dc=com,o=MegaCorp.

В последнем примере листинга 2 используется еще один якорь – символ ^, означающий начало строки. Кроме того, в этом примере используется регулярное выражение .*. Точка означает любой символ, а знак звездочки означает ноль или более предшествующих символов. Таким образом регекс .* соответствует любой строке, состоящей из нуля или более символов. Объединив все правила, мы увидим, что третьему условию удовлетворяет любая строка, начинающаяся на cn=Sean и оканчивающаяся на dc=com.

Также при определении условия what вы можете использовать фильтры запросов LDAP – наиболее полезное средство для поиска объектов на основе их классов ( objectClass). Например, условию filter=(objectClass=posixAccount) удовлетворяют все объекты класса posixAccount.

частью составления условий what является указание атрибутов. Как правило, данный способ используется для указания того, какие конфиденциальные атрибуты, в особенности пароли, могут быть доступны пользователям. Для того чтобы определить правило, относящееся к паролям, укажите атрибут attrs=userPassword.

После того как вы укажете, какие объекты и атрибуты попадают под действие правила ACL, вы должны будете указать пользователей, на которых будет распространяться это правило.

Описание условия who

Доступы предоставляются пользователю на основании различающегося имени DN, которое определяется в момент привязки клиента к каталогу. Обычно поиск различающегося имени производится в дереве каталога, но также этим именем может являться имя rootDN, указанное в файле slapd.conf.

Описание синтаксиса условия who в нотации БНФ представлено в листинге 3.
Листинг 3. Описание синтаксиса условия who в нотации БНФ

<who> ::= * | [anonymous | users | self[.<selfstyle>]                        | dn[.<basic-style>]=<regex> | dn.<scope-style>=<DN>]

[dnattr=<attrname>]

[group[/<objectclass>[/<attrname>][.<basic-style>]]=<regex>]

[peername[.<peernamestyle>]=<peername>]

[sockname[.<style>]=<sockname>]

[domain[.<domainstyle>[,<modifier>]]=<domain>]

[ssf=<n>]

[transport_ssf=<n>]

[tls_ssf=<n>]

[sasl_ssf=<n>]<style> ::=	{exact|regex|expand}

<selfstyle> ::=	{level{<n>}}

<dnstyle> ::=	{{exact|base(object)}|regex

|one(level)|sub(tree)|children|level{<n>}}

<groupstyle> ::=	{exact|expand}

<peernamestyle> ::=	{<style>|ip|path}

<domainstyle> ::=	{exact|regex|sub(tree)}

<modifier> ::=	={expand}

Также как и в условии what, здесь знак звездочки означает любое значение. Существует множество способов конкретизировать данное условие. В OpenLDAP определены три ключевых слова – anonymous, users и self, которые означают незарегистрированных пользователей, пользователей, прошедших проверку, и текущего пользователя, выполнившего вход в систему, соответственно. Ключевое слово self часто используется для того, чтобы разрешить вошедшему в систему пользователю изменять данные своего профиля. Данная функция основана на точном совпадении с DN пользователя; если информация о пользователе размещена в нескольких различных объектах, ссылка self действует только для той записи, с помощью которой была выполнена привязка к каталогу.

Ключевое слово self имеет интересную особенность: вы можете применять правило ACL к родительским или дочерним записям текущей записи пользователя, используя другое ключевое слово – level. Ссылка self.level{1} соответствует текущей и родительской записям пользователя, а ссылка self.level{-1} – текущей и всем непосредственно присоединенным дочерним записям.

Что касается различающегося имени, то вы можете отфильтровать атрибут DN на основе регулярного выражения или точного совпадения, используя конструкции dn.exact=”DN и dn.regex=”regexсоответственно. Далее в этом руководстве будет рассмотрен пример динамического связывания условий what и who.

Произвольные элементы каталога могут быть защищены с помощью ключевого слова dnattr, которое используется совместно с именем атрибута. Если DN инициатора запроса содержится в указанном атрибуте целевого объекта, то считается, что условие ACL выполняется. Например, если вы добавите в ACL условие dnattr=manager, а в запись пользователя Fred Smith добавите атрибут manager: cn=Joe Blow,ou=people,dc=ertw,dc=com, то при обращении пользователя Joe Blow к записи пользователя Fred Smith условие ACL будет выполняться.

Ключевое слово group похоже на dnattr за исключением того, что его параметры относятся к группе, определенной где-либо в другом месте дерева, а не к атрибуту элемента каталога. По умолчанию классом объекта (objectClass) группы является groupOfNames, а участники группы перечислены в атрибуте member.

Ключевые слова peername, sockname и domainиспользуются для идентификации клиентского подключения. Ключевое слово peernameиспользуется для указания IP-адреса клиента, например, peernameip=127.0.0.1. Ключевое слово sockname относится к редко используемым подключениям через именованные каналы (named pipes), а domain используется для указания связанного с IP-адресом имени узла, которое может быть легко подделано.

Заключительный ряд опций относится к уровню безопасности подключения, который в терминах OpenLDAP называется Security Strength Factor (SSF). Эти опции окажутся более понятными, если вы знакомы с механизмами безопасности, использующимися для подключений к OpenLDAP, такими как защита транспортного уровня (Transport Layer Security, TLS) и механизм аутентификации Simple Authentication and Security Layer (SASL).

Вы можете использовать различные комбинации всех вышеперечисленных опций. Например, вы можете разрешить изменять пароли только тем пользователям, которые одновременно являются администраторами, подключаются с заданного диапазона IP-адресов и используют определенный уровень шифрования. Вы можете определять и более простые условия; например, вы можете разрешить подключаться к каталогу только существующим в системе пользователям или же предоставлять доступ вне зависимости от результатов проверки подлинности.

Описание параметра access

После того как вы определили, кому и к каким объектам каталога разрешен доступ, вы должны указать уровень предоставляемого доступа. Описание параметра access в нотации БНФ представлено в листинге 4.
Листинг 4. Описание параметра access в нотации БНФ

<access>  ::=  [[real]self]{<level>|<priv>}<level> ::= none|disclose|auth|compare|search|read|write

<priv> ::= {=|+|-}{w|r|s|c|x|d|0}+

Когда уровень доступа указывается в формате level, каждый последующий уровень включает в себя все предыдущие уровни. Таким образом, предоставляя разрешение read, вы также предоставляете разрешения search, compare, auth и disclose. Уровни доступа none и discloseзапрещают любой доступ к данным и отличаются лишь тем, что некоторые сообщения об ошибках, которые могут раскрыть информацию о содержимом дерева каталога, не выводятся на уровне доступа none и выводятся на уровне disclose.

Альтернативным способом является указание уровня доступа в терминах разрешенных операций LDAP с использованием формата priv. В этом формате опции перечислены в обратном порядке относительно формата level; опция w означает операцию записи, а опция 0 – полный запрет любых операций. При указании уровня доступа в формате priv не происходит неявного наследования разрешений, как в случае использования формата level; если вы хотите предоставить полный доступ, вы должны сделать это с помощью строки wrscx.

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

Параметр control

По умолчанию применение списков доступа в OpenLDAP происходит по методу первого совпадения. OpenLDAP находит первую запись ACL, удовлетворяющую условию what, и в пределах этой записи ищет первый элемент, удовлетворяющий условию who. Этот метод соответствует ключевому слову stop, указанному после описания уровня доступа. Два других ключевых слова – это continue и break. Если вы используете ключевое слово continue, то в текущей записи ACL производится поиск следующего элемента, удовлетворяющего условию who. Если вы используете ключевое слово break, обработка текущей записи ACL прекращается, но выполняется поиск следующей записи ACL, удовлетворяющей условию who.

Собираем вместе все компоненты правила ACL

Теперь, когда мы рассмотрели все три (четыре, если считать параметр control) компонента правила ACL, можно собрать их воедино и создать политику доступа. В листинге 5 приведен простой список ACL, который позволяет зарегистрированным в системе пользователям просматривать дерево каталога и изменять (но не просматривать) свои личные пароли.
Листинг 5. Простой список ACL

access to attrs=userPassword    by self =xw

by anonymous authaccess to *

by self write

by users read

Первое правило ACL применяется в случаях обращения пользователей к полю userPassword. Каждый пользователь может изменять свой пароль и использовать его для входа в систему. Эти разрешения предоставляются путем использования знака “=”. Анонимным пользователям разрешено проходить аутентификацию. Поскольку в момент привязки к дереву каталога любой пользователь является анонимным, ему необходимо предоставить разрешение auth для того, чтобы он мог войти в систему и стать обычным, привилегированным пользователем.

Если пользователи обращаются к элементам каталога, которые не являются паролями, то в действие вступает второе правило ACL. Опять же, каждый пользователь имеет полный доступ ко всем полям своей записи (за исключением поля userPassword в силу действия первого правила ACL), в то время как все прошедшие проверку пользователи могут просматривать остальные данные каталога.

В листинге 6 приведена запись ACL, связывающая условия what и who и содержащая регулярные выражения.
Листинг 6. Немного фантазии с использованием регулярных выражений

access to dn.regex="cn=([^,]+),ou=addressbook,dc=ertw,dc=com" by dn.regex="cn=$1,ou=People,dc=ertw,dc=com" write

by users read

Правило ACL, приведенное в листинге 6, разрешает пользователям изменять соответствующие им записи в ветке ou=addressbook,dc=ertw,dc=com дерева каталога. Регулярное выражение [^,]+ соответствует строке любых символов за исключением запятой, а круглые скобки сохраняют эту строку в качестве значения переменной $1; следующая пара скобок сохраняется в переменную $2, и так далее до $9 включительно. В условии who полученное имя пользователя повторно используется для определения того, кто может получить доступ к записи каталога. Если имя пользователя совпадает с именем записи, к которой он обращается, то ему предоставляется полный доступ. В противном случае прошедший проверку пользователь получает доступ только на просмотр этой записи.

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

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

Постовой

Научно-технический центр “Спектр” продает электронные измерительные приборы в большом ассортименте от различных производителей.

Через интернет магазин florio-fashion.com можно заказать букет и доставку цветов курьером в любую точку Москвы.