Мне нужно добавить кучу списков 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 в базе данных.
То, чего я хочу достичь, можно сформулировать так:
sambaLMPassword
и sambaNTPassword
Атрибуты, специфичные для SAMBA (доступны в записях posixAccount
class) должны быть доступны для чтения / изменения только их владельцами (self
, то есть).dn=sambaAdmin,dc=domain,dc=lan
был создан и предназначен для использования самим SAMBA и smbldap-tools
для управления специальными пользователями SAMBA в базе данных. Ему должен быть предоставлен полный доступ к набору специфичных для SAMBA OU в DIT.Я хочу, чтобы мои записи 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
еще раз, чтобы убедиться, что они на месте.