Creating users and groups in Leopard


この日記を書いている時点で、Carbon Emacsコンパイルが通っていません。configureは通るのですが、Carbon関係のコンパイルで落ちるようです。

その間にCarbon Emacsがなくても進められるdovecotの設定を済ませておくことにしました。

追記(2007/11/27)

本エントリに記載している手法はハック的要素の強いものです。Mac OS X 10.5.x Leopardにおけるユーザーおよびグループの操作におけるより安全な手法として、dsclコマンドを用いたユーザーおよびグループの作成方法に関するエントリを記載しました。そちらも是非ご参照ください。

Creating Users and Groups on Leopard using dscl command - agwの日記
http://d.hatena.ne.jp/agw/20071126/1196152803


dovecotは、任意のユーザーおよびグループを用います。デフォルトでは、dovecotユーザーとdovecotグループになります。これを、Mac OS X 10.5がpostfixを_postfixとして用意しているように、_dovecotとして作成することを目指してみます。uidおよびgidにはそれぞれ128を用います*1


まずdovecotをtarボールからインストールし、設定を行います。その後、_dovecotユーザーおよびグループを作成せずにdovecotを起動してみます。勿論、ユーザーが見つからず、起動しません。

> sudo /usr/local/sbin/dovecot
Error: Login user doesn't exist: _dovecot
Fatal: Invalid configuration in /usr/local/etc/dovecot.conf


Mac OS X 10.5ではNetInfo Managerが廃止されたようですが*2、ローカルで保持しているアカウント等の情報はプロパティーリストにて登録されているようです。これらのプロパティリストは以下に保存されています*3

+ /var
 + db
  + dslocal
   + nodes
    + Default


例えば、_postfixユーザーおよび_postfixグループに関する情報はそれぞれ、以下に保存されています。

 + /var
   + db
    + dslocal
     + nodes
      + Default
       + users
        + _postfix.plist
       + groups
        + _postfix.plist


これらのファイルの内容は以下になります。

users/_postfix.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>  
        <key>gid</key>
        <array> 
                <string>27</string>
        </array>
        <key>home</key>
        <array> 
                <string>/var/spool/postfix</string>
        </array>
        <key>name</key>
        <array> 
                <string>_postfix</string>
                <string>postfix</string>
        </array>
        <key>passwd</key>
        <array> 
                <string>*</string>
        </array>
        <key>realname</key>
        <array> 
                <string>Postfix Mail Server</string>
        </array>
        <key>shell</key>
        <array> 
                <string>/usr/bin/false</string>
        </array>
        <key>uid</key>
        <array> 
                <string>27</string>
        </array>
</dict>
</plist>
groups/_postfix.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>generateduid</key>
        <array>
                <string>XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX</string>
        </array>
        <key>gid</key>
        <array>
                <string>27</string>
        </array>
        <key>name</key>
        <array>
                <string>_postfix</string>
                <string>postfix</string>
        </array>
        <key>passwd</key>
        <array>
                <string>*</string>
        </array>
        <key>realname</key>
        <array>
                <string>SMTP Mail Access</string>
        </array>
        <key>smb_sid</key>
        <array>
                <string>X-X-X-X-XXX</string>
        </array>
</dict>
</plist>


groups以下の全てのプロパティリストにはgenerateduidというプロパティが存在しており、私のシステムにインストールされているグループ群は、ほぼ全てのグループに異なるgenerateduidがアサインされていました*4。このプロパティにどのような意味合いがあるのか不明であったこともあり、正攻法で作ることにしました。


グループを新規作成するには、System Preferencesを用います。System Preferences > System > Accountsにて+ボタンをクリックし、以下を設定し、Create Groupボタンをクリックします。

New
Group
Name
_dovecot

groupsディレクトリ以下に作成される_dovecot.plistは以下のような内容となります。

groups/_dovecot.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>generateduid</key>
        <array>
                <string>XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX</string>
        </array>
        <key>gid</key>
        <array>
                <string>502</string>
        </array>
        <key>groupmembers</key>
        <array/>
        <key>name</key>
        <array>
                <string>_dovecot</string>
        </array>
        <key>passwd</key>
        <array>
                <string>*</string>
        </array>
        <key>realname</key>
        <array>
                <string>_dovecot</string>
        </array>
