Назад | Перейти на главную страницу

Как правильно вставить набор атрибутов olcAccess в конфигурацию базы данных OpenLDAP?

Мне нужно добавить кучу списков ACL для моей базы данных, но мне трудно написать для нее правильный LDIF. К сожалению, ldapmodify не очень помогает из-за бесполезного сообщения об ошибке:

modifying entry "olcDatabase={1}mdb,cn=config"
ldap_modify: Other (e.g., implementation specific) error (80)
         additional info: <olcAccess> handler exited with 1

В настоящее время у меня есть следующая довольно простая конфигурация моей базы данных MDB (она была создана конфигуратором пакетов Debian для slapd пакет, версия 2.4.40):

# {1}mdb, config
dn: olcDatabase={1}mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {1}mdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=domain,dc=lan
olcAccess: {0}to attrs=userPassword,shadowLastChange
   by self write
   by anonymous auth
   by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by * read
# ... and more

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

То, чего я хочу достичь, можно сформулировать так:

Я хочу, чтобы мои записи ACL были вставлены между правилами {0} и {1} в текущем конфиге.

Чтобы добиться того, что описано выше, я подготовил следующий файл LDIF, который пытаюсь применить, используя ldapmodify и я получаю сообщение об ошибке, представленное выше.

# {1}mdb, config
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {1}to dn.subtree="ou=Users,dc=domain,dc=lan"
   attrs=sambaLMPassword,sambaNTPassword
   by self write
   by dn=sambaAdmin,dc=domain,dc=lan write
   by anonymous auth
   by * none
olcAccess: {2}to dn.subtree="ou=Computers,dc=domain,dc=lan"
   attrs=sambaLMPassword,sambaNTPassword
   by self write
   by dn=sambaAdmin,dc=domain,dc=lan write
   by anonymous auth
   by * none
 olcAccess: {3}to dn.subtree="ou=Users,dc=domain,dc=lan"
   by dn=sambaAdmin,dc=domain,dc=lan write
 olcAccess: {4}to dn.subtree="ou=Groups,dc=domain,dc=lan"
   by dn=sambaAdmin,dc=domain,dc=lan write
 olcAccess: {5}to dn.subtree="ou=Computers,dc=domain,dc=lan"
   by dn=sambaAdmin,dc=domain,dc=lan write
 olcAccess: {6}to dn.subtree="ou=Idmap,dc=domain,dc=lan"
   by dn=sambaAdmin,dc=domain,dc=lan write
 olcAccess: {7}to dn=sambaDomainName=MYSERVER,dc=domain,dc=lan
   by dn=sambaAdmin,dc=domain,dc=lan write

К сожалению, LDIF проходит проверку синтаксиса (ldapmodify -n -v <path/to/file.ldif), и сообщение об ошибке действительно бесполезно.

В любом случае, пожалуйста, помогите мне исправить мой LDIF, чтобы он был принят slapd? Или объясните мне способ его настройки (или ldapmodify может быть?), чтобы подробнее рассказать о настоящей причине этой ошибки?

Другой, гораздо более простой ответ - использовать команду ldapvi для редактирования записей olcAccess:

ldapvi -h ldapi:// -Y EXTERNAL -b cn=config 

Он выгружает все cn = config в VIM, позволяет редактировать его на досуге, а затем, когда вы сохраняете и выходите, вычисляет LDIF для вас. Я просто добавил еще один атрибут olcAccess :, изменил нумерацию существующих, и все заработало без проблем.

ldapmodify лжет вам о действительности вашего файла. Если вы возьмете созданный вами файл LDIF и запустите

ldapmodify -v -n -f <path/to/file.ldif>

Результат выглядит так:

add olcAccess:
    {1}to dn.subtree="ou=Users,dc=domain,dc=lan" attrs=sambaLMPassword,sambaNTPassword  by self write  by dn=sambaAdmin,dc=domain,dc=lan write  by anonymous auth  by * none
    {2}to dn.subtree="ou=Computers,dc=domain,dc=lan"  attrs=sambaLMPassword,sambaNTPassword  by self write  by dn=sambaAdmin,dc=domain,dc=lan write  by anonymous auth  by * noneolcAccess: {3}to dn.subtree="ou=Users,dc=domain,dc=lan"  by dn=sambaAdmin,dc=domain,dc=lan writeolcAccess: {4}to dn.subtree="ou=Groups,dc=domain,dc=lan"  by dn=sambaAdmin,dc=domain,dc=lan writeolcAccess: {5}to dn.subtree="ou=Computers,dc=domain,dc=lan"  by dn=sambaAdmin,dc=domain,dc=lan writeolcAccess: {6}to dn.subtree="ou=Idmap,dc=domain,dc=lan"  by dn=sambaAdmin,dc=domain,dc=lan writeolcAccess: {7}to dn=sambaDomainName=MYSERVER,dc=domain,dc=lan  by dn=sambaAdmin,dc=domain,dc=lan write
!modifying entry "olcDatabase={1}mdb,cn=config"

