いますぐ実践! Linuxシステム管理

いますぐ実践! Linux システム管理 / Vol.213 / 読者数:2011名

あけましておめでとうございます、うすだです。
今年もよろしくお願いします。

今年も、「基本的」には月2回発行を守っていきます。

そして、いままでは、極力環境に依存しないものに限定していましたが、 システム管理に有用だと思ったものであれば、 ある程度依存するものでも気にしないでご紹介していきたいと考えています。

というわけで、相変わらず微妙な内容のときもあると思いますが、 今年も引き続きご覧いただけますと、超感謝感激です。

 

さて、openSUSE 12.1 が昨年11月に公開されていましたが、 ようやく重い腰をあげて、アップグレードに取り組んでいます。
(会社で使っているノートPCは openSUSE です。理由は特にありません。)

取り組んでいます、と言っても、コマンドをいくつか叩くだけです。
最近のディストリビューションは、 コマンドや GUI でアップグレードができてしまうので、非常に楽になりました。

その半面、中で何をやっているのか、 自分なりに推測する機会が失われているようにも感じます。
技術者にとっては、ちょっと不便なくらいの方が、 いろいろ考えるヒントになってよいのではないか、と思いました。

特にオチもなく、今年一発目もはりきってまいります。

今回のお題 - procmail でメールを振り分ける

メールは、昔も今もなくてはならないものです。

ですが、スパムメールを代表とする、ぶっちゃけどうでもいいメールが、 年々増大しています。

そんな中、我々システム管理者は、毎日大量にくるメールをかき分けて、 大切なメールを発掘し対処するということを、日々強いられています。

とはいえ、今までのように、自分宛のメールを携帯に転送して、 メールが来る度に携帯を出してチェックしたり、 家でもメールソフトとにらめっこして対処するということが、 そのうち間に合わなくなってしまうのでは、という気がしております。

そのため、大事と思われるメールだけを携帯に転送したり、 明らかに不要なメールを除去したりすることを、早急に自動化する必要があります。

そこで今回は、procmail を使って、 メールの転送や不要なメールの除去などを試みてみたいと思います。

procmail とは?

procmail とは、メールの振り分けやフィルタリングなど、 メールの処理を行うためのソフトウェアです。

Procmail Homepage
http://www.procmail.org/

基本的には、.forward から呼び出して、別のメールアドレスへの転送、 ファイルへの記録、不要なメールの削除、外部プログラムの呼び出しなどを行います。

歴史は古く、1990年12月にバージョン1.00がリリースされています。
最新バージョンは 3.22 ですが、2001年9月にリリースされており、 それ以降はバージョンアップがされていないようです。
(それだけ安定している、ということかもしれません。)

おそらく大半のディストリビューションでパッケージが用意されていると思います。 なので、いつものように apt や yum などで入れてください。

  $ sudo apt-get install procmail  (Debian系の場合)
  # yum install procmail (RedHat系の場合)

…とその前に、which procmail を実行して、以下のように、 あるよ的なことを言われたら、すでに入っていますので、上記の作業は不要です。

  $ which procmail
  /usr/bin/procmail

procmail の説明を駆け足で

当メルマガは「実践」を売りとしていますが、 いきなり設定に入っていくのもどうかと思いますので、 さらっと説明をさせていただきます。

まず必要となるのが、設定ファイルです。
procmail にやってもらいたいことを、 基本的には「$HOME/.procmailrc」というファイルに書きます。内訳は、 レシピというものをずらずらと書きます。レシピは以下のような形式です。

  :0 [フラグ] [: [ロックファイル]]
  条件文(なくてもいいし複数行で指定もできる)
  アクション

フラグで確認する対象などを指定しておいて、条件文に合致したメールに対して、 アクションで指定した処理を行う、という流れになります。
とあるレシピでアクションが実行されると、基本的にはそこで処理は終了します。 つまり、その後のレシピによる確認は行われません。

条件文は、存在しなければ無条件で合致することになります。複数の指定があれば、 すべて当てはまる場合に合致することになります。

