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アドレス、ホスト名、それから証明書のようなものが入っている。
ドキュメント化されていないため詳細は不明だが、このIPアドレスに存在するApplePasswordServerが実際の生パスワードを格納しており、DirectoryServiceのAPIであるdsDoDirNodeAuth()を適切な引数で呼び出すことで、DirectoryServiceからApplePasswordServerへこの証明書で暗号化されたセキュアな通信路を形成、引数を渡して認証処理を行うという動きをしている(図6)。一方、ApplePasswordServer側は単にパスワードを格納しているだけで、ユーザー名やUIDといったユーザーの個人情報は一切保持していない(authAuthorityに書かれた数値がそのパスワードに対応する番号らしい)。
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の正体はいったい何であろうか……? 実は、これはDarwinのソースを見ると分かる。Darwinのpasswordserver_saslというのがどうもこのApplePasswordServerに対応するソースらしい。これをダウンロード・展開するとCyrusSASLのソースコードが現れる。そう、OpenDirectoryのキモであるApplePasswordServerは、少々の改善を加えたsaslauthd*なのだ。
それぞれのサービスの認証部分を書き換えるという多大な手間を労してはいるが、そのおかげでほかのUNIX系OSのuserPasswordとsambaNTPasswordのように同じパスワードを複数入れてツールによって属性同士の同期を取ることでごまかすのではなく、Solarisのようにパスワードの読み取りを許可するのでもなく、またWindowsのように読み取れない特殊な属性というLDAP的に見て非互換の機能を用意するのでもない。ApplePasswordServerという、本当に単一の情報源でパスワードを管理するOpenDirectoryの仕組みは、過去の迷走の痕跡を抱えやや複雑になっているが、それでもほかに比べ一歩進んでいるといっても過言ではないだろう。
そして、OpenLDAPやCyrusSASLなど優れたオープンソースソフトウェアを利用することで実現している一方、そのほとんどがDarwinという形でオープンソースとして再度われわれに提供されている。これこそが現在のAppleの姿勢を端的に表しているといっても、これまた過言ではないと思うがいかがだろうか?
あるいはAuthenticationAuthority。Apple独自の属性に関しては、互換性のためか小文字から始まるLDAP的な名前と、大文字から始まる名前の2つで参照可能になっている。
ちなみに、OpenDirectoryによる共有ディレクトリサービスがなく、ローカルのNetInfoだけの場合、AuthServerと呼ばれるプロセスが先のシャドウパスワードの値を読み出して認証処理を行う。
例えば、先に本文で説明した各種認証のためのモジュールは、/usr/lib/sasl2以下にダイナミックロードモジュールとして存在している。一方、ローカルの場合はAuthServerのモジュールとして別途存在している。このあたりの整合性に欠ける個所もまた迷走の名残といえる。
本記事は、オープンソースマガジン2006年2月号「Undocumented Mac OS X」を再構成したものです。
Copyright © ITmedia, Inc. All Rights Reserved.