Обратите внимание, как все ACL-списки скручиваются вместе? Это потому, что между каждой записью нет знака «-». По какой-то причине ldapmodify передает этот файл, когда вы запускаете его с ключом "-n" в режиме пробного запуска, но терпит неудачу, когда вы действительно пытаетесь его реализовать. Вы должны изменить свой файл LDIF, чтобы он выглядел так:

 dn: olcDatabase={1}mdb,cn=config
 add: olcAccess
 olcAccess: {0}to attrs=userPassword,shadowLastChange by self write
 by anonymous auth
 by * none
 -
 add: olcAccess
 olcAccess: {1}to dn.subtree="ou=Users,dc=domain,dc=lan"
 attrs=sambaLMPassword,sambaNTPassword by self write by
 dn="cn=sambaAdmin,dc=domain,dc=lan" write by anonymous auth by * none
 -
 add: olcAccess
 olcAccess: {2}to dn.subtree="ou=Computers,dc=domain,dc=lan"
 attrs=sambaLMPassword,sambaNTPassword by self write by 
 dn=sambaAdmin,dc=domain,dc=lan write by anonymous auth by * none
 -
 add: olcAccess
 olcAccess: {3}to dn.subtree="ou=Users,dc=domain,dc=lan" by
 dn=sambaAdmin,dc=domain,dc=lan write
 -
 add: olcAccess
 olcAccess: {4}to dn.subtree="ou=Groups,dc=domain,dc=lan" by 
 dn=sambaAdmin,dc=domain,dc=lan write
 -
 add: olcAccess
 olcAccess: {5}to dn.subtree="ou=Computers,dc=domain,dc=lan" by   
 dn=sambaAdmin,dc=domain,dc=lan write
 -
 add: olcAccess
 olcAccess: {6}to dn.subtree="ou=Idmap,dc=domain,dc=lan" by
 dn=sambaAdmin,dc=domain,dc=lan write
 -
 add: olcAccess
 olcAccess: {7}to dn=sambaDomainName=MYSERVER,dc=domain,dc=lan by
 dn=sambaAdmin,dc=domain,dc=lan write
 -
 add: olcAccess
 olcAccess: {8}to dn.base="" by * read
 -

Форматирование кода обманчиво, но вы хотите, чтобы каждое из определений ACL располагалось в одной строке, начиная со столбца 0, вы хотите отделить каждую запись знаком «-» и убедиться, что в определении ACL нет пробел в конце, или ldapmodify зашифрует строку.

Если вы редактируете с помощью vi / vim, используйте команду: set list, чтобы отобразить символы пунктуации, такие как возврат каретки, и удалить их, а также убедиться, что в конце строки нет пробелов. После того, как вы это сделаете, вывод

ldapmodify -v -n -f <path/to/file.ldif>

будет выглядеть так:

add olcAccess:
    {0}to attrs=userPassword,shadowLastChange by self write by anonymous auth by * none
add olcAccess:
    {1}to dn.subtree="ou=Users,dc=domain,dc=lan"
attrs=sambaLMPassword,sambaNTPassword by self write by
dn="cn=sambaAdmin,dc=domain,dc=lan" write by anonymous auth by * none
add olcAccess:
    {2}to dn.subtree="ou=Computers,dc=domain,dc=lan"
attrs=sambaLMPassword,sambaNTPassword by self write by    
dn=sambaAdmin,dc=domain,dc=lan write by anonymous auth by * none
add olcAccess:
    {3}to dn.subtree="ou=Users,dc=domain,dc=lan" by
dn=sambaAdmin,dc=domain,dc=lan write
add olcAccess:
    {4}to dn.subtree="ou=Groups,dc=domain,dc=lan" by   
dn=sambaAdmin,dc=domain,dc=lan write
add olcAccess:
    {5}to dn.subtree="ou=Computers,dc=domain,dc=lan" by
dn=sambaAdmin,dc=domain,dc=lan write
add olcAccess:
    {6}to dn.subtree="ou=Idmap,dc=domain,dc=lan" by
dn=sambaAdmin,dc=domain,dc=lan write
add olcAccess:
    {7}to dn=sambaDomainName=MYSERVER,dc=domain,dc=lan by
dn=sambaAdmin,dc=domain,dc=lan write
add olcAccess:
    {8}to dn.base="" by * read
!modifying entry "olcDatabase={1}mdb,cn=config"

Еще одна проблема, которую я заметил, - это использование вами ключевого слова «изменить». Если вы добавляете новые записи в схему LDAP или удаляете записи, которые вам не нужны, модификация используется только тогда, когда вы изменяете существующую запись. Я обнаружил, что самый простой способ изменить группу таких списков ACL - это открыть пару окон на моем сервере LDAP, подготовить новые списки ACL, протестировать их с помощью ldapmodify с помощью переключателя -n, а затем su для получения root в каждом окне , удалите существующие ACL, а затем добавьте новые. Вы можете удалить все существующие ACL с помощью файла LDIF, который выглядит следующим образом:

# {1}mdb, config
dn: olcDatabase={1}mdb,cn=config
delete: olcAccess

а затем запустите ldapmodify

ldapmodify -Y EXTERNAL -H ldapi:/// -f <path/to/acl_delete_file.ldif>

чтобы удалить их. После запуска ldapmodify запустите

slapcat -n 0

чтобы убедиться, что ACL были удалены, а затем запустите

ldapmodify -Y EXTERNAL -H ldapi:/// -f <path/to/new_acl_file.ldif>

чтобы добавить новые ACL и затем запустить

slapcat -n 0

еще раз, чтобы убедиться, что они на месте.