[] で囲ったフラグやロックファイルなどは、省略可能です。
フラグを省略すると、メールのヘッダだけを確認することになります。
フラグの後に : をつけると、処理の際にロックを行い、 多重に procmailが処理することを阻止できます。たとえばファイルに記録するとき、 複数の procmail が同時に書き込むと中身がおかしなことになってしまいますので、 ロックをかける必要があります。ちなみに、ロックファイルを省略すると、 自動的に名前をつけて処理してくれます。

 

まず、フラグには以下のようなものがあります。
フラグは複数指定することが可能です。
(本当はもっとたくさんありますが、主要なものだけを記載しています。)

  H ... ヘッダを確認します。(デフォルト)
  B ... 本文を確認します。
  h ... アクションにヘッダだけを渡します。
  b ... アクションに本文だけを渡します。
  c ... 以降のレシピも処理します。

 

条件文は、先頭に * を指定し、その後に正規表現で条件を指定する、 という形式になっています。
また、以下のような条件も指定できます。
(こちらも同様に、主要なものだけを記載しています。)

  ! ... 条件を否定します。
  ? ... 条件に外部プログラムを指定します。
  < ... 条件にサイズを指定し、そのサイズ未満なら合致します。
  > ... 上記と同様、そのサイズより大きければ合致します。

 

アクションには、以下のような処理内容を指定します。

  ! メールアドレス ... 指定したメールアドレスに転送します。
  | 外部プログラム ... 外部プログラムを起動します。
  { レシピ... }    ... 中で指定したレシピを実行します。
  ファイル名       ... 指定したファイルに追記します。
  ディレクトリ名   ... 指定したディレクトリにファイルを生成します。
  ディレクトリ名/. ... 上記と同様ですがファイル名が連番になります。

では実際に試します

それでは実際に試してみましょう。

ただ、いきなり自分のアカウントでやるのはリスキーです。
できれば、お試し専用のアカウントを作って、それで試してください。
(あと当然ですが、メールの送受信が可能なマシンでやりましょう。)

まず最初に、chobi@example.org から来たメールを、 hinoe@example.com に転送するための設定をやってみたいと思います。
$HOME/.procmailrc に、以下の内容を記述してみてください。

:0 H
* ^From:.*chobi@example.org
! hinoe@example.com

デフォルトではヘッダだけを確認するのですが、 念のためフラグに H を指定しています。
そして、 From ヘッダに chobi@example.org が含まれているという条件を指定しています。
その条件に合致したら、 hinoe@example.com に転送するというアクションを指定しています。

上記ができたら、$HOME/.forward に以下の内容を記述します。

"| exec /usr/bin/procmail"

これで、届いたメールが全部 procmail に渡されます。
ただ、procmail の設定を間違えたとき、メールが永久に失われる可能性があります。 そんなときは以下のように記述すると、自分に配送しつつ、 procmail にも処理をさせることができます。

\ユーザ名,"| exec /usr/bin/procmail"

あとは、chobi@example.org からメールを出して、 hinoe@example.com に転送されること、違うひとから出すと転送されないことを、 確認するだけです。(結果は割愛します。お試しください。)

 

次は、Subject に特定の文字列があると、 hinoe@example.com に転送する設定を試みます。同様に、 以下を $HOME/.procmailrc に書きます。

:0 H
* ^Subject: \[forward\]
! hinoe@example.com

Subject の先頭に [forward] とあると、hinoe@example.com に転送するようになります。

ただ、条件に合致しないメールは、闇に葬り去られてしまいます。
そこで、条件に合致しないメールは misuzu@example.net に転送する設定を追加してみたいと思います。

:0 H
* ^Subject: \[forward\]
! hinoe@example.com

:0 H
! misuzu@example.net

最初のレシピの条件に合致すると、そのアクションを実行して終わりますが、 そうでなければ次のレシピに進みます。

 

ディレクトリにファイルとして記録するには、アクションにディレクトリを指定します。 以下を設定すると、Subject に archive という文字列がある場合に、 /home/benio/archive1 というディレクトリへ記録してくれます。 (/home/benio/archive1 は事前に作っておきましょう。)

