Я понимаю, что Open Directory - это OpenLDAP + SASL (сервер паролей) + Kerberos. Похоже, что OpenLDAP использует SASL для аутентификации; Я не знаю насчет Kerberos.
Я хочу изменить пароли пользователей из сценария, желательно удаленно, и хочу, чтобы пароль был изменен правильно. (т.е. я ни в коем случае не хочу, чтобы у пользователя был другой пароль в зависимости от того, в какой из трех служб, входящих в Open Directory, они аутентифицируются.)
Я могу сделать dsimport
по сети отлично с машины, которая не привязана к каталогу, но, когда вы пытаетесь импортировать пароль (установите AuthType на dsAuthMethodStandard: dsAuthClearText), он будет работать, только если пароль не был установлен раньше. (Я считаю, что можно установить пароль Crypt, но я боюсь, что это означает, что только часть LDAP OD будет знать текущий пароль.)
Могу ли я что-нибудь сделать, кроме запуска ssh-сеанса на сервере и изменения там паролей? Если я это сделаю, есть ли какая-нибудь команда, которая позволит мне указать количество пользователей и их новые пароли в одной строке?
Какие команды работают для изменения паролей всех открытых каталогов, и есть ли какие-нибудь предпочтения?
apropos password
дает мне следующие интересные результаты:
Я просмотрю некоторые страницы руководства и у меня сложится впечатление, что pwpolicy
- лучший выбор, но я хотел бы знать, есть ли какие-либо тонкости в их использовании (например, не меняйте пароль Kerberos, не меняя также пароли LDAP и SASL), и работают ли какие-либо из них удаленно без ssh-сессия.
Самый удобный ответ, с которым я столкнулся, - использовать команду passwd вместе с dscl. Вот результат интерактивного сеанса (пароли заменены звездочками):
$ dscl -u diradmin -p ces
Password:
> cd /LDAPv3/127.0.0.1/
/LDAPv3/127.0.0.1 > auth diradmin *****
/LDAPv3/127.0.0.1 > passwd Users/Atwo807 *****
/LDAPv3/127.0.0.1 > passwd Users/Atwo249 *****
/LDAPv3/127.0.0.1 > passwd Users/doesnotexist foobar
passwd: Invalid Path
<dscl_cmd> DS Error: -14009 (eDSUnknownNodeName)
/LDAPv3/127.0.0.1 > exit
Goodbye
Вот скрипт Python для внесения изменений. Вам понадобится модуль pexpect (sudo easy_install pexpect
должен получить это для вас; Я не думаю, что вам нужны установленные инструменты разработчика).
#!/usr/bin/env python
import pexpect
def ChangePasswords(host, path, diradmin, diradmin_password, user_passwords, record_type='Users'):
"""Changes passwords in a Open Directory or similar directory service.
host = the dns name or IP of the computer hosting the directory
path = the pathname to the directory (ex. '/LDAPv3/127.0.0.1')
diradmin = the directory administrator's shortname (ex. 'diradmin')
diradmin_password = the directory administrator's password
user_passwords = a dictionary mapping record names (typically, user's short
names) onto their new password
record_type = the sort of records you are updating. Typically 'Users'
Returns a tuple. The first entry is a list of all records (users) who
failed to update. The second entry is a list of all records (users)
who successfully updated.
"""
failed_list = []
succeeded_list = []
prompt = " > "
child = pexpect.spawn("dscl -u %s -p %s" % (diradmin, host))
if not (ReplyOnGoodResult(child, "Password:", diradmin_password) and
ReplyOnGoodResult(child, prompt, "cd %s" % path) and
ReplyOnGoodResult(child, prompt,
"auth %s %s" % (diradmin, diradmin_password)) and
ReplyOnGoodResult(child, prompt, None)):
print "Failed to log in and authenticate"
failed_list = user_passwords.keys()
return (failed_list, succeeded_list)
# We are now logged in, and have a prompt waiting for us
expected_list = [ pexpect.EOF, pexpect.TIMEOUT,
'(?i)error', 'Invalid Path', prompt ]
desired_index = len(expected_list) - 1
for record_name in user_passwords:
#print "Updating password for %s" % record_name,
child.sendline("passwd %s/%s %s" % (record_type, record_name,
user_passwords[record_name]))
if child.expect(expected_list) == desired_index:
#print ": Succeeded"
succeeded_list.append(record_name)
else:
#print ": Failed"
failed_list.append(record_name)
child.expect(prompt)
child.sendline("exit")
child.expect(pexpect.EOF)
return (failed_list, succeeded_list)
def ReplyOnGoodResult(child, desired, reply):
"""Helps analyze the results as we try to set passwords.
child = a pexpect child process
desired = The value we hope to see
reply = text to send if we get the desired result (or None for no reply)
If we do get the desired result, we send the reply and return true.
If not, we return false."""
expectations = [ pexpect.EOF, pexpect.TIMEOUT, '(?i)error', desired ]
desired_index = len(expectations) - 1
index = child.expect(expectations)
if index == desired_index:
if reply:
child.sendline(reply)
return True
else:
return False
Вы можете использовать его следующим образом:
# This example assumes that you have named the script given above 'pwchange.py'
# and that it is in the current working directory
import pwchange
(failed, succeeded) = pwchange.ChangePasswords("ces", "/LDAPv3/127.0.0.1",
"diradmin", "******",
{ 'Atwo807' : '*****', 'Atwo249' : '*****',
'Nonexist' : 'foobar', 'Bad' : 'bad' })
print failed, succeeded
['Bad', 'Nonexist'] ['Atwo249', 'Atwo807']
попробуйте использовать
dscl -u xxxxxx -P xxxxxxx /LDAPv3/127.0.0.1/ -authonly username
а потом
dscl -u diradmin -P xxxxx /LDAPv3/127.0.0.1/ -passwd Users/username newpassword
эти команды могут выполняться с локального или удаленного компьютера. Удаленный клиент должен быть подключен к каталогу в утилите каталогов. Удаленная проверка аутентификации с авторизованного компьютера выглядит так:
dscl -u diradmin -P 123456 /LDAPv3/ldap.remote.com/ -authonly username
я также использовал
dscl -u diradmin -P 123456 -url //LDAPv3/ldap.remote.com/ -authonly username
Имейте в виду, что пароль в цепочке ключей входа каждого пользователя обычно синхронизируется с их паролем Open Directory. Mac OS X достаточно умен, чтобы использовать пароль, введенный в окне входа в систему, не только для аутентификации пользователя по OD, но и для разблокировки их связки ключей. Если два пароля не синхронизируются, это будет неудобно и запутать большинство пользователей.
AFAIK, ни один из методов изменения пароля OD на стороне сервера не может изменить пароль связки ключей пользователя. Однако люди в AFP548 создают решение этой проблемы под названием Брелок Minder что помогает пользователям, попавшим в такую ситуацию.
Вот несколько полезных вещей, которые я узнал:
Из документации администратора командной строки для OS X 10.5, стр. 261, «Управление паролями открытого каталога»:
Управление паролями Open Directory
Когда учетная запись пользователя имеет тип пароля Open Directory, пользователь может быть аутентифицирован с помощью Kerberos или сервера паролей Open Directory. Kerberos - это сетевая система аутентификации, использующая учетные данные, выданные доверенным сервером.
Сервер паролей Open Directory поддерживает традиционные методы аутентификации по паролю, которые требуются для некоторых сетевых служб или клиентских приложений пользователей. Службы можно настроить так, чтобы не разрешать Kerberos. В этом случае они используют сервер паролей для учетных записей пользователей с паролями Open Directory.
Ни Kerberos, ни сервер паролей Open Directory не хранят пароль в учетной записи пользователя. И Kerberos, и сервер паролей Open Directory хранят пароли в защищенных базах данных, кроме домена каталога, и никогда не позволяют читать пароли. Пароли можно только установить и проверить.
Сервер паролей Open Directory
Сервер паролей использует стандартную технологию простой аутентификации и уровня безопасности (SASL) для согласования метода аутентификации между клиентом и службой. Сервер паролей поддерживает несколько методов аутентификации, включая APOP, CRAM-MD5, DHX, Digest-MD5, MS-CHAPv2, NTLMv1 и NTLMv2, LAN Manager и WebDAV-Digest.
Open Directory также предоставляет услуги аутентификации с использованием теневых паролей, которые поддерживают те же методы аутентификации, что и сервер паролей.
Что касается использования ldappasswd
, в административном документе командной строки говорится:
Apple рекомендует использовать passwd вместо ldappasswd. Для получения дополнительной информации см. Справочную страницу passwd.
man passwd
относится к инструменту OpenSSL, который вычисляет хэши паролей. Чтобы получить страницу руководства для действительно нужной команды passwd, man /usr/share/man/man1/passwd.1.gz
полезнее.