連載
» 2007年07月13日 00時00分 UPDATE

Undocumented Mac OS X:第6回 迷走の痕跡を抱えるMac OS XのOpenDirectory (1/3)

Mac OS Xにはじめて触ったUNIX使いが戸惑う要素として、先進的なアカウント管理機構OpenDirectoryがある。前回に引き続き、その仕組みについて解き明かしていく。

[白山貴之,ITmedia]

OpenDirectoryの構成要素

 OpenDirectoryの構成要素は図1にあるとおりだ。OpenDirectory対応のアプリケーションは、Directory Serviceフレームワークを通じてDirectoryServiceデーモンへアクセスし、DirectoryServiceデーモンは指定のプラグインを経由してサービスの検索やアカウント情報の取得を行う。

図1 図1 OpenDirectoryの構成。OpenDirectoryは、各アプリケーションに結びつくDirectoryServiceフレームワーク、検索を行うDirectoryServiceデーモン、それぞれのデータベースに応じたプラグインによって構成される

 どのプラグインをどんな順番で使うかは、「アプリケーション」フォルダ下の「ユーティリティ」にある「ディレクトリアクセス」によって設定される。プラグインとしては、NetInfo、LDAP v3、ActiveDirectoryといった主にユーザーアカウントを管理するディレクトリサービス向けのものと、SLP*、SMB/CIFS、AppleTalk*、Bonjour*といった主に名前解決やファイル共有などのサービス取得のためのものがある。また、/etc/passwdのようなテキストファイルやNISへのアクセスを行う「BSDフラットファイルおよびNIS」プラグインも用意されている(図2)

図2 図2 「ディレクトリアクセス」のメインウィンドウ。ここでどういったディレクトリサービスを見にいくか、どの順番で見に行くかを決定する

 これらを有効にすることでサービスへの検索が行われ、逆に無効にすることでサービスへの情報取得が行われなくなる。アカウント情報については、さらに「認証」のタブでどのディレクトリサービスから検索するかという順番を指定できる。NetInfoではサーバ側で階層構造が決まっていたが、OpenDirectoryではクライアント側でも指定できるという点が大きな違いであるといえる。

 なお、この「ディレクトリアクセス」で設定を間違えるとMac OS Xに2度とログインできなくなるといった致命的な障害も起きかねないので、操作する場合はくれぐれも注意されたい。

UNIXのC言語から見た処理

 実際のところ、アプリケーションの開発者がDirectoryServiceフレームワークを直接操作する必要はほとんどなく、より上位のCocoaやCarbonといったフレームワークを通じて適宜操作が行われる。

 少々複雑なのが、UNIXのC言語から見た処理だ。SolarisやLinuxといったほかのUNIX系のOSでは、gethostbyname(3)のようなnetdb.hに属する関数、getpwent(3)やgetgrent(3)といったユーザーアカウント情報にアクセス関数を呼び出すと、/etc/nsswith.confの設定に従いnss_から始まるプラグインをロード、/etc/passwdやLDAPサーバ、DNSといった情報源へアクセスする。しかし、Mac OS XのNeXTSTEP由来のLibcでは、そうしたリクエストはすべてSunRPCでlookupdへ転送される*のだ(図3)

図3 図3 lookupdを経由してしまう検索。gethostbyname(3)やgetpwent(3)のようなUNIX由来のAPIの場合、Libcからlookupdに転送される。lookupdは、これまでに行った問い合わせの結果をキャッシュしているCacheAgentや、/etc以下のファイルを検索するFlatFle Agent、NetInfoへの問い合わせを行うNetInfo Agentなどを駆使して情報の取得を試みる。Mac OS Xで追加されたのがDS Agentで、これはDirectoryServiceデーモンへさらに問い合わせをするというものだ

 lookupdもまた所定の設定に従い各種情報源へアクセスするが、nsswitchの場合と異なり*独立したプロセスとして動作しているため、そうした問い合わせの結果は積極的にlookupdの中にキャッシュされ、同じ問い合わせがきたときも効率良く返答できるようになっている。先に述べたように、NeXTSTEPでは、このlookupdがNetInfoサーバへ順に問い合わせることで階層的なディレクトリサービスが実現されていたが、Mac OS XではローカルのNetInfoサーバのみに問い合わせるようになっている。そして、DSAgentプラグインというサービスを通じてDirectoryServiceへ問い合わせを送り、情報を取得しているのだ。この部分はNetInfoとOpenDirectoryの統合がうまくいっていないところ、Appleの迷走の名残と言える。

このページで出てきた専門用語

SLP

Service Location Protocol。マルチキャストを利用し、LAN内にあるサービスの検索、告知、登録を行うためのプロトコル。AppleShareIPやMac OS X Serverでサポートされている。

AppleTalk

OpenDirectoryプラグインのAppleTalkは、正確にはNBP(AppleTalk Name Binding Protocol)というプロトコルを使用して、AppleTalkネットワーク上のホストの探索を行うものだ。AppleTalkそのものを使うかどうかは、「システム環境設定」の「ネットワーク」の項目にある「AppleTalk」タブの「AppleTalk使用」チェックで決まる。AppleTalkはもはや過去のプロトコルであるため、Mac OS 8以前のどうしようもなく古いMacとどうしても通信しなければならないという限定された状況以外ではオフにしておくべきだ。

Bonjour

旧名Rendezvous。Multicast DNSとDNS-SDというDNSをベースとしたプロトコルを用い、LANや一時的なネットワークにおける名前解決、サービスの告知、一覧を行うための仕組み。

Mac OS XのNeXTSTEP由来のLibcではそうしたリクエストはすべてSunRPCでlookupdへ転送される

起動途中やシングルユーザーモードでまだlookupdが起動していないという極めてまれな状態に限り、/etc以下のファイルを見るという動作をする。

nsswitchの場合と異なり

nsswitchを使う場合も、nscdというデーモンプロセスを実行することでlookupdとほぼ同様の効果が得られる。


関連キーワード

Apple | LDAP | Mac | Mac OS X | 認証 | パスワード | UNIX


       1|2|3 次のページへ

Copyright© 2016 ITmedia, Inc. All Rights Reserved.

Loading

ピックアップコンテンツ

- PR -

注目のテーマ