web-dev-qa-db-ja.com

Open Directoryのパスワードを変更するコマンドは何ですか?

OpenDirectoryがOpenLDAP + SASL(パスワードサーバー)+ Kerberosであることを理解しています。 OpenLDAPは認証のためにSASLに依存しているようです。 Kerberosについては知りません。

スクリプトから、できればリモートでユーザーパスワードを変更したいのですが、パスワードを適切に変更したいのです。 (つまり、認証するOpen Directoryにアクセスする3つのサービスのどれに応じて、ユーザーに異なるパスワードを設定する必要はありません。)

ディレクトリにバインドされていないマシンからネットワーク経由でdsimportを正常に実行できますが、パスワードをインポートしようとすると(AuthTypeをdsAuthMethodStandard:dsAuthClearTextに設定しているにもかかわらず)、それは機能します。パスワードが以前に設定されていない場合。 (Cryptパスワードを設定することは可能だと思いますが、それはODのLDAP部分だけが現在のパスワードを知っていることを意味するのではないかと心配しています。)

サーバーへのsshセッションを開始し、そこでパスワードを変更する以外にできることはありますか?その場合、ユーザー数と新しいパスワードを1行で指定できるコマンドはありますか?

開いているすべてのディレクトリパスワードを変更するために機能するコマンドはどれですか。また、優先するコマンドはありますか?

apropos passwordは私にこれらの興味深い結果を与えます:

  • kpasswd(1)-ユーザーのKerberosパスワードを変更します
  • ldappasswd(1)-LDAPエントリのパスワードを変更します
  • lppasswd(1)-ダイジェストパスワードを追加、変更、または削除します
  • passwd(1)-ユーザーのパスワードを変更します
  • pwpolicy(8)-パスワードポリシーを取得および設定します
  • saslpasswd2(8)-ユーザーのsaslパスワードを設定します
  • slappasswd(8)-OpenLDAPパスワードユーティリティ

いくつかのマニュアルページを見てみると、pwpolicyが最良の選択であるという印象を受けていますが、これらを使用することに微妙な点があるかどうかを知りたいです(たとえば、don LDAPおよびSASLパスワードも変更せずにKerberosパスワードを変更しないでください)、およびそれらのいずれかがsshセッションなしでリモートで機能する場合。

3

私が遭遇した最も便利な答えは、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']
5

通常、各ユーザーのログインキーチェーンのパスワードは、OpenDirectoryのパスワードと同期されていることに注意してください。 Mac OS Xは、ログインウィンドウで入力したパスワードを使用して、ODに対してユーザーを認証するだけでなく、キーチェーンのロックを解除するのに十分な機能を備えています。 2つのパスワードが同期しなくなると、ほとんどのユーザーにとって不便で混乱を招きます。

AFAIK、サーバー側でODパスワードを変更する方法はどれも、ユーザーのキーチェーンパスワードを変更することはできません。ただし、AFP548の担当者は、この状況に陥ったユーザーを支援する Keychain Minder と呼ばれるこの問題の解決策を作成します。

1
lukecyca

使ってみてください

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
1
drfoo

これが私が学んだいくつかの有用なものです:

OS X 10.5のコマンドライン管理ドキュメント、261ページ、「OpenDirectoryパスワードの管理」から:

オープンディレクトリパスワードの管理

ユーザーのアカウントのパスワードタイプがOpenDirectoryの場合、ユーザーはKerberosまたはOpen Directory PasswordServerによって認証されます。 Kerberosは、信頼できるサーバーによって発行された資格情報を使用するネットワーク認証システムです。

Open Directory Password Serverは、一部のネットワークサービスまたはユーザーのクライアントアプリケーションが必要とする従来のパスワード認証方法をサポートしています。 Kerberosを許可しないようにサービスを構成できます。その場合、OpenDirectoryパスワードを持つユーザーアカウントにPasswordServerを使用します。

KerberosもOpenDirectory Password Serverも、ユーザーのアカウントにパスワードを保存しません。 KerberosとOpenDirectory Password Serverはどちらも、ディレクトリドメイン以外の安全なデータベースにパスワードを保存し、パスワードの読み取りを許可しません。パスワードは設定と確認のみが可能です。

ディレクトリパスワードサーバーを開く

Password Serverは、標準のSimple Authentication and Security Layer(SASL)テクノロジを使用して、クライアントとサービスの間で認証方法をネゴシエートします。 Password Serverは、APOP、CRAM-MD5、DHX、Digest-MD5、MS-CHAPv2、NTLMv1およびNTLMv2、LAN Manager、WebDAV-Digestなどの複数の認証方法をサポートしています。

Open Directoryは、パスワードサーバーと同じ認証方法をサポートするシャドウパスワードを使用した認証サービスも提供します。

ldappasswdの使用に関して、コマンドライン管理ドキュメントにはさらに次のように記載されています。

Appleは、ldappasswdの代わりにpasswdを使用することをお勧めします。詳細については、passwdのmanページを参照してください。

man passwdは、パスワードハッシュを計算するOpenSSLツールを指します。本当に必要なpasswdコマンドのマニュアルページを取得するには、man /usr/share/man/man1/passwd.1.gzの方が便利です。

0