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

Я должен добавить набор 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 может быть?), чтобы быть более подробным о реальной причине этой ошибки?

0
задан 8 April 2015 в 17:19
2 ответа

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

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

4
ответ дан 4 December 2019 в 11:06

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

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

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

4
ответ дан 4 December 2019 в 11:06

Теги

Похожие вопросы