では、実際のユーザアカウント情報を見てみよう。ノードそのものの情報を読み取るコマンドは「read」だ。実行例7は、ユーザmeのアカウント情報を読み取った結果である(注2)。

実行例7 readコマンドでユーザmeのアカウント情報を読み取った結果

 /Local/Default > read Users/me
 dsAttrTypeNative:_writers_hint: me
 dsAttrTypeNative:_writers_jpegphoto: me
 dsAttrTypeNative:_writers_LinkedIdentity: me
 dsAttrTypeNative:_writers_picture: me
 AppleMetaNodeLocation: /Local/Default
 AuthenticationAuthority: ;Kerberosv5;;me@LKDC:SHA1.5E52FEC5EB1FB35489AC7027FFD8439124DFF9A9;LKDC:SHA1.5E52FEC5EB1FB35489AC7027FFD8439124DFF9A9; ;ShadowHash;HASHLIST:<SALTED-SHA1,SMB-NT>
 GeneratedUID: DBAB71C1-3475-4A67-8FDF-1B8221FC9E04
 JPEGPhoto:
  ffd8ffe0 00104a46 49460001 01000001 00010000 ffdb0043 00020202 02020102 02020202 02020303 06040303 03030705
 ……
 ……
 47926483 43d21ee9 964651fb c0c55020 c93c6081 95ce7072 9a74ba0c f7115c47 3ebda9ea b3486686 e7562eb6 ebc8c131 867debb7 1f29c11c 12bd7148 47ffd9
 NFSHomeDirectory: /Users/me
 Password: ********
 Picture:
  /Library/User Pictures/Animals/Dragonfly.tif
 PrimaryGroupID: 501
 RealName:
  Machine Owner
 RecordName: me
 RecordType: dsRecTypeStandard:Users
 UniqueID: 501
 UserShell: /bin/bash

UniqueIDがUNIXのUIDに相当する属性で、GeneratedUIDはユーザを特定する一意なUUIDとなっている。Pictureという属性にはにユーザを示す画像へのパスがある一方、JPEGPhotoにはBase64でエンコードされた同画像が格納されている。NFSHomeDirectoryはホームへのパスになる。通常のMac OS Xの場合このパスはもちろんローカルディスクのパスなのであるが、都合によりこうした名称が用いられている。

RealNameはユーザの実名(ロングネーム)、RecordNameにはユーザ名(ショートネーム)が格納されている。また、Passwordキーはあるが「*」で潰されており、実際には利用されていない。

Open Directoryで特徴的なのが、AuthenticationAuthorityとAppleMetaNodeLocationのキーだろう。

先に見たようにPassword属性の中には実際のパスワード情報は格納されていない。Mac OS Xではセキュリティを重んじているため、比較的自由にアクセス可能なディレクトリサービスにはパスワードを格納しないのだ。

パスワードのような認証のための情報を持ち、認証を行う先を指定するのがこのAuthenticationAuthorityキーである。このキーは複数の値を許可されており、実行例7の場合、ShadowHashとKerberosV5という2つのパスワードタイプが定義されている(図2)。

図2: AuthenticationAuthorityの内容。ShadowHashとKerberosV5という2つのパスワードタイプが定義されている

「;」から「;」で囲まれた情報がパスワードタイプの名称だ。また、KerberosV5にはそれに続けてどのKerberosのレルムへアクセスするかの情報が含まれている。なお、Leopardでは個々のMacがそれぞれ独自のKDC(Key Distribution Center)を持ち、Kerberosのレルム名が自動生成される。

これらのパスワードタイプに相当するサービスは、何らかの安全な方法でパスワードなどの認証用の情報を格納しており、簡単に外部に出力できないように保護している。

Open Directoryで認証を行う場合は、このAuthenticationAuthorityの示すサービスに対して認証に必要な情報を送付し、認証を行う。このためのDirectoryServiceのAPIがdsDoDirNodeAuthだ。このAPIの使用方法については後半で記述しているので参照してほしい。

認証情報はディレクトリサービスとは別に管理されるため、例えMac OS X ServerにLDAPで接続しても、パスワードが漏洩することはない。

PantherおよびTigerでは、Mac OS XのデフォルトはShadowHashで、特定のディレクトリに格納されたダイジェスト値にて認証を行っていた。一方、Mac OS X Serverでは2つの方法がサポートされていた。1つはApplePasswordServerで、Mac OS X Server上で動作するPasswordServerに対してSSLを使って暗号化された経路を通じて接続、SASLによる認証を行うというものであった。もう1つがKerberosで、Mac OS X Server上でKDCを動作させ、認証を行い、Kerberosのチケットを配布していた。

Leopardでは、デフォルトでKerberosV5対応になった。全てのLeopardはShadowHashを利用する一方、インストール時に自前のKDCを自動的に構築、Kerberosによる認証情報管理も同時に行っているのだ。

なお、システム環境設定の共有からファイル共有を実行、オプションから「SMBを使用してファイルやフォルダを共有」を指定し、SMBによるファイル共有を許可したユーザにした場合にのみ、SMB認証に必要なパスワード管理情報がShadowHashに追記される(詳細は後述)。

注2: ユーザmeのアカウント情報を読み取った結果である
ファイルシステムと異なり、全てのノードはその下にノードをぶら下げるディレクトリであるのと同時に、自身に属性を格納できるファイルとしても振る舞う。例えば、「cd /Local」と実行できる一方、「read /Local」と実行すれば、Localというノードの持つ属性を読み出せる。

read /Local」実行結果