3 Minutes NetWorking Supplement
No.12

3Minutes NetWorking Supplement

補講第12回LDAP(4) 機能モデル(1)

■ 機能モデル

おねーさん

おね〜さんと、

ほげたん

ほげたんのっ!!

おねーさん

3 Minutes Networking、

ほげたん

Supplement !!

おねーさん

ん〜。プロトコルモデル、情報モデル、名前付けモデルと話をしてきたわけだけど。

ほげたん

うん。TCPを使ったクライアント・サーバモデル、DITとオブジェクト、DNとRDN、だったよね。

おねーさん

まぁ、簡単にまとめるとそうなるわね。で、今回は機能モデルを説明しようかと。

ほげたん

機能モデル? 機能っていうと〜、LDAPの機能だから、ディレクトリの検索?

おねーさん

そうね、それがメインよね。つまり、LDAPによるディレクトリに対するオペレーションが今回の話。

ほげたん

オペレーション? あぁ、操作ね。

おねーさん

そゆこと。さてさて、LDAPってなんでその名前があるんだっけ?

ほげたん

え? Lightweight(軽量)のDAP[Directory Access Protocol]だから?
X.500のDAPを軽量化したから、だったよね。

おねーさん

そうそう、X.500DAPがあって、それを軽量化したんだったわよね。X.500は優れたプロトコルだけど、その豊富な機能が逆にアダとなっていた、という話を前したわよね。

ほげたん

まぁ、標準化団体が作るのってそういう傾向があるよねぇ。

おねーさん

あるわね、標準化するあまりって奴ね。まぁ、それはいいとして、このオペレーション部分がLDAPとX.500DAPで異なるわけ。つまり、X.500DAPの多彩な機能を、よく使われる機能のみ抽出したものがLDAPってことね。

ほげたん

へぇ。よく使われるのって何?

おねーさん

次の3つね。

  • 認証 … bind、unbind
  • 検索・比較 … search、compare
  • 更新 … add、delete、modify、modify-DN、abandon
ほげたん

認証、検索・比較、更新。これ、ディレクトリに対する操作だよね?

おねーさん

もちもち。で、まず、LDAPは前も話したように「要求」と「応答」から成り立ってるわけで。
このLDAPメッセージだけど、ちょっとわかりにくいというか、う〜ん。

ほげたん

わかりにくいの?

おねーさん

例えば、HTTPを考えてみると、操作ってメソッドでしょ。GET、POST、HEADなどね。
でも、HTTPメッセージって、メソッドによってメッセージ構造って変わらないでしょ?

ほげたん

変わらないね。HTTP要求メッセージだと、メソッド、URI、バージョン、メッセージヘッダ、ボディ。ヘッダはあったりなかったりするけど、構造自体は変わらないよね。

おねーさん

DNSやFTPでも基本的には変わらないでしょ。でも、LDAPは操作によって構造が違うわけ。
この構造、メッセージフォーマットは、ASN.1によって記述されてるんだけど、これがまたわかりにくいのよ。

ほげたん

あせん・わん?

おねーさん

ASN.1についてはまたいずれ。でで、これからその操作による構造なんかも話しながら、操作について説明していくわね。

ほげたん

了解です。

■ 認証オペレーション

おねーさん

まず、認証オペレーションからいきましょう。え〜っと、何やるかわかるわよね。

ほげたん

認証でしょ?

おねーさん

ストレートねぇ。まぁ、そうなんだけど。つまり、ディレクトリに対してのユーザ確認ね。
LDAPではこのbind操作をまず行う。すべてのオペレーションはbindから始まるってことね。

ほげたん

なるほど。操作するにはまず認証が必要なんだね。理にかなってるっていえばそうだね。

おねーさん

でしょ。で、まずこのBind要求メッセージの中身を説明すると。

  • BindRequest ::= [APPLICATION 0] SEQUENCE{
    • version     INTEGER (1 .. 127),
    • name       LDAPDN,
    • authentication  AuthenticationChoice}
  • AuthenticationChoice ::={
    • simple [0] OCTET STRING,
    •    -- 1 and 2 reserved
    • sasl  [3] SaslCredentials}
ほげたん

……何コレ?

おねーさん

これがASN.1による構文ね。まぁ、今までのように書くとこんな感じ?

Bind要求

[FigureSP12-01:Bind要求]

ほげたん

あー、あーあー。なんとなくさっきのASN.1の意味がわかるような。
バージョンはともかく、ユーザのDNと、認証情報ってことだね。っていうか、こっちで書いてよ、おね〜さん。

おねーさん