:0 H
* ^Subject:.*archive
/home/benio/archive1

条件に合致するメールを送ると、そこにファイルが作られていきます。

  $ ls archive1/
  msg.fAARH  msg.YAARH

ファイル名を連番にしたければ、以下のように設定します。

:0 H
* ^Subject:.*test.*
/home/benio/archive2/.

こんな感じで、連番になります。

  $ ls archive2/
  1  2  3  4  5

もうちょっとややこしい例を

最後に、ちょいとややこしい例を示します。
現実味は乏しいですが、万が一ややこしい設定が必要になったとき、 以下のように設定をすればよいのだと思っていただけますと幸いです。

  1. マルチパートなメールの場合、メール全体をディレクトリに、 ヘッダをファイルに記録しておしまい。
  2. Subject の先頭に [forward] とあると、hinoe@example.com に転送をする。 なければ misuzu@example.net に転送をする。

…というのを設定するとしたら、以下のようになります。

:0 H
* ^Content-[Tt]ype: multipart
{
    :0 c
    /home/benio/multi-archive/.
    :0 h :
    /home/benio/multi-header.txt
}

:0 H
* ^Subject: \[forward\]
! hinoe@example.com

:0 H
! misuzu@example.net

Content-Type ヘッダに multipart があったら、{} で囲ったレシピたちを確認します。 2つレシピがありますが、どちらも条件が指定されていないため、 無条件でアクションを実行します。
1つ目では、/home/benio/multi-archive/ に記録しています。 フラグに c を指定しているため、ここで終わらず次のレシピも確認します。
2つ目では、/home/benio/multi-header.txt に記録しますが、 フラグに h が指定されているため、ヘッダのみ記録されます。また、 同時に書き込みがされないよう、: でロックもかけています。

後半は、前述の通りですので、説明を割愛します。

おわりに

以上、procmail を使って、メールの振り分けなどを行う方法について、 とりとめもなくご説明しました。

基本的な設定であれば、上記を見たり、Google さまに伺うことで、 なんとかなるんじゃないかなと思います。
あと、procmailrc のオンラインマニュアル(man procmailrc)も、参考になります。 ぜひご覧ください。

ただ、今回では説明しきれていない部分(環境変数など)が多々あります。
そのあたりは、次回に取り上げさせていただこうと考えています。

宿題の答え

前回の宿題は、

  逆引きのゾーン設定も追加してみましょう。

でした。

前回同様、 クラスCを対象とした逆引きのゾーンをまとめて設定したいと仮定します。
ドメイン名が「local.kuri.info」、ネットワークが「192.168.1.0/24」の場合、 以下のゾーンファイルが必要になると仮定します。

$TTL 86400
@     IN SOA ns.local.kuri.info. root.local.kuri.info. (
      2012010800 ; serial
      3600       ; refresh
      1800       ; retry
      604800     ; expire
      86400      ; min
)
      IN NS ns1.local.kuri.info.
      IN NS ns2.local.kuri.info.
1     IN PTR ns1.local.kuri.info.
2     IN PTR ns2.local.kuri.info.
21    IN PTR ftp.local.kuri.info.
80    IN PTR www.local.kuri.info.

そして、named.conf には、以下の設定を追加したいとします。

zone "1.168.192.in-addr.arpa" {
    type master;
    file "local.kuri.info.rev.zone";
    allow-transfer { 192.160.1.0/24; localhost; };
};

そんなことをする、前回と同等のスクリプトは、以下の通りです。

#!/bin/sh
while read domain addr; do
    revaddr=`echo ${addr} | \
        sed 's/^\([^\.]*\)\.\([^\.]*\)\.\([^\.]*\)$/\3.\2.\1/'`

    # output zone setting
    cat << E-O-F >> /etc/named.conf

zone "${revaddr}.in-addr.arpa" {
    type master;
    file "${domain}.rev.zone";
    allow-transfer { ${addr}.0/24; localhost; };
};
E-O-F
    # output zone file
    cat << E-O-F > ${domain}.rev.zone
