Я должен добавить набор ACLs для моей базы данных, но имею трудное время, пишущий надлежащий 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 и атрибутов, и теперь я хочу сжать ACLs на базе данных соответственно.
То, что я хочу выполнить, может быть указано как это:
sambaLMPassword
и sambaNTPassword
ОПРЕДЕЛЕННЫЕ ДЛЯ SAMBA атрибуты (доступный на записях posixAccount
класс), должно только быть читаемым/модифицируемым их соответствующими владельцами (self
, это).dn=sambaAdmin,dc=domain,dc=lan
был создан и определяется, чтобы использоваться самим Samba и smbldap-tools
управлять ОПРЕДЕЛЕННЫМИ ДЛЯ SAMBA пользователями в базе данных. Это должен быть предоставленный полный доступ к ряду ОПРЕДЕЛЕННОГО ДЛЯ SAMBA OUs в 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
может быть?), чтобы быть более подробным о реальной причине этой ошибки?
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, подготовить новые списки управления доступом, протестировать их с помощью 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
, чтобы убедиться, что они на месте.
Другой, гораздо более простой ответ - использовать команду ldapvi для редактирования записей olcAccess:
ldapvi -h ldapi:// -Y EXTERNAL -b cn=config
Она выгружает весь файл cn = config в VIM, позволяет редактировать его на досуге, затем при сохранении и выходе вычисляет LDIF за вас. Я просто добавил еще один атрибут olcAccess:, изменил нумерацию существующих, и все заработало без проблем.