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

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

[白山貴之,ITmedia]
前のページへ 1|2|3       

パスワードの保管方式と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のみで使われていた方式。管理者のみ読めるファイルにハッシュされた生パスワードを保存
表1 Mac OS Xがサポートしているパスワードの格納方法。この格納法はNetInfoおよびOpenDirectoryで使われ、それ以外のLDAPサーバへのアクセスならばbind認証、ActiveDirectoryならその設定に従った認証、NISならNISの認証と、適切な方式が選択される。そうした認証も含め、シャドウパスワードとオープンディレクトリ以外はチャレンジーレスポンス系の認証には使えないので注意してほしい(△は使えないことはないが推奨されていないもの)

 バージョン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 実行例1 authAuthorityの例。最初のコマンドはOpenLDAPのldapsearchを用い、LDAPプロトコルで直接取得した場合。次のコマンドは、dsclコマンドラインユーティリティを用いて、DirectoryService経由で取得した場合である

 ドキュメント化されていないため詳細は不明だが、このIPアドレスに存在するApplePasswordServerが実際の生パスワードを格納しており、DirectoryServiceのAPIであるdsDoDirNodeAuth()を適切な引数で呼び出すことで、DirectoryServiceからApplePasswordServerへこの証明書で暗号化されたセキュアな通信路を形成、引数を渡して認証処理を行うという動きをしている(図6)。一方、ApplePasswordServer側は単にパスワードを格納しているだけで、ユーザー名やUIDといったユーザーの個人情報は一切保持していない(authAuthorityに書かれた数値がそのパスワードに対応する番号らしい)。

図6 図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認証
表2 ApplePasswordServerがサポートする認証方法

ApplePasswordServerの正体

 では、このApplePasswordServerの正体はいったい何であろうか……? 実は、これはDarwinのソースを見ると分かる。Darwinのpasswordserver_saslというのがどうもこのApplePasswordServerに対応するソースらしい。これをダウンロード・展開するとCyrusSASLのソースコードが現れる。そう、OpenDirectoryのキモであるApplePasswordServerは、少々の改善を加えたsaslauthd*なのだ。

 それぞれのサービスの認証部分を書き換えるという多大な手間を労してはいるが、そのおかげでほかのUNIX系OSのuserPasswordとsambaNTPasswordのように同じパスワードを複数入れてツールによって属性同士の同期を取ることでごまかすのではなく、Solarisのようにパスワードの読み取りを許可するのでもなく、またWindowsのように読み取れない特殊な属性というLDAP的に見て非互換の機能を用意するのでもない。ApplePasswordServerという、本当に単一の情報源でパスワードを管理するOpenDirectoryの仕組みは、過去の迷走の痕跡を抱えやや複雑になっているが、それでもほかに比べ一歩進んでいるといっても過言ではないだろう。

 そして、OpenLDAPやCyrusSASLなど優れたオープンソースソフトウェアを利用することで実現している一方、そのほとんどがDarwinという形でオープンソースとして再度われわれに提供されている。これこそが現在のAppleの姿勢を端的に表しているといっても、これまた過言ではないと思うがいかがだろうか?

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

authAuthorityという属性がある

あるいはAuthenticationAuthority。Apple独自の属性に関しては、互換性のためか小文字から始まるLDAP的な名前と、大文字から始まる名前の2つで参照可能になっている。

DirectoryServiceのAPIを使いOpenDirectory側で認証する

ちなみに、OpenDirectoryによる共有ディレクトリサービスがなく、ローカルのNetInfoだけの場合、AuthServerと呼ばれるプロセスが先のシャドウパスワードの値を読み出して認証処理を行う。

少々の改善を加えたsaslauthd

例えば、先に本文で説明した各種認証のためのモジュールは、/usr/lib/sasl2以下にダイナミックロードモジュールとして存在している。一方、ローカルの場合はAuthServerのモジュールとして別途存在している。このあたりの整合性に欠ける個所もまた迷走の名残といえる。


関連キーワード

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


本記事は、オープンソースマガジン2006年2月号「Undocumented Mac OS X」を再構成したものです。


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ

マーケット解説

- PR -