FreeBSDで作る ML server By Karl 1. はじめに このたび、 D.S.B. server 構築の一貫として、ML server を構築し ましたので、「FreeBSDで作るML server」と題して、構築の手順を紹介 します。現在は学外向けの ML は立ち上がっていませんが、もし立ち 上げて欲しいと言う要望がありましたら、私の所に行ってもらえれば、 状況に応じて対処致します。 2. distribute を用いた ML を構築する まずは、ML server の選択からはじめます。ML server の選択肢と しては、fml, hml, nml...などと数種類あるのですが、UNIX USER '95 5月号から、distribute と majordomo を使った ML の連載が始まった ので、今回は majordomo と distribute を組み合わせて構築すること にしました。 2.1 majordomo とは? majordomo は、Brent Chapman氏の作成したML serverです。majordomo は、次のような特長を持っています。 (1) 複数の ML を1つの ML server で作成する事ができる (2) ML への加入をメール1つで行なう事ができる (3) 管理作業をメールで行なう事ができる 特に最後の項目は管理者にとっては非常に便利であると思います。とい うのは、管理をメールで行なえるという事は ML server のあるマシンに ログインする必要がないという事であるため、ML server を動かすマシ ンにアカウントがなくても、ML を運用することができるからです(当然 ML serverを動かす設定をしてもらわないとだめですが)。 2.2 distribute とは? distributeは、Andrew Partan 氏、Steve Miller 氏らが開発した物に、 フォア・チューンの鈴木茂哉氏、IIJ の吉村伸氏らが改良を加えた、メー ルのヘッダを整形するためのソフトです。distribute は、 subject: [niigata-inet xxx] というようなヘッダを付けたり、Reply-To: フィールドなどを入れたり するといった、ML を運営するのに必要と思われるヘッダの修正をする 事ができます。 2.3 注意点 なお、既に sendmail 8.x の最新版がインストールされている事を前提 にしているので、sendmail の古いバージョンを使用している場合は最 新版にバージョンアップしておいてください。 5/18現在で言えば、sendmail 8.6.12 に WIDE 版の 2.5Wbeta7 のパッ チを組み合わせるのが良いと思います。 2.4 distribute を 作成する まず初めに、簡易的な ML を作ってみる事にします。簡易的な ML なら sendmail の alias 機能だけでも実現できるのですが、今回は distribute を作成して使う事にします。 プログラムをコンパイルするとなると、普通の人は ・英文のドキュメント ・不可解なエラー などがあると嫌になりがちですが、distribute は日本語のマニュアルが 付いていますし、また FreeBSD では特にコンパイル時にはまる点などが ないので(Error, Warning等は一切でません) 楽勝です。ユーザー側でコ ンパイル時に (1) distribute 用のファイルを置くディレクトリ (2) majordomo 用のメンバーファイル等を置くディレクトリ (3) mail をアーカイブするディレクトリ (4) ヘッダの付け方 などを決めてやれば、あとは特に何もする必要は無いでしょう。私の場 合は、 (1) distribute のファイルを置くディレクトリとして /usr/local/mail-lists (2) majordomo のメンバーファイル等を置くディレクトリとして /usr/local/mail-lists/majordomo/lists (3) mail をアーカイブするディレクトリとして /home/spool/mail-lists (4) ヘッダ等は基本的にデフォルトのまま と決めました。そこで、Makefile の DEFAULTCONFIG 行以下を次のよ うに記述しました。 DEFAULTCONFIG=\ -DDEF_SEQ_PATH=\"/usr/local/mail-lists\" \ -DDEF_RECIPIENT_PATH=\"/usr/local/mail-lists\" \ -DDEF_MAJORDOMO_RECIPIENT_PATH=\"/usr/local/mail-lists/majordomo/lists\" \ -DDEF_ARCHIVE_PATH=\"/home/spool/mail-lists\" \ -DDEF_ALIAS_CHAR_OPTION=\"b\" 基本的にはこの5つがあればいいと思うのですが、MLを動かすホストが、 所属しているドメインのメールサーバーとなっているような場合(例えば、 karl@nagaoka-ct.ac.jp でメールが届くマシンで ML server を動かすよ うな場合)は、xxx@nagaoka-ct.ac.jp というアドレスを生成してもらった 方が都合が良いかもしれません。このような場合は、DEF_DOMAINNAMEの 部分を -DDEF_DOMAINNAME=\"nagaoka-ct.ac.jp\" \ と変更した方が良いでしょう。また、-DDEF_ARCHIVE_PATH の行は、おそ らくINSTALL.JP に書き忘れたのだと思いますが、アーカイブ機能(後述) を使用する時のディレクトリです。これも忘れずに付けておいた方が良 いでしょう。 また、distribute をインストールするディレクトリは /usr/local/libexec、 マニュアルをインストールするディレクトリは /usr/local/manとしたいの で、Makefile の WHERE= および MANDIR= の部分を WHERE= /usr/local/libexec MANDIR= /usr/local/man と変更しました。あとは % make # make install で終りです。簡単でしょ? 2.5 syslog に関する設定をする 次に、syslogの設定をしてやります。distributeは、デフォルトでは メールを送信する時に LOG_LOCAL4 のファシリティで message を出力 します。そこで、/etc/syslog.conf に local4.debug /var/log/local4.debug と書いて、syslogd に HUP シグナルを送ると、distribute がメールを 送信するたびに /var/log/local4.debug に記録されます。ただし、この ファイルが無いとブート時にエラーが出たりしますので、 # touch /var/log/local4.debug とでもしてファイルを作成しておいてください。 また、この設定は必ずしなければならないというものではないので、 面倒なら省略しても良いのですが、省略してしまうとデバッグ時に苦労 するかもしれません。 2.6 sendmail の alias 等の設定をする 続いて、alias の設定です。ML の名前を "test" とする場合は、 /etc/aliases に test: :include:/usr/local/mail-lists/test.run test-request: owner-test owner-test: karl と記述し、 # newaliases と実行してください(以下は、newaliases コマンドを実行する、と略し ます)。なお、owner-test には ML の管理者を書いて下さい(この場合は karl というユーザーとなります)。 次に、distribute を使用するためのファイルを作成します。まず、 /usr/local/mail-lists/test.run には "| /usr/local/libexec/distribute -M test" と記述してください。このファイルは test アドレスにメールが来た時に 実行される部分で、このファイルを書き換える事により動作を変える事が 出来ます。 /usr/local/mail-lists/test.rec は、ML のメンバーファイルです。 このファイルには、ML に参加するメンバーのアドレスを1行に1人づつ 記述します。当り前かもしれませんが、ML に参加するメンバーに変更が ある場合は、このファイルを書き換えるようにしてください。 /usr/local/mail-lists/test.seq は、Subjectに付く番号が格納され たファイルです。メールを再配布するたびに番号が1つづつ増えていき ますので、この番号を編集する事によって、次に再配布するメールの番 号を変える事が出来ます。このファイルには、 0 とだけ書いておきます。なお、test.run, test.rec, test.seq の各ファ イルの owner は ML の管理者になっている事が重要で、これが違って いるとメールが再配布されません。忘れずに、 # chdir /usr/local/mail-lists # chown karl test.run test.rec test.seq としてファイルの owner を ML の管理者にしてください。 ここまでの設定が正しければ、test 宛にメールを送る事により、 subject: [test 1] xxx のようなサブジェクトの付いたメールが test.rec に記述されたユー ザーに送られ、test.seq の内容が 1 となるはずです。エラーメールが行く場合は、もう1度設定を確認して みてください。 3. distribute のアーカイブ機能を利用する 次に、アーカイブ機能のための設定をしてみます。アーカイブ機能と いうのは、投稿されたメールに通し番号を付けた状態で保存する機能で、 distribute を構築する時に DEF_ARCHIVE_PATH で決めたディレクトリ に保存されていきます(例えば、test ML いう ML を作った場合は、 /home/spool/mail-lists/test というディレクトリに、1, 2, 3... と作 成されます)。 3.1 alias 等を修正・追加する アーカイブ機能を使う場合は、まず /etc/aliases に次の行を追加し ます。 test-archive: :include:/usr/local/mail-lists/test-archive.run owner-test-archive: karl この2行を追加したら、newaliases コマンドを忘れずに実行してくだ さい。 次に、/usr/local/mail-lists/test-archive.run に、 "| /usr/local/libexec/archive -M test" と記述し、ファイルの owner を ML の管理者にしてください。通常はこ れで良いと思いますが、アーカイブファイルを作ろうとしてエラーになる ような場合は、test-archive.run を "| (sleep 5; /usr/local/libexec/archive -M test)" などと変更するとうまくいくかもしれません。 続いて、/usr/local/mail-lists/test.run を次のように変更してくだ さい。 "| /usr/local/libexec/distribute -M test -x test-archive" "-x test-archive" を記述する事により、MLのアドレスに投稿したメー ルが test-archive というユーザーにも送られるようになり、test-archive は test-archive.run に書かれた内容を実行するようになっているため、 アーカイブ機能が働くというわけです。 3.2 メールの保存をするディレクトリを設定する 次に、メールを保存するディレクトリを作成し、そのディレクトリ の owner を、MLの管理者にしてください。この場合だと、 # mkdir /home/spool/mail-lists # mkdir /home/spool/mail-lists/test # chown karl /home/spool/mail-lists # chown karl /home/spool/mail-lists/test となります。このように設定する事により、ML に投稿するたびに1, 2, 3 ... というファイル名でメールが保存されていきます。また、同じディ レクトリに INDEX ファイルが作成されていきます。 3.3 推奨するオプションについて 最後に、distribute に付加するオプションについて書いておきます。 簡易的な ML ならこのままでも良いですが、幾つか付けた方が良いと思 うオプションがあるので紹介しておきます。 -i : 「Reply-To:」ヘッダを強制的に付けるようにする このオプションが付いていないと、Reply-To: フィールドは元の メールのままになるので、このオプションを付けるかどうかは ML の運営者の判断で決めると良いでしょう。 -R : 「Received:」ヘッダを削除する このオプションを付けると、Received: ヘッダを削除してから再 配布するようになります。 -P list : 「Precedence: list」ヘッダを付加する ML のメールは、このヘッダを付ける事を推奨していようですの で、付けたほうがよいかもしれません。 例えば、これらのオプションを全て付けて ML を運営する場合は、 /usr/local/mail-lists/test.run を次のように変更してください。 "| /usr/local/libexec/distribute -i -R -P list -M test -x test-archive" 4. majordomo を構築する 続いて、majordomo の構築にとりかかる事にします。majordomo の本 体は perl の script なのですが、wrapper というプログラムが C言語 で書かれているので、これをコンパイルする必要があります。そこで、 そのための準備をします。 4.1 majordomo のためのアカウント・グループを作成する majordomo は(というか、wrapperは)、管理用として owner majordomo, group majordomo を使う事を前提としているようですので、vipw コマン ドおよび /etc/group を編集して、作ってやる必要があります。ただし、 8文字までしか有効にならないようなので、owner majordom, group majordom として作成してください。 4.2 wrapper を作成する まず Makefile を修正します。Makefile を見ていくと、 W_BIN=/tools/majordomo-1.93 という行があります。これは、wrapper や majordomo 等をインストール するディレクトリで、今回は、/usr/local/mail-lists/majordomo 以下に インストールする事したので、この部分を、 W_BIN=/usr/local/mail-lists/majordomo に変更します。distribute を構築する時に、DEF_MAJORDOMO_RECIPIENT_PATH を /usr/local/mail-lists/majordomo/lists と決めましたが、これはメ ンバーファイルなどを置くディレクトリで、majordomo の本体などはそ の上のディレクトリに置かれるようにするため、このように設定します。 次に、wrapper プログラムの UID, GID を設定する必要があるのですが、 Makefile を見ていくと「BSD-based system ではこの部分を使いなさい」 というような箇所があります。ここで FreeBSD は BSD-based system だ から、この箇所を使えば良いのかと思いましたが、実際はこの部分より 先にある、POSIX 用の定義を使わないとダメだったので、このように書 かれている部分のコメントは外さず、POSIX-compliant system の箇所の 設定を変えてください。 そして、先程作った majordom の user ID および group ID をそれぞ れ W_UID, W_GID に書いてください。私の場合は、UID を104、GID を103 としたので、 W_UID = 104 W_GID = 103 としました。 次に、majordomoをインストールするディレクトリを作成します。 インストールするディレクトリは /usr/local/mail-lists/majordomo で、/usr/local/mail-lists は既にできているので、 # mkdir /usr/local/mail-lists/majordomo # mkdir /usr/local/mail-lists/majordomo/lists # chown majordom:majordom /usr/local/mail-lists/majordomo # chown majordom:majordom /usr/local/mail-lists/majordomo/lists などとして、作って下さい。このあとは、make および make install をすれば良いのですが、FreeBSD付属の UCB makeでは、一部のスクリ プトが解釈できないので、GNU make を使ってください。GNU make が 無い場合は Makefile をみて、手でコピーする事もできますが、今回 は GNU make を使う事にします。ここで、GNU make が gmake でイン ストールされているとするなら、例えば次のようにします。 % gmake # gmake install # chown -R majordom /usr/local/mail-lists/majordomo # gmake install-wrapper # ln -s /usr/local/mail-lists/majordomo/majordomo.cf /etc # ln -s /usr/bin/perl /usr/local/bin 3行目の chown ですが、これは root でインストールしたために、 /usr/local/mail-lists/majordomo 以下のファイルの owner が root になっているので、これを majordom に直すためです。また、最 後の行は、majordomo の script は、perl が /usr/local/bin にイン ストールされていると仮定して書かれているが、FreeBSD では /usr/bin に perl がインストールされているので、script を手直しするのを省 くための手抜きです。本当は script を直すのが正しいのでしょうが、 これでも動くので今回はこうします。 4.3 majordomo.cf を修正する 次に、/usr/local/mail-lists/majordomo/majordomo.cf を設定しま す。設定自体もそれほど面倒という物ではないので、すぐ終るでしょう。 まずは2行目の、 $whereami = "foo.GreatCircle.COM"; を、ML server を立ち上げるマシンのホスト名に変更します。私の構築 した server は、sylphide.nagaoka-ct.ac.jp というホスト名なので、 この部分を $whereami = "sylphide.nagaoka-ct.ac.jp"; と変更しました。 次に、19行目の $listdir = "/usr/local/mail/lists"; を、 $listdir = "/usr/local/mail-lists/majordomo/lists"; と変更します。これは majordomo が管理するメンバー等のファイ ルを置くディレクトリです。これは、distribute を構築した時の、 DEF_MAJORDOMO_RECIPIENT_PATH と同じディレクトリにします。 次に、26行目、48行目、49行目の $digest_work_dir = '/usr/local/mail/digest'; $filedir = "$listdir"; $filedir_suffix = ".archive"; をそれぞれ、 $digest_work_dir = '/home/spool/mail-lists/digest'; $filedir = "/home/spool/mail-lists"; $filedir_suffix = ""; に変更します。ここでは使用しませんが、あとで majordomo のアー カイブ機能(正確にいえば、digest 機能なんでしょうが、表現を統一 するためこう呼ぶ事にします)などを使用するために変更しておきま す。なお、この設定では、distribute を使用した時と同じディレク トリにメールがアーカイブされるようになります。 それから、36行目の $mailer = "/usr/lib/sendmail -f\$sender -t"; を $mailer = "/usr/sbin/sendmail -f\$sender -t"; に直します。FreeBSDでは、sendmail が /usr/sbin にあるため です。なお、sendmail に関する記述は他のスクリプトにもあり ます。初めに直しておかないとトラブルの元になるかもしれま せんので、 # grep "/usr/lib/sendmail" * などとやって、マッチした部分全部を直しておいて下さい。 4.4 alias 等を設定する 次に、/etc/aliases を設定します。majordomo@hostname にメー ルが送られて来た時の動作を設定するために、 owner-owner: postmaster majordomo: "| /usr/local/mail-lists/majordomo/wrapper majordomo" majordom: majordomo majordomo-owner: owner-majordomo owner-majordomo: karl と記述します。owner-majordomo は ML の管理者です。また、最初に、 owner-owner: postmaster という記述がありますが、これは「owner- 」 で始まるアドレスに対するメールがエラーになった場合に、送り返され るアドレスを示しています。ML を運用する時には指定しておくと良い でしょう。 次に、ML 用の alias を記述するわけですが、今回は、test ML を majordomo を使って管理する例を紹介しますので、今まで記述 されていた、test ML に関する設定を次のように変更して下さい。 test: :include:/usr/local/mail-lists/majordomo/test test-request: "| /usr/local/mail-lists/majordomo/wrapper request-answer test" test-approval: karl test-owner: owner-test owner-test: karl そして、newaliases コマンドを実行して下さい。 4.5 test MLのための設定ファイルを作成する 続いて、/usr/local/mail-lists/majordomo/lists ディレクトリの 下に、test, test.passwd, test.info の3つのファイルを作成します。 # chdir /usr/local/mail-lists/majordomo/lists # touch test test.passwd test.info # chown majordom test test.passwd test.info 注意点として、majordomo では ML の名前は小文字で管理するので、 新たに別の ML を立ち上げる場合でも、大文字を含んだファイルにしな いで下さい。 それから、この設定では distribute を通さないので、メールのヘッ ダの整形をする事は出来ません。ヘッダの整形については次のセクショ ンで説明します。 なお、majordomo を使用する事により、ユーザー管理を自動化する事 ができるようになります。majordomo の使い方を書いているわけではな いので簡単に説明しますが、 subscribe test という内容のメールを majordomo 宛に送ると、test ML に自動的に加入 出来るようになり、 unsubscribe test という内容のメールを majordomo 宛に送ると、test ML から自動的に脱退 出来るようになります。 この時、majordomo から、test-approval 宛に、加入した人の E-mail address が送られるのですが、alias で、ML の管理者にしてありますの で、ML の管理者にメールが送られます。 また、最初に「subscribe test」のメールが送られた時点で、 /usr/local/mail-lists/majordomo/lists/test.config というファイルが作成されます。これはコンフィギュレーションファイル ですので、このファイルを書き換える事によって動作を変える事が出来ま す。この他にも、今回は紹介しませんが、ある特定のファイルを作成する 事によって、自動参加できないような ML を作成する事も出来ます。 5. majordomo と distribute を組み合わせて運用する このままでは、distribute を用いていた時に使えていたような、 Subject: [niigata-inet xxx] 形式のヘッダを出力するといった、ヘッ ダの整形機能が使えませんので、次に majordomo と distribute を組み 合わせた運用方法に移行する事にします。 なお、distribute を組み合わせなくても、majordomo に付属の resend スクリプトを使用しても似たような事は出来るのですが、 今回は distribute を組み合わせた場合の設定をしてみます。 distribute には、majordomo と組み合わせて使うために、「-j」 というオプションがあります。このオプションは、majordomo は小 文字で ML の名前を管理している事から、「-M Test」などのように 大文字を含んだ ML 名を指定しても自動的に小文字に変換し、なお かつ majordomo で管理しているメンバーファイルを参照するオプ ションです。 メンバーファイルを参照するディレクトリは、distribute を構築す る時に、DEF_MAJORDOMO_RECIPIENT_PATH で示したディレクトリです。 今回は、majordomo と組み合わせて運用する事を前提としてディレク トリを設定したので、再コンパイルなどの必要はありません。 5.1 alias 等を再修正する distribute を組み合わせて使用するには、まず /etc/aliases ファ イルを、 test: :include:/usr/local/mail-lists/test.run test-outgoing: "| /usr/local/mail-lists/majordomo/wrapper digest -r -C -l test" owner-test-outgoing: owner-test owner-test: karl とし、newaliases コマンドを実行します。なお、2行目と3行目は 都合上分けているだけであり、/etc/aliases ファイルには、 ... majordomo/wrapper digest -r ... というように、続けて記述して下さい。 続いて、/usr/local/mail-lists/test.run ファイルを編集します。 おそらく distribute のみで運用するように設定した時の物が残って いると思いますので、次のように書き換えて下さい。 "| /usr/local/libexec/distribute -j -M test -x test-outgoing" 以前と違って、先程説明した「-j」オプションが増えています。ま た、「-x test-outgoing」によって、test-outgoing にも送信する ようになっています。 他にオプションを付けているかもしれませんが、「-j」オプショ ンは必ず「-M」オプションより前に付け、「-x test-outgoing」は 必ず最後に付けて下さい。 5.2 アーカイブ用ディレクトリの修正 次に、アーカイブ用ディレクトリの作成に移ります。majordomo の get コマンドが使えて、なおかつ distribute も動くようにするため には、次のようにします。なお、以前の distribute 単独で運用する 時の物が残っている場合は一旦削除して、新たに次のようにすると良 いでしょう。 # mkdir /home/spool/mail-lists # mkdir /home/spool/mail-lists/test # chown -R majordom:majordom /home/spool/mail-lists # touch /home/spool/mail-lists/test/INDEX # chown karl /home/spool/mail-lists/test/INDEX distribute の作成する INDEX ファイルは、owner-test で指定さ れている owner にし、その他のファイルは owner majordom、group majordom にするためです。このように設定しないと、メールは来る けどアーカイブされないとか、エラーメールが来るといった事が起 きます。パーミッションの設定は十分確認して下さい。 次に、/usr/local/mail-lists/test.seq の中に入っている番号を、 0 に戻してください。戻さなくても運用は可能ですが、Subject について いるメール番号と、アーカイブディレクトリにあるメールに付いている 番号が食い違い、混乱を起こすかもしれないからです。 また、/usr/local/mail-lists/test.rec ファイルは使用しないので、 削除した方が良いと思います。 このように設定する事により、test@hostname 宛にメールを出 すと、/usr/local/mail-lists/majordomo/lists/test に入って いるユーザーにメールが送られると共に、test-outgoing 宛にメー ルが送られ、test-outgoing から majordomo の digest プログラ ムが起動されて、/home/spool/mail-lists/test の中に、メールが 格納されていきます。 デフォルトではメール番号は「001」といった3桁の番号になっ ていますが、例えば「00001」といった5桁の番号にしたい場合は、 /usr/local/mail-lists/majordomo/digest スクリプトの110行目に ある、 $file = sprintf("%s/%03d", $V{'INCOMING'}, $i); という箇所を $file = sprintf("%s/%05d", $V{'INCOMING'}, $i); として下さい。 6. 最後に さて、ここまでの方法で、当初の目的である majordomo と distribute を組み合わせた ML の運用が出来るようになりました。この設定だけで も十分実用的に動くのですが、majordomo 付属のスクリプトなどを使え ば、月ごとにアーカイブしたりするといった事も出来ます。 このような設定をする必要があるかどうかは、ML の運用方法によって 違うでしょうから、ここからは、majordomo 付属のドキュメントやスク リプト見ながら、いろいろと変えて見て下さい。 また、管理者専門のコマンドや、その他の設定もありますが、今回は 設定を中心に解説しましたので、そのような説明は一切省いてあります。 実際にインターネット上で運用する時は、付属のドキュメントや、 majordomo FAQ などを参照して、きちんと設定する方が良いと思います。 最後に、こんなわかりにくい文章を御愛読して下さいまして、ありがと うございました。もし、この文章を読んだ感想や、修正点等の報告があ りましたら、karl@nagaoka-ct.ac.jp のE-mail address で受け付けてい ますので、こちらにどうぞ。また、実際に distribute と majordomo を 構築したマシン上や PC-VAN にもアドレスがありますので、急がない用 事でしたら、karl@sylphide.nagaoka-ct.ac.jp、RRE72021@pcvan.or.jp の方が確実にメールを読めると思います。 # メインのaddressは ML のメールでパンク状態(^^; [ 参考文献 ] UNIX USER '95 5月号〜 新インターネット構築術(石橋勇人氏) UNIX MAGAZINE '94 4月号 インターネットの利用としくみ 第12回(吉村 伸氏)