</dict>
</plist>


これを、_postfix.plistと比較しながら編集します。前述したように、gidには128を指定しました。以下は編集後の_dovecot.plistです。

groups/_dovecot.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>generateduid</key>
        <array>
                <string>XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX</string>
        </array>
        <key>gid</key>
        <array>
                <string>128</string>
        </array>
        <key>groupmembers</key>
        <array/>
        <key>name</key>
        <array>
                <string>_dovecot</string>
                <string>dovecot</string>
        </array>
        <key>passwd</key>
        <array>
                <string>*</string>
        </array>
        <key>realname</key>
        <array>
                <string>IMAP4 Mail Access</string>
        </array>
</dict>
</plist>


さて、次に_dovecotユーザーを作成します。役割的に近いと思われる_postfixのプロパティリストを元に、以下のようにしてみました。

users/_dovecot.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>gid</key>
        <array>
                <string>128</string>
        </array>
        <key>home</key>
        <array>
                <string>/usr/local/libexec/dovecot</string>
        </array>
        <key>name</key>
        <array>
                <string>_dovecot</string>
                <string>dovecot</string>
        </array>
        <key>passwd</key>
        <array>
                <string>*</string>
        </array>
        <key>realname</key>
        <array>
                <string>Dovecot Mail Server</string>
        </array>
        <key>shell</key>
        <array>
                <string>/usr/bin/false</string>
        </array>
        <key>uid</key>
        <array>
                <string>128</string>
        </array>
</dict>
</plist>


users/_dovecot.plistを作成した後に、一回リブートします*5。リブート後に、再度dovecotを起動します。

> sudo /usr/local/sbin/dovecot
> ps auxll | grep '[d]ovecot'
root       319   0.0  0.0    75556    324   ??  Ss    7:46PM   0:00.00     0     1   0  31  0 -      /usr/local/sbin/dovecot
_dovecot   323   0.0  0.0    76584    584   ??  S     7:46PM   0:00.01   128   319   0  31  0 -      imap-login
_dovecot   322   0.0  0.0    76584    584   ??  S     7:46PM   0:00.01   128   319   0  31  0 -      imap-login
_dovecot   321   0.0  0.0    76584    584   ??  S     7:46PM   0:00.01   128   319   0  31  0 -      imap-login
root       320   0.0  0.0    76728    532   ??  S     7:46PM   0:00.00     0   319   0  31  0 -      dovecot-auth


Mail.appを起動してIMAP4と接続出来ることを確認しました。うまく動作しているようです。では、rootのcronプロセスにて、dovecotを自動的に起動するようにして終了です*6

> sudo su -
Password:
# crontab -l
* * * * *  ( killall -0 dovecot || /usr/local/sbin/dovecot ) > /dev/null 2>&1

まとめ


今回はLeopardのNetInfoデータベースに関して、以下を検証しました。

  • グループを作成し、任意のgidを与える方法
  • プロパティリストから任意のuidを持ったユーザーを作成する方法


LeopardではNetInfo Managerがなくなりました。しかし私感では、LeopardはNetInfoデータベースの呪縛から離れられているようには到底思えません。むしろ上述のようなユーザーやグループの操作は、NetInfo Managerで操作したほうが安全であるように感じられました。

*1:この番号を選んだ根拠は特にありません

*2:これを知らずに/Applications/Utilities内を覗いて腰を抜かしました

*3:Default以下の閲覧には、管理者権限が必要です

*4:70個のgroups/*.plistを精査。そのうちの、_keytabusers.plistおよびmail.plistは同一のgenerateduidを使用していました

*5:NetInfoデータベースを反映させる方法は確実にあるはずなのですが、私はまだ知りません

*6:Mac OS X 10.4.xにてさんざんlaunchdによる起動を試してみたのですが、認証系に問題が出るためこの方法を選択しています