Дальнейшие действия целиком и полностью зависят от того, что было задумано на этапе проектирования каталога. Прежде всего это наполнение пользовательского 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"
База данных использует определённый механизм манипуляции данными. Соответственно, запись базы данных в каталоге cn=config
строится на специфичном для этого механизма манипуляции данными объектном классе, который является потомком общего объектного класса olcDatabaseConfig
. Если, как в нашем случае, для базы данных используется механизм манипуляции данными mdb
, то можно выяснить набор атрибутов для настройки этой базы данных такой командой:
# ldapsearch -x -LLL -b "cn=Subschema" -s base -o ldif-wrap=no '(objectClass=*)' objectClasses | egrep "NAME 'olc(Mdb|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.12.1 NAME 'olcMdbConfig' DESC 'MDB backend configuration' SUP olcDatabaseConfig STRUCTURAL MUST olcDbDirectory MAY ( olcDbCheckpoint $ olcDbEnvFlags $ olcDbNoSync $ olcDbIndex $ olcDbMaxReaders $ olcDbMaxSize $ olcDbMode $ olcDbSearchStack $ olcDbRtxnSize ) )
Описание большинства общих для всех типов баз данных атрибутов можно найти в учебнике LFRS, а описание специфичных для mdb
атрибутов настроек — в man-странице slapd-mdb(5).
Приведём примеры настроек, которые на данном этапе производит большинство администраторов каталога: установка списков контроля доступа (ACL) и индексирование атрибутов. Для примера ACL возьмём "классическое" ограничение доступа к парольному атрибуту userPassword
: пользователь, прошедший аутентификацию от имени DN записи каталога (владелец записи), может менять свой пароль; анонимный пользователь может использовать парольный атрибут в целях аутентификации; остальным (кроме, разумеется, rootDN
каталога) доступ к парольному атрибуту запрещён. Вторым правилом установим доступ ко всем остальным атрибутам всех записей каталога: у владельца записи есть право менять содержимое любого атрибута, у всех остальных — читать содержимое любого атрибута (кроме userPassword
). LDIF, производящий соответствующие изменения в настройках базы данных olcDatabase={1}mdb,cn=config
, будет выглядеть так:
dn: olcDatabase={1}mdb,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}mdb,cn=config"
Посмотрим, что получилось:
# ldapsearch -x -LLL -o ldif-wrap=no -D 'cn=config' -W -b 'cn=config' '(olcDatabase={1}mdb)'
Enter LDAP Password:
dn: olcDatabase={1}mdb,cn=config
objectClass: olcMdbConfig
olcDatabase: {1}mdb
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}mdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: cn eq,sub,subinitial
Мы добавляем к настройкам базы данных olcDatabase={1}mdb,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}mdb,cn=config"
Посмотрим, что получилось:
# ldapsearch -x -LLL -D 'cn=config' -W -b 'cn=config' '(olcDatabase={1}mdb)'
Enter LDAP Password:
dn: olcDatabase={1}mdb,cn=config
objectClass: olcMdbConfig
olcDatabase: {1}mdb
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
.
На данном этапе этими настройками мы и ограничимся. В последующих главах, если не будет указано иное, подразумевается, что дальнейшая настройка каталога будет выполняться с этой исходной точки.