正式にはASN.1だからねぇ。まぁ、いいでしょ。ASN1.構文長いし。
で、Authenticationのところ、0と3の2つのチョイスがあるんだけど、BINDには3種類の認証が存在するの。

  • Anonymous Bind … 匿名認証。匿名によるアクセス
  • Simple Bind … 単純認証。ユーザIDを使用した認証
  • SASL Bind … SASL認証。SASLを使用する認証
ほげたん

? Authenticationは0と3の2種類なのに、3種類?
それにSASLって初耳なんですけど? ▼ link

おねーさん

汎用認証プロトコルね。SSL/TLSと同じような感じで、使うの。
ともかく、このSASLは置いておくとして。

ほげたん

置いとくんだ。

おねーさん

SASLの説明まで話すと長いし。というわけで、チョイス「0」で匿名認証と単純認証の2種類を説明するわね。
bind操作はこのようになるわけ。

[FigureSP12-02:Bind操作]

ほげたん

値があるかないかで、匿名認証か単純認証か変わるってことだね。

おねーさん

そういうことね。ポイントとしては、まず、サーバがどの認証を受け入れるかは、サーバ側の設定次第ってことね。匿名はダメとか、名前のみ単純はダメとか。

ほげたん

必ずしも匿名認証が可能ってわけじゃないんだね。

おねーさん

そしてもう1つ。パスワードは平文になっちゃうってこと。パスワードの保護をしたい場合は、SASLを使うか、SSL/TLSを使ってLDAPSにするか、しないとダメね。

ほげたん

なるほど。

おねーさん

さてさて、一方のunbind操作だけど、これはディレクトリアクセスの終了の際に行う操作になるわ。
unbind操作は要求のみで応答がない操作で、unbindを受け取ったサーバはそのまま切断するわけ。

ほげたん

bindで接続をかけて、ディレクトリにアクセス後、unbindで切断、ということだね。

■ 検索・比較オペレーション

おねーさん

さてさて、次が検索・比較オペレーションね。

ほげたん

検索[search]、比較[compare]だね。

おねーさん

まぁ、わかると思うけど、条件を満たすエントリを探し、そのエントリの情報を読み出すの検索、指定したエントリが属性値を持っているか調べるの比較。この2つの操作ね。

ほげたん

っていうか、要はディレクトリに対する検索なんでしょ?

おねーさん

ストレートに言えばそうね。つまり、ディレクトリサービスとしての機能こそがこの検索操作になるわけね。

ほげたん

そうだね、ディレクトリサービスって「ディレクトリを作成・管理し、その情報を検索して提供する」んだから、検索って必須機能だもんね。

おねーさん

さて、その検索機能だけど、え〜っと、ホントはASN.1書くのがいいんだけど、まぁアレ面倒くさいし。
ま、search要求メッセージに含まれるのはこういうの。

パラメータ意味
baseObjectDN検索するDITの起点となるエントリ
scope0〜20baseObjectのみを検索対象とする
1baseObjectの直下のエントリを検索対象とする
2baseObjectを起点とするDITすべてを検索対象とする
derefAliases0〜2別名エントリをどうするか
sizeLimit数値検索結果の最大数
timeLimit数値時間の制限
typesOnlyBoolean属性値を読み出すかどうか
Filter数値・文字列など検索条件
attributes数値・文字列など読み出す属性

[TableSP12-01:search要求]

ほげたん

Booleanってなんだっけ?

おねーさん

「真(true)」か「偽(false)」かの値のことね。
ともかく、ポイントの1つ目はbaseObjectとscope。DITのどこを検索するかという範囲を決めるわけね。

baseObjectとscope

[FigureSP12-03:baseObjectとscope]

おねーさん

見てわかると思うけど、baseObjectでDITのツリー(サブツリー)を決定し、scopeでさらに範囲を絞るっていうイメージかな。

ほげたん

うん、わかるよ。

おねーさん

次はfilter。フィルタってことだから、検索結果にフィルタをかけるって意味でしょ。これで「望む結果だけを得る」ためにフィルタをかける、つまり、検索条件になるわけね。条件にはいくつかあるわ。

チョイス番号意味
and0論理積。条件をANDで結合
or1論理和。条件をORで結合
not2否定。条件を否定
equalityMatch3同値。同じ属性値があるか
substrings4部分一致文字列。指定した文字列を含むか。前方、後方など
greaterOrEqual5以上。指定した値以上か
lessOrEqual6以下。指定した値以下か
present7指定した属性が存在するか
approxMatch8近似。ほぼ一致するか
extensibleMatch9拡張一致。実装により異なる

[TableSP12-02:filterパラメータ]

おねーさん

これらの値で、条件をつけて、望む属性型、属性値を入手するわけね。

ほげたん

なるほどだけど、もうちょっと具体例が欲しいかな?

