第6回 迷走の痕跡を抱えるMac OS XのOpenDirectory:Undocumented Mac OS X(3/3 ページ)
Mac OS Xにはじめて触ったUNIX使いが戸惑う要素として、先進的なアカウント管理機構OpenDirectoryがある。前回に引き続き、その仕組みについて解き明かしていく。
パスワードの保管方式とApplePasswordServer
Mac OS Xでは、パスワードの保管方式として表1の5つを採用している。
方式 | authAuthorityでのシンボル | NetInfo | LDAP | 説明 |
---|---|---|---|---|
暗号化パスワード | ;basic; | ○ | △ | 10.1およびそれ以前のバージョンとの互換用。userPasswordなどにcryptされたパスワードを保存 |
シャドウパスワード | ;ShadowHash; | ○ | × | 10.3.x以降におけるローカルアカウントのデフォルト。管理者のみが読めるファイルにハッシュされた生パスワードを保存 |
オープンディレクトリ(ApplePasswordServer) | ;ApplePasswordServer; | × | ○ | パスワードサーバにパスワードを保管。ネットワークワイドのアカウントでのデフォルト |
Kerberos | ;Kerberos5; | × | ○ | kerberosを用いたシングルサインオンを使用する |
LocalWindowsHash | ;LocalWindowsHash; | △ | △ | 10.2.xのみで使われていた方式。管理者のみ読めるファイルにハッシュされた生パスワードを保存 |
バージョン10.1までは、NetInfo内部やLDAPのuserPassword領域などに、暗号化されたパスワードを格納していた。これは従来のUNIXやNeXTSTEPとの互換性の高い方式だが、格納されているのは暗号化されたパスワードであるため、チャレンジ−レスポンス系の認証を使用できなかった。
バージョン10.2になってから、標準でWindowsとのファイル共有がサポートされた。これはMac OS Xからの接続だけではなく、WindowsからMac OS Xへの接続もサポートされている。またこれに伴いLMおよびNT認証といったチャレンジ−レスポンス系認証が必須となり、パスワードを平文で格納する必要性が出てきたのだ。このパスワードは/var/db/shadow以下に格納されている。
バージョン10.2の段階ですでにOpenDirectoryは存在していたが、本格的に使用可能となったのはバージョン10.3(Panther)になってからである。先に触れたように、Mac OS Xのslapdはパスワードを保管しておらず、その代わり、authAuthorityという属性がある*。ここで実行例1を見てほしい。authAuthority属性の値として何やら数値とIPアドレス、ホスト名、それから証明書のようなものが入っている。
実行例1 authAuthorityの例。最初のコマンドはOpenLDAPのldapsearchを用い、LDAPプロトコルで直接取得した場合。次のコマンドは、dsclコマンドラインユーティリティを用いて、DirectoryService経由で取得した場合である
ドキュメント化されていないため詳細は不明だが、このIPアドレスに存在するApplePasswordServerが実際の生パスワードを格納しており、DirectoryServiceのAPIであるdsDoDirNodeAuth()を適切な引数で呼び出すことで、DirectoryServiceからApplePasswordServerへこの証明書で暗号化されたセキュアな通信路を形成、引数を渡して認証処理を行うという動きをしている(図6)。一方、ApplePasswordServer側は単にパスワードを格納しているだけで、ユーザー名やUIDといったユーザーの個人情報は一切保持していない(authAuthorityに書かれた数値がそのパスワードに対応する番号らしい)。
図6 OpenDirectoryでは、パスワードをLDAPデータベースではなくApplePasswordServerに格納し、認証もその中ですべて処理する。パスワード情報はLDAPなどのディレクトリ内ではなく、ApplePasswordServer(Password Service)の管理する隠されたデータベースの中にある。このPassword Serviceとの通信はSSLで保護されており、外部からは盗聴できない。また、パスワードの内容を取り出すことはできず、ApplePasswordServerに渡した引数で認証を行い、その可否をもらうだけである
利用できる認証方式
ApplePasswordServerは表2にある認証方式をサポートしている。通常のSamba 3では、NTおよびLM認証はSamba側で行い、LDAPサーバからはパスワードを取得する方式になっているが、Mac OS XにあるSambaはこの認証部分にパッチが当てられており、DirectoryServiceのAPIを使いOpenDirectory側で認証する*ようになっている。またMac OS X Serverでは、OpenDirectoryのアカウント情報を用いてHTTPのBasicおよびDigest認証を行える。Basic認証はともかくとして、Digest認証を行えるのは、これまたApplePasswordServerにHTTPでのDigest認証のモジュールがあり、mod_digest_appleがDirectoryServiceのAPIを使いOpenDirectory側で認証を行うように実装されているからだ。同梱されているPostfixのSMTP-AuthやCyrusIMAPのそれぞれの認証についても、やはりDirectoryServiceのAPIを通じてOpenDirectoryで認証が行われるようになっている。
Basic | 通常のユーザー名とパスワードによる認証一般 |
---|---|
CRAM-MD5 | IMAPなどで用いられるCRAM-MD5認証 |
DHX | AppleShareで用いられるチャレンジ−レスポンス系の認証 |
Digest-MD5 | IMAPなどで用いられるDigest-MD5認証 |
MS-CHAPv2 | PPTPで用いられる |
SMB-NT | WindowsのNT認証 |
SMB-LAN Manager | WindowsのLM認証 |
APOP | APOP |
WebDAV-Digest | HTTPでのDigest認証 |
ApplePasswordServerの正体
では、このApplePasswordServerの正体はいったい何であろうか……? 実は、これはDarwinのソースを見ると分かる。Darwinのpasswordserver_saslというのがどうもこのApplePasswordServerに対応するソースらしい。これをダウンロード・展開するとCyrusSASLのソースコードが現れる。そう、OpenDirectoryのキモであるApplePasswordServerは、少々の改善を加えたsaslauthd*なのだ。
それぞれのサービスの認証部分を書き換えるという多大な手間を労してはいるが、そのおかげでほかのUNIX系OSのuserPasswordとsambaNTPasswordのように同じパスワードを複数入れてツールによって属性同士の同期を取ることでごまかすのではなく、Solarisのようにパスワードの読み取りを許可するのでもなく、またWindowsのように読み取れない特殊な属性というLDAP的に見て非互換の機能を用意するのでもない。ApplePasswordServerという、本当に単一の情報源でパスワードを管理するOpenDirectoryの仕組みは、過去の迷走の痕跡を抱えやや複雑になっているが、それでもほかに比べ一歩進んでいるといっても過言ではないだろう。
そして、OpenLDAPやCyrusSASLなど優れたオープンソースソフトウェアを利用することで実現している一方、そのほとんどがDarwinという形でオープンソースとして再度われわれに提供されている。これこそが現在のAppleの姿勢を端的に表しているといっても、これまた過言ではないと思うがいかがだろうか?
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
このページで出てきた専門用語
authAuthorityという属性がある
あるいはAuthenticationAuthority。Apple独自の属性に関しては、互換性のためか小文字から始まるLDAP的な名前と、大文字から始まる名前の2つで参照可能になっている。
DirectoryServiceのAPIを使いOpenDirectory側で認証する
ちなみに、OpenDirectoryによる共有ディレクトリサービスがなく、ローカルのNetInfoだけの場合、AuthServerと呼ばれるプロセスが先のシャドウパスワードの値を読み出して認証処理を行う。
少々の改善を加えたsaslauthd
例えば、先に本文で説明した各種認証のためのモジュールは、/usr/lib/sasl2以下にダイナミックロードモジュールとして存在している。一方、ローカルの場合はAuthServerのモジュールとして別途存在している。このあたりの整合性に欠ける個所もまた迷走の名残といえる。
本記事は、オープンソースマガジン2006年2月号「Undocumented Mac OS X」を再構成したものです。
関連記事
- 連載第1回 initを置き換えるlaunchd【前編】
UNIX使いに真のMACPOWERを! 本連載では、UNIX使いに向け、UNIX系OSとしてのMac OS Xを解説していく。記念すべき第1回では、initに代わるものとしてMac OS X Tigerで採用された、launchdを紹介しよう。 - 連載第2回 initを置き換えるlaunchd【後編】
- 連載第3回:plist(プロパティリスト)とFoundation【前編】
Mac OS Xにおいてオブジェクトの永続化に用いられるファイル形式plist。今回から2回にわたって、plistとこれに対応するFoundationフレームワークがMac OS Xをどのように支えているのか解説する。 - 連載第4回:plist(プロパティリスト)とFoundation【後編】
- 連載第5回:OpenDirectory
Mac OS Xにはじめて触ったUNIX使いが戸惑う要素として、先進的なアカウント管理機構OpenDirectoryがある。今回はその仕組みを解き明かしていく。
Copyright © ITmedia, Inc. All Rights Reserved.