Welcome to TechNet Blogs Sign in | Join | Help

フィールドSEあがりの安納です

Microsoft Evangelist -- Junichi Anno

News

  • お正月はオンラインセミナー 愛の戦士ですが何か?

    新着動画

    ・PowerPivotデモ

    ・SQL Azureの管理

    Twitter Updates

      follow me on Twitter

      Tech
    【IDM】パスワード同期機能の有効活用 その3 ~ unixUserPassword 属性から暗号化されたパスワードを取得する

    本日、健康診断に行ってきました。健康診断...実は苦手でして...

    いい歳して恥ずかしい話ですが....子供のころから、わきの下とわき腹が弱いのです。なので苦手なのは心電図...それに輪をかけてつらかったのは「腹部エコー検査」なるもの...。なんか、先のツルツルのヤツを使って、わきの下とかわき腹をしつこいくらいにグリグリされました。これは、もう、拷問としか言いようがありません。

    ということで、「わきの下とわき腹が弱いですが 何か?」 コミュニティを作り、医療機器業界に「わき腹非接触検査機器の開発」を働きかけると同時に、わきの下とわき腹がくすぐったくならない禁断の呪文を開発したいなぁと思う、今日この頃です。同士募集です。

    それはさておき、以下の続きとなる その3 です。

    今回は、unixUserPassword 属性から、NIS用に暗号化されたパスワードを取り出します。msSFU30userPassword と違い、ちょっとコツがいります。

    まずは、取り出しもとの unixUserPassword がいかなる特徴を持っているのか、見てみることにします。

    ということで、スキーマツールを開きましょう。

    Windows Server 2008 でのスキーマツールの開き方は従来通りです。以下のコマンドをコマンドプロンプトから入力後、mmc のツナップインに「Active Directory スキーマ」を追加してください。

    c:>regsvr32 schmmgmt.dll

    スキーマツールを起動したら、属性一覧の中から「 unixUserPassword 」 を探して、プロパティを開いてみてください。

    注意していただきたいのは、上記の赤丸の部分です。

    • オクテット文字列である
    • 複数値である(戻り値がアレイ形式である)

    オクテット文字列とは、文字列を1文字ごとに8ビットのバイナリ形式で保存する形式です...うーん、あたりまえですね。説明よりも、以下をご覧ください。unixUserPassword 属性に格納されている値を ADSI Edit で表示したものです。  一見、何が格納されているかわからないですね。

    上のバイナリ値の最初の「 01001101 」を 10進数に変換すると 77 になります。77...何か心当たりありませんか? 子供の頃に食べたアイスクリームのような....そう、「M」のアスキーコードです。

    では、次の 00110111 はどうでしょう?10進にすれば 55 。これは、「7」ですね。子供の頃から そういう教育をされてきた私にとっては朝飯前です。

    といった感じで見ていくと、上記は「 M7hlyUsc6diZ. 」 となり、DES で暗号化されたパスワードだなぁということがわかります。

    そんなわけで、スクリプトで取得するには以下のようになります。VBScript で書かれているので、拡張子を vbs として保存してください。

    strDomain = "dc=example64,dc=jp"
    strUserName = "testuser001"

    Set objConnection = CreateObject("ADODB.Connection")
    objConnection.Open "Provider=ADsDSOObject;"
    Set objCommand = CreateObject("ADODB.Command")
    objCommand.ActiveConnection = objConnection
    objCommand.CommandText = _
            "<LDAP://" & strDomain & ">;" & _
            "(&(objectCategory=person)(objectClass=user)" & _
            "(sAMAccountName=" & strUserName & "));" & _
            "sAMAccountName,unixUserPassword;" & _
            "subtree"
    Set objRecordSet = objCommand.Execute

    Do Until objRecordset.EOF

       arrUNIXUSERPASSWORD = objRecordset.Fields("unixUserPassword")  ' 取得したパスワードを arrUNIXUSERPASSWORD に格納

       For i = 1 To LenB(arrUNIXUSERPASSWORD(0))  ' arrUNIXUSERPASSWORDはアレイ値なので、(0) で1番目の値を取り出す

           strA = MidB(arrUNIXUSERPASSWORD(0), i, 1) ' MidB で1バイトずつ取り出し
           strB = AscB(strA)   ' いったんアスキーコードにしてから
           strUnixUserPassword = strUnixUserPassword & Chr(strB) ' 元の文字に戻してあげる

       Next

       objRecordset.movenext

    Loop

    wscript.echo strUnixUserPassword

     

    上記のように、MidB、AscB、Chr(またはChrB)を使うというコツはいりますが、なれればオクテット値なんて怖くありません。

    さて、こうして取り出した値をどうやって OpenLDAP に同期するのか...

    ひとまずすぐに思いつくのは perl の Net::LDAP です。これは実績もあります。

    まだ、ADSI を試してみたことは無いのですが、どなたか試された方いらっしゃいますか?

    こんな方法が簡単!という案があれば是非ともご連絡ください。blog にてご紹介させていただきます。

    ちなみに、KBには、以下のような情報が公開されています。次回は、以下について解説をつけたいと思います。

    INFO: How to Use ADSI to Query a Third-Party LDAP Server
    http://support.microsoft.com/kb/251195/en-us

     

    Comments

    Shigeya Tanabe's blog said:

    同僚の安納さんのブログで、Active Directory と Unix/Linux のパスワードの同期機能について、Windows Server 2008 での方法が詳しく書かれています。 【IDM】パスワード同期機能の有効活用

    # May 13, 2008 8:41 AM

    フィールドSEあがりの安納です said:

    当初の予定を変更し、パスワードの暗号化について、ちょっとだけ触れておきたいと思います 以下では、Active Directory に格納された DES / MD5 形式のパスワードをそのままとりだしました。取り出したまま

    # May 13, 2008 2:01 PM

    フィールドSEあがりの安納です said:

    昔、「おしいれのぼうけん」ていう絵本がありました。いまでもトラウマです...ねずみばぁさん...。 そんなノスタルジックな想いはともかく、現実に戻って OpenLDAP にパスワードを同期する方法について考察します。

    # May 17, 2008 1:56 PM

    フィールドSEあがりの安納です said:

    ある調べごとがあり、「'watch node'」 という単語を 某検索エンジンに放り込んだところ、以下の表示が。 もしかして: 'watch nude ' し、し、しっ、失礼なっっっ! それはともかく、Active

    # May 21, 2008 3:58 AM

    フィールドSEあがりの安納です said:

    ある調べごとがあり、「'watch node'」 という単語を 某検索エンジンに放り込んだところ、以下の表示が。 もしかして: 'watch nude ' し、し、しっ、失礼なっっっ! それはともかく

    # May 21, 2008 4:02 AM

    フィールドSEあがりの安納です said:

    Software Disign 2009年3月号 からいらしたみなさん、こんにちは。 Appendix 「Active Directory の基礎知識」の「UNIX用ID管理」のインストール手順を、このページで補足いたします。

    # February 23, 2009 5:39 AM

    フィールドSEあがりの安納です said:

    【IDM】パスワード同期機能の有効活用 その1 ~ パスワード同期機能とは 【IDM】パスワード同期機能の有効活用 その2 ~ Windows Server 2008 でのパスワード同期機能のセットアップ

    # May 1, 2009 1:28 PM
    Anonymous comments are disabled
    Page view tracker