おねーさん

我侭ねぇ。具体例の前にもう1つだけ。typesOnlyパラメータは「属性値を読み出すかどうか」で、これをtrueにしておかないと、属性型だけ入手することになるわけ。

ほげたん

ん? 属性型だけ?

おねーさん

typesOnlyがfalseの時は、持っている属性型だけが検索結果で入手できるのよ。
ちなみに、どの属性型を入手したいかという条件はattributesパラメータで指定する、と。

ほげたん

う〜ん。わかるようなわからないような。

おねーさん

じゃあ、例をだしてみましょう。

[FigureSP12-04:search操作]

ほげたん

なるほどだよ。

おねーさん

で、もう1つのことを話さないと。比較[compare]操作。これは「指定したエントリが属性値を持っているか調べる」って説明したわね。

ほげたん

ん〜でも、おね〜さん。その属性値を持っているかどうか調べるんだったら、search操作でもできるじゃない?
例えば、さっきの例でいくと…。

  • 太山田一郎がphonenumber09012345678を持っているかどうか比較したい
    • baseObject:cn=太山田一郎,ou=一課,ou=営業部,o=ABC商事,c=JP
    • scope:1
    • filter:チョイス=3,phonenumber=09012345678
ほげたん

これで、太山田一郎だけを検索(baseObjectに太山田一郎のエントリを指定、scopeは1のためbaseObjectだけ検索)するし、これでエラーが返ってきたら、phonenumberが09012345678じゃないってことだし、返ってきたらOKってことでしょ?

おねーさん

うん、たしかにほげたんの言うとおり、間違ってない。

ほげたん

でしょ〜〜〜。

おねーさん

うん。今の返答はちょっとムカついたから、あとでちょっとだけ向こうの世界を見てもらうとして。

ほげたん

………。

おねーさん

searchで比較操作もできないこともないけど、ちょっと問題があるのよ。
それは、search応答に「値が入ってしまう」ことよ。

ほげたん

それのどこが問題なの? 値が入って正常な応答なら、属性値を持ってる。
値が入ってない、否定応答なら、属性値を持ってない。でしょ?

おねーさん

まぁそうなんだけど。つまり比較操作は、検索操作で「値が入って困る」時に使うの。
つまり、パスワード入力などね。

ほげたん

パスワード入力?

おねーさん

そう、こんな感じ。

[FigureSP12-05:compare操作]

ほげたん

なるほど。「読み取られたくない属性値」が「一致するかどうか」を確認できるわけなんだ。

おねーさん

そうそう。そういうこと。
他にもね、こういうのもあるわけ。

search操作での問題

[FigureSP12-06:search操作での問題]

おねーさん

エントリにない属性の検索、この場合initials(イニシャル)なんだけど、これを行った場合は「エラー応答」しか検索操作では帰ってこないわけ。その属性値が一致しないのか、属性そのものがないのかわからないの。

ほげたん

比較操作は違う?

おねーさん

そゆこと。比較操作は応答のコードがそれぞれで異なるから、「属性値不一致」なのか「属性値がない」のか識別できるわけ。

ほげたん

なるほど。使い道がやっぱり違うわけだね。

おねーさん

さて、次の更新操作だけど。思ったより認証と検索・比較にてまどっちゃったから、次回にしましょ。

ほげたん

ありゃ。

おねーさん

じゃ、また次回。次回でLDAPも終わりかな?
おね〜さんと、

ほげたん

ほげたんのっ!!

おねーさん

3分間ネットワーク、

ほげたん

サプリメントでした〜〜〜っ!!

SASL
[Simple Authentication and Security Layer]
コネクションベースのプロトコルに認証や暗号化を提供するレイヤ。SMTPやAPOPで使用されているプロトコル。RFC2222で規定。
ASN.1
[Abstract Syntax Notation 1]
ISOによって定められている抽象構造記法。構造を記述するために使われる汎用言語。SNMPのMIB、Kerberosなどのフォーマットはコレによって記述されている。
読みは「アセン・ワン」。
Boolean
true(真)とfalse(偽)の値を持つ型のこと。読みは「ブーリアン」。
ほげたんほげたんの今日のポイント
  • ディレクトリへのアクセスには認証、検索・比較、更新がある。
  • 認証操作にはbindとunbindがある。
    • 認証操作によりユーザの認証を行う。
    • ディレクトリアクセスの最初にbind、最後にunbindを必ず行う。
  • 検索・比較操作にはsearchとcompareがある。
    • エントリの属性や属性値を検索して読み出すのがsearch。
    • エントリが属性値を持っているか調べるのがcompare。

3 Minutes NetWorking Supplement No.12

管理人:aji-ssz(at)selene.is.dream.jp