3.7 Чем заняться дальше

Примеры адаптированы для

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

На данном этапе хотелось бы отметить, что вся дальнейшая настройка службы каталогов OpenLDAP, по сути, заключается в манипулировании (добавлении, удалении, замене) атрибутами корневой записи cn=config (глобальные настройки каталога), добавлении новых модулей и наборов схемы данных (как это уже было описано ранее), манипулировании атрибутами записей баз данных и наложений (настройки на уровне DIT), а также добавлении по мере необходимости записей других баз данных и наложений. Освоив приёмы работы с записями каталога, Вы научитеcь довольно легко и быстро управлять своим каталогом.

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

Настройка глобальных параметров службы каталогов

Почти все глобальные параметры устанавливаются как атрибуты записи cn=config, построенной, как известно, на объектном классе olcGlobal. Посмотрим, что это за атрибуты:
# ldapsearch -x  -LLL -b "cn=Subschema" -s base -o ldif-wrap=no '(objectClass=*)' objectClasses | grep olcGlobal
objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.0.1 NAME 'olcGlobal' DESC 'OpenLDAP Global configuration options' SUP olcConfig STRUCTURAL MAY ( cn $ olcConfigFile $ olcConfigDir $ olcAllows $ olcArgsFile $ olcAttributeOptions $ olcAuthIDRewrite $ olcAuthzPolicy $ olcAuthzRegexp $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcDisallows $ olcGentleHUP $ olcIdleTimeout $ olcIndexSubstrIfMaxLen $ olcIndexSubstrIfMinLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcLocalSSF $ olcLogFile $ olcLogLevel $ olcPasswordCryptSaltFormat $ olcPasswordHash $ olcPidFile $ olcPluginLogFile $ olcReadOnly $ olcReferral $ olcReplogFile $ olcRequires $ olcRestrict $ olcReverseLookup $ olcRootDSE $ olcSaslAuxprops $ olcSaslHost $ olcSaslRealm $ olcSaslSecProps $ olcSecurity $ olcServerID $ olcSizeLimit $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcTCPBuffer $ olcThreads $ olcTimeLimit $ olcTLSCACertificateFile $ olcTLSCACertificatePath $ olcTLSCertificateFile $ olcTLSCertificateKeyFile $ olcTLSCipherSuite $ olcTLSCRLCheck $ olcTLSRandFile $ olcTLSVerifyClient $ olcTLSDHParamFile $ olcTLSCRLFile $ olcToolThreads $ olcWriteTimeout $ olcObjectIdentifier $ olcAttributeTypes $ olcObjectClasses $ olcDitContentRules $ olcLdapSyntaxes ) )

Как видим, атрибутов достаточно много, предназначение и формат многих из них можно найти в учебнике LFRS. Мы же займёмся самым, пожалуй, полезным на этапе запуска и отладки параметром — установим уровень журналирования побольше, чтобы получить пищу для размышлений. Создадим LDIF-файл /tmp/ldifs/10-add_loglevel.ldif такого содержания:

dn: cn=config
changetype: modify
add: olcLogLevel
olcLogLevel: any

Применим наш LDIF-файл:

# ldapmodify -x -D 'cn=config' -W -f /tmp/ldifs/10-add_loglevel.ldif
Enter LDAP Password: 
modifying entry "cn=config"

Посмотрим, что получилось

# ldapsearch -x -LLL -D 'cn=config' -W -b 'cn=config' '(cn=config)'
Enter LDAP Password: 
dn: cn=config
objectClass: olcGlobal
cn: config
olcPidFile: /var/run/slapd/slapd.pid
olcLogLevel: any

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

dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: acl stats

В данном случае мы устанавливаем слежение за обработкой ACL и вывод общей статистической информации. О том, какие существуют уровни журналирования и как их комбинировать, можно почитать в учебнике LFRS. Применяется данный LDIF, как всегда, командой ldapmodify:

# ldapmodify -x -D 'cn=config' -W -f /tmp/ldifs/11-replace_loglevel.ldif 
Enter LDAP Password: 
modifying entry "cn=config"

Настройка параметров на уровне DIT

База данных использует определённый механизм манипуляции данными. Соответственно, запись базы данных в каталоге cn=config строится на специфичном для этого механизма манипуляции данными объектном классе, который является потомком общего объектного класса olcDatabaseConfig. Если, как в нашем случае, для базы данных используется механизм манипуляции данными bdb, то можно выяснить набор атрибутов для настройки этой базы данных такой командой:

# ldapsearch -x  -LLL -b "cn=Subschema" -s base -o ldif-wrap=no '(objectClass=*)' objectClasses | egrep "NAME 'olc(Bdb|Database)Config"
objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.0.4 NAME 'olcDatabaseConfig' DESC 'OpenLDAP Database-specific options' SUP olcConfig STRUCTURAL MUST olcDatabase MAY ( olcHidden $ olcSuffix $ olcSubordinate $ olcAccess $ olcAddContentAcl $ olcLastMod $ olcLimits $ olcMaxDerefDepth $ olcPlugin $ olcReadOnly $ olcReplica $ olcReplicaArgsFile $ olcReplicaPidFile $ olcReplicationInterval $ olcReplogFile $ olcRequires $ olcRestrict $ olcRootDN $ olcRootPW $ olcSchemaDN $ olcSecurity $ olcSizeLimit $ olcSyncUseSubentry $ olcSyncrepl $ olcTimeLimit $ olcUpdateDN $ olcUpdateRef $ olcMirrorMode $ olcMonitoring $ olcExtraAttrs ) )
objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.2.1.1 NAME 'olcBdbConfig' DESC 'BDB backend configuration' SUP olcDatabaseConfig STRUCTURAL MUST olcDbDirectory MAY ( olcDbCacheSize $ olcDbCheckpoint $ olcDbConfig $ olcDbCryptFile $ olcDbCryptKey $ olcDbNoSync $ olcDbDirtyRead $ olcDbIDLcacheSize $ olcDbIndex $ olcDbLinearIndex $ olcDbLockDetect $ olcDbMode $ olcDbSearchStack $ olcDbShmKey $ olcDbCacheFree $ olcDbDNcacheSize $ olcDbPageSize ) )

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

