Мне нужно перенести устаревшие данные Mysql, подобные каталогам, в новую базу данных ldap. Никаких хлопот, кроме паролей. Они хранятся как sha1 в базе данных Mysql (я проверил, могу ли я их сгенерировать, набрав « echo -n« cleartextpassword »| openssl dgst -sha1
»).
Проблема в том, что я не могу их импортировать на нашем сервере openldap.
Боюсь, здесь могут быть 2 проблемы.
Во-первых, проблема с шифрованием / кодированием: можно ли вообще использовать эту кодировку sha1 как таковую в ldap?
Проблема интерфейса: когда я используйте ldapadd
или ldapmodify
для ввода / обновления поля userPassword
, данные, представленные в файле ldif, повторно зашифровываются. Можно ли как-то обойти эту проблему?
Заранее спасибо
Я наконец получил это после множества испытаний.
Строки sha1, которые у меня есть, являются так называемыми шестнадцатеричными дайджестами. Чтобы поместить их в openldap, мне сначала нужно преобразовать их обратно в двоичный дайджест sha1, а затем их закодировать base64.
В командной строке это можно сделать с помощью:
echo -n "sha1-hex-digest" | xxd -r -p | openssl enc -base64
Затем полученную строку нужно вставить в файл ldif таким образом:
userPassword: {SHA}base-64-blurb
Для тех, кто заинтересован, это можно сделать в Python следующим образом:
import base64
import binascii
sha1_pwd = "your-sha1-hex-digest-here"
ldap_pwd = base64.b64encode(binascii.unhexlify(sha1_pwd)).decode('utf-8')
print("userPassword: {SHA}%s" % ldap_pwd)
В моем случае я хотел, чтобы были импортированы хэши алгоритма SHA-512 с солью крипты из учетных записей пользователей Linux. Итак, я нашел (Ответ) Что такое пароли {CRYPT} и как их генерировать?, в котором более подробно, но в основном все, что вам нужно сделать, это добавить {CRYPT}
перед обычный хэш вида $6$salthere$base64hashhere
.
По этой ссылке говорится, что для генерации хэша нужно использовать Perl-библиотеки. Вам не нужно выполнять какие-либо команды, чтобы сгенерировать что-либо, кроме проверки. (но вы должны использовать ldapmodifyuser
или другую команду на основе ldif, о которой они не упоминают, чтобы фактически импортировать пароль). Но это полезно для того, чтобы увидеть правильный синтаксис ($1$salt...
который является md5crypt):
$ perl -e 'use Crypt::PasswdMD5;print("userPassword: {CRYPT}".unix_md5_crypt("password","salt")."\n");'
userPassword: {CRYPT}$1$salt$qJH7.N4xYta3aEG/dfqo/0
Но нужный алгоритм был недоступен (это sha512crypt, который выглядит как $6$salt ...
). есть пакет perl-crypt-passwdmd5
, но нет sha2
или sha512
, поэтому я протестировал его с помощью mkpasswd:
$ mkpasswd -S "saltsalt" -m SHA-512 secret
$6$saltsalt$TVLlQcbpFVof5W3Yz4DTP6gRstiNuHwwTt6GLc1E5n0U0aDehy0S5knV8wiOQSpT0Y77vwPZN.Pq.H91p5hVO1