fmlのセキュリティ設定
fmlの設定
- fmlは,各メーリングリスト毎に”config.ph”ファイルで設定を行っている。
config.phファイル
- config.phは,fmlの動作を指定するための基本となる設定ファイル。
- makefml config(コマンド)による設定変更も,実際には,config.phファイルを変更することで設定を反映している。
- makefml(コマンド)は,config.phの元となるcfというファイルを生成し,さらにそのファイルからconfig.phを生成するスタイルをとっている。
- config.phをエディタで編集した後,makefml config(コマンド)を使って設定を変更しようとすると,設定が上書きされてしまいうまくいかない。→注意
- 一旦,エディタによるconfig.phの編集を始めたら,それ以降は,makefml config(コマンド)には頼らずに設定するつもりでいなければならない。
config.phの設定変更により,セキュリティを高める。以下,処方箋。
- メールサイズを制限する
$INCOMING_MAIL_SIZE_LIMIT変数にメールサイズの上限を設定する。
単に数値を設定するか,「10K」,「1M」等の単位で指定する事が可能。
この変数を未定義にすると,このメッセージサイズの制限機能が停止する。
例:40KBに制限するときは,config.phに以下の設定を追加する。
$INCOMING_MAIL_SIZE_LIMIT = "40K"; # maxsize = 40k bytes
- リモートコマンドを制限する
自動登録の公開メーリングリストの場合,アドレスリストを取得することだけを目的とした参加者が,メンバーリストを取得して即退会するといったことが起こり得る。
このような場合,参加者が使えるリモートコマンドを制限するという方法を取ると良い。
@DenyProcedure配列を使ってmembersコマンド等を使えないように設定する。
membersコマンドは,memberという別名もあるので,両方設定しないと意味がない。
actives,active,statなどメンバーに関するコマンドをすべて禁止する。
例:
@DenyProcedure = ('member','active','members','actives','status','stat');
又,さらに制限してget,summary,skip,noskip以外は許さないといった場合には,@PermitProcedureを使って次のように設定する。
@PermitProcedure = ('get','mget','summary','skip','noskip');
・メーリングリストの存在を知られたくない
メンバー以外のアドレスから投稿やコマンドが送られたときに,「あなたはメンバーではない」というようなメッセージを返す(reject)のではなく,単に無視(ignore)したほうが良い。その為の設定は,次のようになる。これは,makefml configのメニューでも設定可能。
例:
$REJECT_POST_HANDLER = "ignore";
$REJECT_COMMAND_HANDLER = "ignore";
・メール爆弾を排除する(短期間に大量にメールを通知する場合注意)
fmlは,メールの流量情報(MTI:Mail Traffic Information)を使ってメール爆弾を判定する機能が組み込まれている。
その仕組みは,「一定の短時間にどのくらいの量のメールが到着したか」を評価する機能。
ただし,オフラインでメールを書いてからインターネットに接続し,メールをまとめて発信するという方法は,一般的なので,それをメール爆弾と認識しないようにDate:ヘッダの時刻も考慮に入れて評価を行っている。
判定基準は,次の通り。
(1)もし,Date:ヘッダの時刻で一定時刻あたりのメール数がある値($MTI_BURST_SOFT_LIMIT)よりも多い場合,メール爆弾と判断。
(2)(1)の条件に当てはまらない場合でも,Date:ヘッダやfmlメールへの到着数が一定値($MTI_BURST_HARD_LIMIT)を超えたらメール爆弾とみなす。
この2つのしきい値は,libmti.plにおいて次のように初期設定されている。
$MTI_BURST_SOFT_LIMIT=(5/5)
$MTI_BURST_HARD_LIMIT=(2*5/5)
(1)の条件がおおむね5秒あたり5通
(2)の条件が5秒あたり10通を超えるとメール爆弾と認識する値。
いったん,メール爆弾であると判定されると,$MTI_EXPIRE_UNIT変数で設定された(設定されていない場合は,3,600秒)間は,メール爆弾の送信元と判定されたアドレスから投稿しても配信がまったく行われない。
この機能を使う為のconfig.phは,次の通り
$USE_MTI=1;
$MTI_BURST_SOFT_LIMIT=(5/5);#デフォルト値と同じ
$MTI_BURST_HARD_LIMIT=(3*5/5);#条件を少し緩和している。
なお,このMTIによるメール爆弾の検出機構は,メールの無限ループの検出にも役立つ。
fmlの通常の無限ループ検出では,Message-ID:が同じであることを検出して無限ループを止めるようになっているが,例えば,ユーザが作成したスクリプトの誤動作や,実装の悪いMTA等が原因の場合には,毎回異なるMessage-ID:を持つメールが送られることもある。このようなケースでは,MTIによる判定機能でメールループを止めることができる。
・メールループを防ぐ
fmlには,ループを防ぐ機構がいくつか組み込まれていて,もちろんデフォルトで機能している。
(a)Message-IDキャッシュ
メーリングリストのディレクトリ配下のvar/run/ディレクトリ(/home/ml/***/var/run/となる)に,msgidcacheというファイル名でfmlが配信したメッセージのMessage-IDが記録されている。fmlは,このファイルの記録と新しく投稿されたメッセージのMessage-IDを比較して,同じ場合,メールループと判定。これにより,配信されたメールがメーリングリストに戻ってきた(バウンス)しまっても,再度配信されることはない。この機能は,$CHECK_MESSAGE_ID変数が1の時に有効で,デフォルトで有効になっている。
(b)UNIX Fromによるチェック
投稿者のUNIX Fromが$MAINTAINER(つまりfml自身)であるときは,ループと判断する。
例えば,duke-ml@sushineta.comがメーリングリストアドレスのときは,$MAINTAINERは,duke-ml-admin@sushineta.comとなるので,このアドレスから届いたメールは配信しない。
もし,この機能を停止する(ループチェックしない)のであれば,$NOT_USE_UNIX_FROM_LOOP_CHECK変数に1をセットする。なお,これは,/etc/aliasesでduke-ml-admin@sushineta.comのメールを実際に受け取っている人の実アドレスからのメールは,拒否しない。
あくまで,UNIX FROMがduke-ml-admin@sushineta.comなどとなっている場合にだけ制限がかかる。
(c)投稿を認めないアカウント名
fmlでは,rootやpostmasterなど,一般にユーザが使わないアカウントからの投稿は,認めないようになっている。
排除するアカウントは,$REJECT_ADDRに正規表現の形式「|」で区切って登録する。config.phのデフォルトでは以下のようになっている。
$REJECT_ADDR = "root|postmaster|MAILER-DAEMON|msgs|nobody|news|majordomo|listserv|listproc|\S+\-help|\S+\-subscribe|\S+\-unsubscribe";
また,SPAMリストを使う方法もあります。投稿を認めないアドレスの正規表現を,spamlistファイルに1行に1つずつ列挙して登録する。
$REJECT_ADDR_LIST = "$DIR/spamlist";
(d)明らかに配信すべきでないFrom:を排除する。
From:が自分自身のアドレス(メーリングリストのアドレス)になっている等,明らかに不自然なヘッダを持つメールを排除する仕組みがある。
これは,外部からコントロールできるようにはなっていないが,fml.plのループチェックの一連の処理の中で評価されている。
これは,$REJECT_ADDRなどの設定とは関係なく有効。
以上,下記の参考書より抜粋。
参考図書
梅垣まさひろ『FreeBSD/Linuxで始めるメーリングリスト管理者編』株式会社情報管理,1997年
(173-266頁のfmlリファレンスが重宝。)
梅垣まさひろ・寺村綾子『fmlメーリングリスト管理』株式会社オーム社,2000年
(227-231頁がセキュリティについてよく記述されています。)
深町賢一『fmlバイブル』株式会社オライリー・ジャパン,2001年
(257-312頁のトラブルシューティング,日々の運用が有用。)
by 有限会社ケイアイエム(http://www.keiaiemu.com/)