Que comandos irão mudar as senhas do Open Directory?

3

Eu entendo o Open Directory como OpenLDAP + SASL (Password Server) + Kerberos. Parece que o OpenLDAP adia para o SASL para autenticação; Eu não sei sobre o Kerberos.

Eu quero alterar as senhas de usuário de um script, de preferência remotamente, e quero que a senha seja alterada corretamente. (ou seja, em nenhum caso eu quero que um usuário tenha uma senha diferente, dependendo de qual dos três serviços que entram no Open Directory em que eles autenticam.)

Eu posso fazer um dsimport através da rede muito bem de uma máquina que não está vinculada ao diretório, mas, quando você tenta importar uma senha (depite definindo o AuthType para dsAuthMethodStandard: dsAuthClearText), ele funcionará somente se a senha não foi definida antes. (Acredito que é possível definir uma senha da Criptografia, mas temo que isso signifique que somente a parte LDAP do OD saberá a senha atual.)

Existe algo que eu possa fazer antes de iniciar uma sessão ssh no servidor e alterar as senhas lá? Se eu fizer isso, existe algum comando que me permita especificar um número de usuários e suas novas senhas em uma linha?

Quais comandos funcionam para alterar todas as senhas de diretório abertas, e há alguém a quem preferir?

apropos password me dá esses resultados interessantes:

  • kpasswd (1) - altera a senha do Kerberos de um usuário
  • ldappasswd (1) - altera a senha de uma entrada LDAP
  • lppasswd (1) - adiciona, altera ou exclui senhas de compilação
  • passwd (1) - modificar a senha de um usuário
  • pwpolicy (8) - obtém e define políticas de senha
  • saslpasswd2 (8) - define a senha sasl de um usuário
  • slappasswd (8) - Utilitário de senha do OpenLDAP

Examinarei algumas das páginas do manual, e tenho a impressão de que pwpolicy é a melhor escolha, mas adoraria saber se há alguma sutileza para usá-las (por exemplo, don altere a senha do Kerberos sem alterar também as senhas LDAP e SASL) e se alguma delas funcionar remotamente sem uma sessão ssh.

    
por Clinton Blackmore 20.08.2009 / 22:17

4 respostas

5

A resposta mais útil que encontrei é usar o comando passwd em conjunto com dscl. Aqui está a saída de uma sessão interativa (com as senhas substituídas por asteriscos):

$ 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

Aqui está um script python para fazer as alterações. Você precisará do módulo pexpect ( sudo easy_install pexpect deve obtê-lo para você; não creio que você precise das ferramentas dev instaladas).

#!/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

Você pode usá-lo da seguinte maneira:

# 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']
    
por 28.08.2009 / 19:47
1

Tenha em mente que a senha em cada porta-chaves de login do usuário é normalmente mantida sincronizada com a senha do Open Directory. O Mac OS X é inteligente o suficiente para usar a senha digitada na janela de login para não apenas autenticar o usuário em relação ao OD, mas também desbloquear seu keychain. Se as duas senhas ficarem fora de sincronia, isso será inconveniente e confuso para a maioria dos usuários.

AFAIK, nenhum dos métodos de alteração da senha do OD no lado do servidor é capaz de modificar a senha do conjunto de chaves do usuário. No entanto, as pessoas no AFP548 criam uma solução para esse problema chamado Keychain Minder que ajuda os usuários que entram nessa situação.

    
por 24.08.2009 / 18:37
1

tente usar

dscl -u xxxxxx -P xxxxxxx /LDAPv3/127.0.0.1/ -authonly username

e depois

dscl -u diradmin -P xxxxx /LDAPv3/127.0.0.1/ -passwd Users/username newpassword

esses comandos podem ser executados na máquina local ou em uma máquina remota. O cliente remoto deve estar conectado ao diretório no Utilitário de Diretório. Uma verificação de autenticação remota de uma máquina autorizada parece

dscl -u diradmin -P 123456 /LDAPv3/ldap.remote.com/ -authonly username

eu também usei

dscl -u diradmin -P 123456 -url //LDAPv3/ldap.remote.com/ -authonly username
    
por 31.07.2012 / 16:06
0

Aqui estão algumas coisas úteis que aprendi:

A partir do documento de administração da linha de comandos do OS X 10.5, p 261, "Gerenciando senhas do Open Directory":

Managing Open Directory Passwords

When a user’s account has a password type of Open Directory, the user can be authenticated by Kerberos or the Open Directory Password Server. Kerberos is a network authentication system that uses credentials issued by a trusted server.

The Open Directory Password Server supports traditional password authentication methods that some network services or users’ client applications require. Services can be configured to not allow Kerberos. In that case they use Password Server for user accounts with Open Directory passwords.

Neither Kerberos nor the Open Directory Password Server stores the password in the user’s account. Both Kerberos and the Open Directory Password Server store passwords in secure databases apart from the directory domain and they never allow passwords to be read. Passwords can only be set and verified.

Open Directory Password Server

Password Server uses standard Simple Authentication and Security Layer (SASL) technology to negotiate an authentication method between a client and a service. Password Server supports multiple authentication methods, including APOP, CRAM- MD5, DHX, Digest-MD5, MS-CHAPv2, NTLMv1 and NTLMv2, LAN Manager, and WebDAV-Digest.

Open Directory also provides authentication services using shadow passwords, which support the same authentication methods as Password Server.

Em relação ao uso de ldappasswd , o comando admin da linha de comando informa ainda:

Apple recommends using passwd instead of ldappasswd. For more information, see the passwd man page.

man passwd refere-se a uma ferramenta OpenSSL que calcula hashes de senha. Para obter a man page para o comando passwd que você realmente quer, man /usr/share/man/man1/passwd.1.gz é mais útil.

    
por 24.08.2009 / 17:50