Я пытаюсь создать веб-приложение, позволяющее пользователям изменять свои собственные пароли в Samba4 (возможно, также в AD), используя LDAP (ы). Но когда я пытаюсь изменить пароль пользователя с помощью этого кода:
dn: ........
changetype: modify
replace: unicodePwd
unicodePwd: "Temporal2"
, я получаю эту ошибку:
0x32 (Insufficient access; error in module acl: insufficient access rights during LDB_MODIFY (50))
Если я изменяю код, удаляю старый пароль и добавляю новый:
dn: ........
changetype: modify
delete: unicodePwd
unicodePwd: "Temporal1"
-
add: unicodePwd
unicodePwd: "Temporal2"
Тогда я получаю эту ошибку:
#!ERROR [LDAP: error code 53 - 00002035: setup_io: it's not allowed to set the NT hash password directly']
ldapmodify выполняется с использованием личных учетных данных пользователя, я бы не хотел использовать учетную запись администратора. Это возможно? Нужно ли мне изменять некоторые настройки в Samba4?
Поле или атрибут "unicodePwd" может содержать только пароль в формате Unicode и закодирован с помощью base64:
Пароль для установки: MyNewPassw0rd Кодирование этого пароля для вставки его в атрибут «unicodePwd» выполняется следующим образом:
echo -n '"MyNewPassw0rd"' | iconv -f utf8 -t utf16le | base64 -w 0
Обратите внимание на простые кавычки вокруг двойных кавычек: здесь используются простые кавычки, поскольку двойные кавычки не интерпретируются оболочкой. Строка в unicodePwd должна содержать пароль и двойные кавычки.
Эта команда дает нам:
IgBNAHkATgBlAHcAUABhAHMAcwB3ADAAcgBkACIA
Расшифровка этого значения:
echo IgBNAHkATgBlAHcAUABhAHMAcwB3ADAAcgBkACIA | base64 -d
Эта команда дает нам:
"MyNewPassw0rd"
Применяется к вашему примеру:
echo '"Temporal2"' | iconv -f utf8 -t utf16le | base64 -w 0 IgBUAGUAbQBwAG8AcgBhAGwAMgAiAAoA
Итак, новое содержимое LDIF:
dn: ........ changetype: modify delete: unicodePwd - add: unicodePwd unicodePwd:: IgBUAGUAbQBwAG8AcgBhAGwAMgAiAAoA
Обратите внимание на двойные двойные точки после unicodePwd: это означает, что данные закодированы в base64.
Использование LDIF через ldapmodify теперь работает здесь для изменения любого пароля пользователя, когда ldapmodify запускается с использованием идентификатора конкретного пользователя для которому мы делегировали права на изменение всех пользователей.
Пока я пытался использовать "replace: unicodePwd", как в следующем LDIF, я получал ошибку о недостаточных правах.
dn: ........ changetype: modify replace: unicodePwd unicodePwd:: IgBUAGUAbQBwAG8AcgBhAGwAMgAiAAoA
Использование двух действий ("delete: unicodePwd" затем "add: unicodePwd") проблема с недостаточными правами исчезла. Спасибо :)
Ура,
матиас