Приведём примеры настроек, которые на данном этапе производит большинство администраторов каталога: установка списков контроля доступа (ACL) и индексирование атрибутов. Для примера ACL возьмём "классическое" ограничение доступа к парольному атрибуту userPassword: пользователь, прошедший аутентификацию от имени DN записи каталога (владелец записи), может менять свой пароль; анонимный пользователь может использовать парольный атрибут в целях аутентификации; остальным (кроме, разумеется, rootDN каталога) доступ к парольному атрибуту запрещён. Вторым правилом установим доступ ко всем остальным атрибутам всех записей каталога: у владельца записи есть право менять содержимое любого атрибута, у всех остальных — читать содержимое любого атрибута (кроме userPassword). LDIF, производящий соответствующие изменения в настройках базы данных olcDatabase={1}bdb,cn=config, будет выглядеть так:

dn: olcDatabase={1}bdb,cn=config
changetype: modify
add: olcAccess
olcAccess: to attrs=userPassword
  by self write
  by anonymous auth
  by * none
olcAccess: to *
  by self write
  by * read

Обратите внимание, что правила переноса строк в LDIF предусматривают, что строка, являющаяся продолжением предыдущей, должна начинаться с пробельного символа, поэтому в данном случае, для сохранения правильного формата ACL, перед условиями by ACL мы выставили два пробела.

Сохраним этот LDIF как файл /tmp/ldifs/12-add_acl.ldif и применим его:

# ldapmodify -x -D 'cn=config' -W -f /tmp/ldifs/12-add_acl.ldif
Enter LDAP Password: 
modifying entry "olcDatabase={1}bdb,cn=config"

Посмотрим, что получилось:

# ldapsearch -x -LLL -D 'cn=config' -W -b 'cn=config' '(olcDatabase={1}bdb)'
Enter LDAP Password: 
dn: olcDatabase={1}bdb,cn=config
objectClass: olcBdbConfig
olcDatabase: {1}bdb
olcSuffix: dc=mycompany,dc=ru
olcDbDirectory: /var/lib/ldap/dc=mycompany,dc=ru
olcRootDN: cn=manager,ou=System,dc=mycompany,dc=ru
olcRootPW: {SSHA}PKFrwbIL/zLd3gabPPLxn1vNq2jQHj4g
olcDbIndex: objectClass eq
olcAccess: {0}to attrs=userPassword by self write read by anonymous auth by * 
 none
olcAccess: {1}to * by self write by * read

Наши ACL на месте. Поскольку порядок применения ACL очень важен, к значению данного атрибута добавляется индекс (порядковый номер) X-ORDERED. Дополнительную информацию по ACL можно найти в учебнике LFRS и в руководстве администратора OpenLDAP.

Теперь определим индексы для каталога. По правде говоря, индексирование следует производить только для тех атрибутов, по которым будет производиться поиск, то есть исходя из тех задач, которые каталог решает. Лишние индексы будут только занимать место на диске и тормозить процесс внесения изменений в каталог. Для абстрактного случая мы можем проиндексировать атрибут cn — такой индекс наверняка пригодится. Создадим файл /tmp/ldifs/13-add_index.ldif такого содержания:

dn: olcDatabase={1}bdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: cn eq,sub,subinitial

Мы добавляем к настройкам базы данных olcDatabase={1}bdb,cn=config атрибут olcDbIndex, в котором указывается, что для атрибута cn должны быть определены индексы eq (поиск без поискового шаблона), sub и subinitial (два варианта оптимизации под поиск с применением поискового шаблона). Подробнее об индексах можно почитать в учебнике LFRS.

Применим наш LDIF:

# ldapmodify -x -D 'cn=config' -W -f /tmp/ldifs/13-add_index.ldif 
Enter LDAP Password: 
modifying entry "olcDatabase={1}bdb,cn=config"

Посмотрим, что получилось:

# ldapsearch -x -LLL -D 'cn=config' -W -b 'cn=config' '(olcDatabase={1}bdb)'
Enter LDAP Password: 
dn: olcDatabase={1}bdb,cn=config
objectClass: olcBdbConfig
olcDatabase: {1}bdb
olcSuffix: dc=mycompany,dc=ru
olcDbDirectory: /var/lib/ldap/dc=mycompany,dc=ru
olcRootDN: cn=manager,ou=System,dc=mycompany,dc=ru
olcRootPW: {SSHA}PKFrwbIL/zLd3gabPPLxn1vNq2jQHj4g
olcDbIndex: objectClass eq
olcDbIndex: cn eq,sub,subinitial
olcAccess: {0}to attrs=userPassword by self write read by anonymous auth by * 
 none
olcAccess: {1}to * by self write by * read

Наша настройка индексирования добавилась к уже имеющейся настройке индексирования атрибута objectClass.

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

Pro-LDAP.ru 2013 г. Последнее изменение страницы — 12 января 2013 г. Вопросы и предложения принимаются на форуме проекта.