LDAPの最近のブログ記事

OpenLDAPのエントリに時刻を格納したい場合、「Generalized Time syntax」と呼ばれる書式で、時刻情報を格納することができる。
Generalized Time syntaxはRFC4517の「3.3.13 Generalized Time」で定義されている。
http://www.ietf.org/rfc/rfc4517.txt

Generalized Time syntaxの利用例としては、エントリの更新時刻を表すmodifyTimestamp属性だが、その時刻情報の最後には、「Z」が付いている。

modifyTimestamp: 20100121093114Z

このZは、GMTを表しているので、JSTで動作しているサーバーの時刻とは9時間ずれることに注意が必要。

Active Directoryに登録されているユーザーのパスワードを変更するときに、unicodePwd属性をreplaceしてしまうと、パスワード履歴のポリシーが効かないことを知った。

http://support.microsoft.com/kb/269190/ja

ここを参考に、unicodePwd属性をDELETE + ADDで処理すると、きちんと履歴のポリシーも反映されることが分かった。
ちなみに、複雑性のチェックは、REPLACEでも問題無かったので気づかなかった。

Pythonのテストプログラムはこんな感じ。



#!/usr/bin/python

import ldap

oldpassword = "pass12345"
newpassword = "newass"

def unicodePassword(plainpasswd):
return ('"%s"' % plainpasswd).encode("utf-16le")

ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
ldap.set_option(ldap.OPT_REFERRALS, 0)
conn = ldap.initialize("ldaps://win2008")
conn.bind_s("Administrator@example.com","adminpass")
username = "testuser1"
filter = "(sAMAccountName=%s)" % username
rt = conn.search_s("dc=example,dc=com", ldap.SCOPE_SUBTREE, filter)
for (dn,attrs) in rt:
if dn:
userdn=dn

print userdn

unipass = unicodePassword(newpassword)
oldunipass = unicodePassword(oldpassword)
mod_attrs = [(ldap.MOD_DELETE, 'unicodePwd', oldunipass)] + [(ldap.MOD_ADD,'unicodePwd',unipass)]
# mod_attrs = [(ldap.MOD_REPLACE, 'unicodePwd', unipass)]
conn.modify_s(userdn, mod_attrs)



Active Directoryからエントリを検索するときに、検索結果が1000件を越えると、
size limitのエラーになってしまう。
このような場合に備えて、paged control付きのsearchをpython-ldapでどのように
実装するか調べてみた。
python-ldapのsampleに入っているらしいけど、次のようなコードでできた。


#!/usr/bin/python
import ldap
from ldap.controls import SimplePagedResultsControl
url = "ldap://adserver.example.com"
base = "dc=example,dc=com"
filter = "sAMAccountName=*"
page_size = 1000
conn = ldap.initialize(url)
conn.simple_bind_s("Administrator@example.com","password")
lcon = SimplePagedResultsControl(ldap.LDAP_CONTROL_PAGE_OID, True, (page_size, ''))
msgid = conn.search_ext(base, ldap.SCOPE_SUBTREE, filter, serverctrls=[lcon])
pages = 0
while True:
    pages += 1
    print "============ Get page %d ==============" % (pages,)
    (rtype, rdata, rmsgid, serverctrls) = conn.result3(msgid)
    for item in rdata:
        print item[0]
    pctrls = [
        c
        for c in serverctrls
        if c.controlType == ldap.LDAP_CONTROL_PAGE_OID
        ]
    if pctrls:
        print pctrls
        (est, cookie) = pctrls[0].controlValue
        if cookie:
            lcon.controlValue = (page_size, cookie)
            msgid = conn.search_ext(base, ldap.SCOPE_SUBTREE, filter, serverctrls=[lcon])
        else:
            break
    else:
        break

slapxxxコマンドの実体

| コメント(0) | トラックバック(0)

OpenLDAPのslapcatとかslapaddとかのコマンドは、slapdへのシンボリックリンクだったとは。

slapcatの代わりに

# /usr/sbin/slapd -T cat

も同じ結果を得ることができる。

OpenLDAP 2.4は2.3より遅い

| コメント(0) | トラックバック(0)

http://www.openldap.org/lists/openldap-devel/200907/msg00025.html

slamdによる計測結果だと、3割近く遅いらしい。
パッチで少し改善したみたいだけど、まだまだ2.3のほうが速い模様。

OpenLDAP 2.4.17でスキーマをチェックするslapschemaコマンドが追加されたみたい。