\$TTL 86400
@     IN SOA ns.${domain}. root.${domain}. (
      2012010800 ; serial
      3600       ; refresh
      1800       ; retry
      604800     ; expire
      86400      ; min
)
      IN NS ns1.${domain}.
      IN NS ns2.${domain}.
1     IN PTR ns1.${domain}.
2     IN PTR ns2.${domain}.
21    IN PTR ftp.${domain}.
80    IN PTR www.${domain}.
E-O-F
done

/etc/named.conf に追記して、 カレントディレクトリにゾーンファイルを作成するスクリプトです。

基本的な流れは、前回の本題でご紹介したスクリプトとほぼ同等です。
ちょっとひねっていそうなのは、3行目の revaddr くらいでしょうか。
ここでは、引数で指定されたネットワークアドレスを逆順にしています。

さて、これを、前回同様、 addrevzone.sh などというファイル名で保存をしつつ実行可能にしておきます。

  $ chmod +x addrevzone.sh

そして、やはり同様に、ドメイン名とアドレスのネットワーク部の対を、 標準入力から渡してやれば、逆引きの設定が追加されます。

  # cat zoneinfo
  local.usupi.org 192.168.0
  local.kuri.info 192.168.1
  # ./addrevzone.sh < zoneinfo

結果などは割愛します。実際にお試しください。

…とはいえ、/etc/named.conf に追記するのはリスキーだと思います。
そこで、スクリプト内の /etc/named.conf を ./named.conf などとして実行すれば、 既存設定に影響を与えなくて済みます。
(ホームの下とかでやれば、root 権限も不要ですね。)

今回の宿題

今回の宿題は、

  $HOME/.procmailrc がないときの procmail の動作を確認しましょう。

です。

procmail で処理するのを止めようとして、 $HOME/.procmailrc を削除か改名したのだけれど、 $HOME/.forward はそのままだったという場合に、 procmail はどのような動作をするのでしょうか。

というわけで、どうでもいいアカウントで実際に試してみましょう。

あとがき

冒頭の openSUSE ですが、滞りなくアップグレードできました。

ただ、GNOME端末のウィンドウサイズが、 ものすごく小さくなってしまう現象が発生しています。
80x24 に設定しても、一瞬それらしきサイズになった後、 しゅるしゅると縦方向が縮んでしまいます。

デスクトップ環境がKDEなのがいけないのか、 今のところ原因はまったくわかっていませんが、このままだと困るので、 なんとかせねば…と思っている次第です。

 

…まあ、そんな個人的な問題はどうでもよいですね。

さて、昨年は、末端の私が言うまでもなく、いろんなことがありすぎた年でしたが、 その中でも気になったのが、 ネットがトリガになったとされる中東の民主化革命でしょうか。

それに関して、興味深いブログの記事がありました。

Geekなぺーじ:ネットやデスマは病原菌
http://www.geekpage.jp/blog/?id=2012/1/6/1

ネット情報に対する免疫のない国は、大規模情報操作によって荒れるかもしれないこと、 政府によるネット表現規制によってさらにネットリテラシが育たなくなる悪循環に陥るかもしれないことなど、鋭い指摘がなされていて、たいへん興味深いです。

いつも、ひとの書いた文章に感心しているだけのわたくしとしましては、 自分なりに考えて問題提起などができるひとがすごく羨ましいです。
ですが、羨ましがっているだけでは進歩しませんので、そのひとの意見を丸飲みせず、 ほんとうにそうなのかと疑いながら読み、 自分なりの考えを引き出してみようと思いました。

 

ところで、上記を書くにあたって、ブログの記事を「記事」と呼んでよいのかどうか、 ふと疑問に思いました。

きじ【記事】の意味-国語辞書-goo辞書
http://dictionary.goo.ne.jp/leaf/jn2/51648/m0u/%E8%A8%98%E4%BA%8B/

 

新年最初のあとがきの締めが、言葉の意味で終わってしまいましたね…。

 

今回も、ここまで読んでいただき、たいへんありがとうございました。
次回は、1月22日(日) の未明にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- 今年は能動的に何かやります。…で、何をやろうかな…。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本