ウイルス&スパム管理(Maia Mailguard:Centos4.4編)

初  版: 2006/12/28

おやじが使用しているウイルス・スパム管理ソフトの Maia Mailguard について、RedHat 系で利用する場合に SuSE とはかなり対応が異なる(本質は変わらないが関連ソフト等のサポートの違いが中心なのですが・・・)ようなので整理してみました。対象のデストリは、おやじがもしかしたら使用するかもしれないCentOS4.4 です。 FedoraCore は先に行き過ぎているので、あまり参考にはならないと思います。
Maia Mailguard は Amavisd-new と SpamAssassin のために開発されたWebベースの管理システムです。Maia Mailguard は、 PHP と Perl で書かれており、管理者はシステム全体の管理やデフォルト値の設定を可能にし、エンドユーザには自分宛のメールに対するウィルススキャナやスパムフィルタの設定を可能にします。
バージョン1.0.2に対応し、若干のバグ修正も併せて盛り込んで日本語化パッチ作成しました。基本的な設定は1.0.1と同じです。機能的には、ホワイト・ブラックリストでワイルドカードが利用できるようになったこと、誤ってメールを削除してしまったときに再送信できる機能などが追加されています。なお、PHP拡張モジュールでPEAR::DB_Pager から PEAR::Pagerに変更になっているので、特にバージョンアップ時は要注意です。
おやじのサイトで提供するバージョン1.0.1/1.0.2の日本語化パッチの著作権は、株式会社サードウェア (Maia Maiguard : ホームページ ) さんと共有しています。

■はじめに

基本的には、Maia Mailguard のサイトにあるインストールドキュメントに従っていけばいいのですが、 Perl や PHP 関係のモジュールもいろいろ入れなければなりません。
ここではバーチャルドメイン環境に導入することを前提に記述していますが、もちろん通常環境でも同じ設定で使用できます。
なお、Postfix、Spamassassin、ClamAV(/AntiVir/F-Prot)、Amavisd-new は既にインストールされて動作しているものとします。(とは言うものの、CentOS の Amavisd-new は、 SuSE と異なり Amavisd-maia とデフォルトのパスが異なっているので設定をかなり変更する必要があります。従って、CentOS の Amavisd-new をハックするより新規にインストールしたほうが間違いがないので、ここではAmavisd-newがインストールされていない前提で説明します。インストールされている場合は後述のようにアンインストールしてください。) これらに関しては、こちらこちらを参考にしてください。また、当然ながら、日本語対応(mbstring付き)の PHP が使用できる Apache が動作しているものとします。

■事前準備

Maia Mailguard を動かすためには、関連のソフトやパッケージが必要になります。Maia Mailguard をインストールする前にそれらの準備を以下で行っていきます。

  1. まずは、Amavisd 用のグループとユーザを作成する。既に Amavisd-new がインストールされていた環境なら作成されているはずなので、本作業は不要である。

    # groupadd amavis [Enter]
    # useradd -g amavis -s /sbin/nologin amavis
    [Enter]


     
  2. 続いて、Spamassasinをインストールしておく。CentOS4.4 に spamassassin の rpm が用意されているので、Yum でインストールするだけである。既にインストールされているならスキップする。

    # yum install spamassassin [Enter]



■Maia Mailguard のインストール

Maia Mailguard を以下の手順で行っていきます。結構面倒くさいですが一旦動いてしまえば後が楽ですから、がんばりましょう。

◆Maia Mailguardのダウンロードと日本語化

前準備として、 Maia Mailguard をダウンロードし、日本語化を行っておきます。おやじが作成したパッチは、株式会社サードウェアさんのパッチをベースに.0.1/1.0.2対応し、1.0.1のバグ(新規追加されたメール一覧表示の設定画面でパラメータの説明がされないバグ。localeのsettings.phpのバグ)と1.0.2のバグ(状態画面でのメール種別のリンク異常)を修正したものです。

[maia-1.0.1の場合]

  1. 本家からMaia Mailguard をダウンロードし展開する。

    # mkdir /usr/local/maia [Enter]
    # cd /usr/local/maia [Enter]
    # wget http://www.maiamailguard.com/files/maia-1.0.1.tar.gz [Enter]
    # tar zxf maia-1.0.1.tar.gz [Enter]


  2. おやじの日本語化パッチをダウンロードし適用する。

    # wget http://www.aconus.com/~oyaji/suse9.3/maia-1.0.1-japanese.patch [Enter]
    # patch -p0 < maia-1.0.1-japanese.patch [Enter]


[maia-1.0.2(1.0.2a)の場合]

  1. 本家からMaia Mailguard をダウンロードし展開する。

    # mkdir /usr/local/maia [Enter]
    # cd /usr/local/maia [Enter]
    # wget http://www.maiamailguard.com/files/maia-1.0.2.tar.gz [Enter]
    # tar zxf maia-1.0.2.tar.gz [Enter]


  2. おやじの日本語化パッチをダウンロードし適用する。(inepeeさんからご指摘があったcache.phpの変数未定義問題及びリンク先の変更を20070406-maia-1.0.2-japanese.patchで対処しました。)

    # wget http://www.aconus.com/~oyaji/suse9.3/20070225-maia-1.0.2-japanese.patch [Enter]
    # wget http://www.aconus.com/~oyaji/suse9.3/20070406-maia-1.0.2-japanese.patch [Enter]
    # patch -p0 < 20070406-maia-1.0.2-japanese.patch [Enter]


    maia-1.0.2で既に動作している場合から1.0.2aにバージョンを上げるには、maia-1.0.2におやじの日本語化パッチがあたっている状態で、更におやじの1.0.2a用の日本語化パッチ(20070714-maia-1.0.2-japanese.patch)をダウンロードし適用する。その後、パッチがあたったファイルのみ入れ替える。

    ・maia-1.0.2/amavisd-maia
    ・maia-1.0.2/amavisd.conf.dist
    ・maia-1.0.2/php/constants.php
    ・maia-1.0.2/php/internal-init.php
    ・maia-1.0.2/php/login.php
    ・maia-1.0.2/php/xlogin.php

    # wget http://www.aconus.com/~oyaji/suse9.3/20070714-maia-1.0.2-japanese.patch
    # patch -p0 < 20070714-maia-1.0.2-japanese.patch



[maia-1.0.2aの場合]

maia-1.0.2a の 20070821版の日本語化パッチは、各種警告メールの日本語化対応を含んでいます。日本語化対応のため、Jcode.pmが必要でありインストールしていない場合はCPAN等でインストールしてください。
  1. 本家からMaia Mailguard 1.0.2aをダウンロードし展開する。

    # mkdir /usr/local/maia
    # cd /usr/local/maia
    # wget http://www.maiamailguard.com/files/maia-1.0.2a.tar.gz
    # tar zxf maia-1.0.2a.tar.gz


  2. おやじの日本語化パッチをダウンロードし適用する。

    # wget http://www.aconus.com/~oyaji/suse9.3/20070821-maia-1.0.2a-japanese.patch
    # patch -p0 < 20070821-maia-1.0.2a-japanese.patch


    maia-1.0.2a の 20070821版の日本語化パッチは、各種警告メールの日本語化対応(Jcode.pm要)を含んでいる。既に maia-1.0.2a で日本語化対応している場合(maia-1.0.2からmaia-1.0.2aにバージョンを上げた場合を含む)は、改めてmaia-1.0.2a.tar.gzを解凍後に上記でパッチを適用し、下記ファイルのみ入れ替えてください。

    1. maia-1.0.2/amavisd-maia
    2. maia-1.0.2/scripts/maiadbtool.pl
    3. maia-1.0.2/scripts/send-quarantine-digests.pl
    4. maia-1.0.2/scripts/send-quarantine-reminders.pl
    5. maia-1.0.2/templates/digest.tpl
    6. maia-1.0.2/templates/newuser.tpl
    7. maia-1.0.2/templates/reminder.tpl


◆Amavisd-newとMaia Mailguard用のデータベースの登録

Maia Mailguard は SQL データベースで各種情報を管理します。SQL データベースとしては、MySQL と PostgreSQL が使用できますが、ほかのソフトとの関係でここでは MySQL を使用しました。MySQL がインストールできていない場合は、こちらを参考にインストールしてください。
  1. まず、下記で "maia" ユーザを登録する。作業は root ユーザで行う。

    # mysql -u root -p mysql [Enter]
    Enter password:
    MySQL rootパスワード [Enter]
    Welcome to the MySQL monitor. Commands end with ; or \g.
    Your MySQL connection id is 20149 to server version: 4.1.10a

    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

    mysql> CREATE DATABASE maia; [Enter]
    Query OK, 0 rows affected (0.03 sec)

    mysql> flush privileges; [Enter]
    Query OK, 0 rows affected (0.06 sec)

    mysql> \q [Enter]
    Bye


  2. Maia Mailguard のデータベース作成用のmaia-mysql.sqlファイルが用意されているので、これを利用して必要なデータベーステーブルを作成する。

    # cd /usr/local/maia/maia-1.0.x [Enter]
    # mysql -u root -p maia < maia-mysql.sql [Enter]

    Enter password: MySQL rootパスワード [Enter]


  3. このデータベースへのアクセス権限を設定する。ユーザは CentOS4.4 の Amavisd-new のユーザである amavis とし、パスワードを任意に設定する。システムの amavis ユーザはログインできないユーザでパスワードを持たないが、各ファイルのパーミッションをあわせるため amavis ユーザとしてあり、ここで設定するパスワードは、Amavisd-new と Maia Mailguard で SQL データベースをアクセスするためだけなので任意に設定してよい。passwd の代わりに、SQL データベース用のパスワードを設定する。

    # mysql -u root -p maia [Enter]
    Enter password: MySQL rootパスワード [Enter]
    Welcome to the MySQL monitor. Commands end with ; or \g.
    Your MySQL connection id is 20158 to server version: 4.1.10a

    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

    mysql> GRANT CREATE, DROP, ALTER, SELECT, INSERT, UPDATE, DELETE ON maia.* TO amavis@localhost IDENTIFIED BY '
    passwd'; [Enter]
    Query OK, 0 rows affected (0.00 sec)

    mysql> \q
    [Enter]
    Bye


  4. MySQL を使っている場合は、/etc/my.cnf ファイルの中に max_allowed_packet の設定を追加する必要がある。この設定は、postfix の main.cf の「message_size_limit」で設定した値と同じにすること。

    [mysql]
    max_allowed_packet=10M


  5. ここで設定を反映させるため、MySQLをリロードしておく。

    # /etc/init.d/mysql reload [Enter]


■Maia Mailguardのスクリプトとテンプレートのインストール

Maia Mailguard 用のメンテナンススクリプトとテンプレートをインストールします。インストールディレクトリは、INSTALL ドキュメントにあわせて「 /var/amavisd/maia 」にしましたが、いくつかのディレクトリを手動で作成しなければなりません。 CentOS4.4 の Amavisd-new のディレクトリにあわせて「 /var/amavis/maia 」とする方法もありますが、その場合はスクリプト内のいくつかでパスを変更する必要があります。

  1. インストールディレクトリを作成し、データをコピーする。

    # mkdir -p /var/amavisd/maia/scripts [Enter]
    # mkdir -p /var/amavisd/maia/templates [Enter]
    # cp -r /usr/local/maia/maia-1.0.x/scripts/* /var/amavisd/maia/scripts [Enter]
    # cp -r /usr/local/maia/maia-1.0.x/templates/* /var/amavisd/maia/templates [Enter]


  2. ここでスクリプトを動かすための設定を行う。

    1. ベースとなる maia.conf.dist を /etc/maia.conf としてコピーし設定を変更する。

      # cp /usr/local/maia/maia-1.0.x/maia.conf.dist /etc/maia.conf [Enter]
      # chown amavis:amavis /etc/maia.conf [Enter]
      # chmod 640 /etc/maia.conf [Enter]


    2. /etc/maia.conf では、先に作成した maia データベースのユーザ名(amavis)とパスワード(password)を変更する。(緑字:変更)
      スクリプトのインストールパスをデフォルトの「/var/amavisd/maia」から変更した場合は、最後の$script_dirのパスも変更すること。

      # Configure your database DSN here
      dsn = "DBI:mysql:maia:localhost:3306"

      # Your database user's login name
      username = "amavis"

      # Your database user's password
      password = "passwd"

      # The directory where Maia's Perl scripts can be found.
      $script_dir = "/var/amavis/maia/scripts";


  3. Maia Mailguard のデフォルトのインストールパスにあわせたため、Amavis-newが動作するために必要なフォルダを作成し、ファイルのオーナとパーミションを設定する。ファイルのオーナは Amavisd-new の設定にあわせる。

    # mkdir /var/amavisd/tmp /var/amavisd/var /var/amavisd/db [Enter]
    # chown -R amavis:amavis /var/amavisd [Enter]
    # chmod -R 750 /var/amavisd [Enter]
    # mkdir /var/virusmails [Enter]
    # chown amavis:amavis /var/virusmails
    # chmod 750 /var/virusmails [Enter]
    # chmod 640 /var/amavisd/maia/templates/*.tpl [Enter]
    # chmod 750 /var/amavisd/maia/scripts/*.pl [Enter]


■Amavisd-newとSpamassassinのconfigテストと追加インストール

Maia Mailguard では Amavisd-new と連携するため、Amavisd-new にパッチをあてた Amavisd-maia に入れ替えなければなりません。従って、 Amavisd-new 自体はインストールする必要はないのですが、Amavisd-new を動かすための環境(関連モジュールのインストール等)は全て必要になります。
但し、CentOS4.4(RHEL4)ではサポートされていないモジュールが多いので、dag のリポリトジを使用することにします。因みに、CentOS4.xはRHEL4.xのクローンなので、RHEL4用のリポジトリを使うことになります。
Amavisd-new を動かすためには膨大な関連パッケージが必要であるが、 下記のとおり yum でインストールする。最初の行は1行で入れること。

# yum install arc cabextract freeze lzo lzop ncompress nomarch ripole unarj unrar zoo perl-Archive-Tar perl-Archive-Zip perl-BerkeleyDB perl-Compress-Zlib perl-Convert-BinHex perl-Convert-TNEF perl-Convert-UUlib perl-IO-stringy perl-MIME-tools perl-MailTools perl-Net-Server perl-TimeDate perl-Unix-Syslog [Enter]

  (snip)

Transaction Summary
=============================================================================
Install     24 Package(s)
Update       0 Package(s)
Remove       0 Package(s)
Total download size: 1.9 M
Is this ok [y/N]: y [Enter]

  (snip)

Installed: arc.i386 0:5.21j-0.2.el4.rf cabextract.i386 0:1.2-1.el4.rf freeze.i386 0:2.5.0-1.2.el4.rf lzo.i386 0:1.08-4.2.el4.rf lzop.i386 0:1.01-1.2.el4.rf ncompress.i386 0:4.2.4-43.rhel4 nomarch.i386 0:1.4-1.el4.rf perl-Archive-Tar.noarch 0:1.30-1.el4.rf perl-Archive-Zip.noarch 0:1.16-1.2.el4.rf perl-BerkeleyDB.i386 0:0.31-1.el4.rf perl-Compress-Zlib.i386 0:1.42-1.el4.rf perl-Convert-BinHex.noarch 0:1.119-2.2.el4.rf perl-Convert-TNEF.noarch 0:0.17-3.2.el4.rf perl-Convert-UUlib.i386 0:1.051-1.2.el4.rf perl-IO-stringy.noarch 0:2.110-1.2.el4.rf perl-MIME-tools.noarch 0:5.420-1.el4.rf perl-MailTools.noarch 0:1.74-1.el4.rf perl-Net-Server.noarch 0:0.94-1.el4.rf perl-TimeDate.noarch 0:1.16-1.2.el4.rf perl-Unix-Syslog.i386 0:0.100-1.2.el4.rf ripole.i386 0:0.2.0-1.2.el4.rf unarj.i386 0:2.63-0.a.2.el4.rf unrar.i386 0:3.6.8-1.el4.rf zoo.i386 0:2.10-2.2.el4.rf
Complete!


SpamAssassinとamavisd-newを動かすためのPerlモジュールとシステムユーティリティがきちんとインストールされているか、データベースアクセスができるか configtest.pl スクリプトを使って確認します。不足しているモジュールがあったら、追加インストールする必要がありますが、おやじの環境では下記のように、かなりのモジュールで対応が必要でした。

  1. configtest.pl スクリプトを起動する。

    # cd /var/amavisd/maia/scripts [Enter]
    # ./configtest.pl [Enter]

    Perl                 :    5.8.5 : OK
    file(1)              :     4.10 : UPGRADE RECOMMENDED (minimum version 4.12)
    Archive::Tar         :     1.30 : OK
    Archive::Zip         :     1.16 : OK
    BerkeleyDB           :     0.31 : OK
    Compress::Zlib       :     1.42 : OK
    Convert::TNEF        :     0.17 : OK
    Convert::UUlib       :    1.051 : UPGRADE RECOMMENDED (minimum version 1.06)
    Crypt::Blowfish      :      N/A : NOT INSTALLED (Maia Mailguard's optional encryption feature requires this)
    Crypt::CBC           :      N/A : NOT INSTALLED (Maia Mailguard's optional encryption feature requires this)
    Crypt::OpenSSL::RSA  :      N/A : NOT INSTALLED (SpamAssassin's optional DomainKeys plugin requires this)
    Data::UUID           :      N/A : NOT INSTALLED (required by Maia Mailguard)
    DB_File              :    1.809 : OK
    DBD::mysql           :   2.9004 : OK
    DBD::Pg              :      N/A : NOT INSTALLED (required if you use PostgreSQL as your Maia Mailguard database)
    DBI                  :     1.40 : OK
    Digest::MD5          :     2.33 : OK
    Digest::SHA1         :     2.07 : OK
    File::Spec           :     0.87 : OK
    HTML::Parser         :     3.35 : OK
    HTTP::Date           :     1.46 : OK
    IO::Stringy          :    2.110 : OK
    IO::Zlib             :      N/A : NOT INSTALLED (SpamAssassin's sa-update script requires this)
    IP::Country          :      N/A : NOT INSTALLED (SpamAssassin's optional RelayCountry plugin requires this)
    LWP::UserAgent       :    2.031 : OK
    Mail::Address        :     1.74 : OK
    Mail::DomainKeys     :      N/A : NOT INSTALLED (SpamAssassin's optional DomainKeys plugin requires this)
    Mail::Internet       :     1.74 : OK
    Mail::SpamAssassin   :    3.0.6 : OK
    Mail::SPF::Query     :      N/A : NOT INSTALLED (SpamAssassin's optional SPF plugin requires this)
    MIME::Base64         :     3.01 : OK
    MIME::Parser         :    5.420 : OK
    MIME::QuotedPrint    :     3.01 : UPGRADE RECOMMENDED (minimum version 3.03)
    Net::CIDR::Lite      :      N/A : NOT INSTALLED (SpamAssassin's optional SPF plugin requires this)
    Net::DNS             :     0.48 : OK
    Net::Server          :     0.94 : OK
    Net::SMTP            :     2.29 : OK Pod::Usage           :     1.16 : OK
    Template             :      N/A : NOT INSTALLED (required by Maia Mailguard)
    Time::HiRes          :     1.55 : OK
    Unix::Syslog         :    0.100 : OK
    URI                  :     1.30 : OK

    Database DSN test    : PASSED


  2. 上記のうち、ほとんどのモジュールは dag リポリトジでインストールできる。おやじは下記について yum でインストールした。

    # yum install perl-Crypt-CBC perl-Crypt-OpenSSL-RSA perl-Data-UUID perl-DBD-Pg perl-Crypt-Blowfish perl-IO-Zlib perl-IP-Country perl-Net-CIDR-Lite perl-Template-Toolkit [Enter]

      (snip)

    Transaction Summary
    =============================================================================
    Install     15 Package(s)
    Update       0 Package(s)
    Remove       0 Package(s)
    Total download size: 1.7 M
    Is this ok [y/N]: y
    [Enter]

      (snip)

    Installed: perl-Crypt-Blowfish.i386 0:2.10-1.2.el4.rf perl-Crypt-CBC.noarch 0:2.22-1.el4.rf perl-Crypt-OpenSSL-RSA.i386 0:0.24-1.el4.rf perl-DBD-Pg.i386 0:1.31-6 perl-Data-UUID.i386 0:0.14-1.el4.rf perl-IO-Zlib.noarch 0:1.04-1.2.el4.rf perl-IP-Country.noarch 0:2.21-1.el4.rf perl-Net-CIDR-Lite.noarch 0:0.20-1.2.el4.rf perl-Template-Toolkit.i386 0:2.15-1.el4.rf
    Dependency Installed: perl-AppConfig.noarch 0:1.63-1.el4.rf perl-File-HomeDir.noarch 0:0.58-1.el4.rf perl-Geography-Countries.noarch 0:1.4-2.2.el4.rf perl-Pod-POM.noarch 0:0.17-1.2.el4.rf perl-Text-Autoformat.noarch 0:1.13-1.2.el4.rf perl-Text-Reform.noarch 0:1.11-1.2.el4.rf
    Complete!


    データベースアクセスに失敗(ex. database.cfgでパスワードミス)した場合は、
    「DBI connect('maia:localhost:3306','amavis',...) failed: Access denied for user 'amavis'@'localhost' (using password: YES) at ./configtest.pl line 511
    Can't connect to SQL database at ./configtest.pl line 511.」といったメッセージが出るので、チェックする。

  3. なお、CentOS4.4 では dag を使用してもいくつかのモジュールについてアラートがでるが、RPMでは対応できないので必要応じて(使用しないモジュールはアラートを無視してもよい)CPANでアップデートする。

    # perl -MCPAN -e shell [Enter]
    Terminal does not support AddHistory.

    cpan shell -- CPAN exploration and modules installation (v1.7601)
    ReadLine support available (try 'install Bundle::CPAN')

    cpan> install Convert::UUlib [Enter]

       (snip)

    cpan> install Mail::DomainKeys [Enter]

       (snip)

    cpan> install Mail::SPF::Query [Enter]

       (snip)

    cpan> install MIME::QuotedPrint [Enter]

       (snip)

    cpan> quit [Enter]
    Lockfile removed.



■Spamassassin ルールの取り込み

Spamassassin の精度を上げるため、Maia Mailguard に既に動かしているルールをここで取り込みます。それには、scripts ディレクトリにある「load-sa-rules.pl」というスクリプトを使用します。

  1. もし、初めてならならTLECさんのファイルを /var/amavisd にダウンロードして取り込めば良い。

    # cd /var/amavisd [Enter]
    # wget http://tlec.linux.or.jp/docs/user_prefs [Enter]


    既存のデータがあるなら、これを取り込むと良い。おやじの場合は、バーチャルドメイン対応で filter ユーザで動かしていたのでそれを利用した。

    /etc/maia.conf 内の下記を、有効なデータがあるパスに併せて変更する。

    ### load-sa-rules.pl

    # The load-sa-rules script tries to find certain important rules
    # directories on its own, and usually it does a pretty good job,
    # but if it fails to find your rules directories, you can tell it
    # explicitly where to look by overriding the search here. Setting
    # these to "undef" tells load-sa-rules to find the directories
    # on its own (recommended).

    # The directory where SpamAssassin's local.cf file can be found.
    #$local_cf_dir = "/etc/mail/spamassassin";
    $local_cf_dir = undef; # default: let the script find it

    # The directory where SpamAssassin's core rules can be found.
    # If you wish to specify the directory yourself, you can use the
    # %%VERSION%% macro to replace the actual SpamAssassin version number.
    #$system_rules_dir = "/usr/share/spamassassin";
    #$system_rules_dir = "/var/lib/spamassassin/%%VERSION%%"; # sa-update
    $system_rules_dir = undef; # default: let the script find it

    # The directory where your amavis user's user_prefs file can be found.
    #$user_rules_dir = "/var/amavisd/.spamassassin";
    #$user_rules_dur = "~/.spamassassin";
    #$user_rules_dir = undef; # default: let the script find it
    $user_rules_dir = "/var/amavisd";


  2. load-sa-rules.pl を起動してルールを取り込む。ズラズラと取り込んだルールが表示される。

    # cd /var/amavisd/maia/scripts [Enter]
    # ./load-sa-rules.pl [Enter]
    Scanning /usr/local/share/spamassassin for SpamAssassin rules
    Scanning /etc/mail/spamassassin for SpamAssassin rules
    /etc/mail/spamassassin/local.cf
    Adding new rule: ISO2022JP_CHARSET (ISO-2022-JP message)
    Adding new rule: GB2312_CHARSET (GB2312 message)
    Adding new rule: BIG5_CHARSET (Big5 message)
    Adding new rule: WINDOWS_CHARSET (Windows-1252 message)
    Adding new rule: GB2312ENC (gb2312 message)
    Adding new rule: MIMEQENC (Quoted-Printable mime definition)

       ( snip )

    Scanning /var/amavisd/.spamassassin for SpamAssassin rules
    370 new rules added, all scores updated.


  3. 1項で紹介したTLECさんのルールはかなりの頻度で更新されているので、これを有効に使わせてもらうと精度があがると思われる。そこで、一日に一回(迷惑をかけるので節度を持って)、ルールをチェックし更新されていたらダウンロードしload-sa-rules.pl を起動してルールを取り込むようにした。

    1. 適当な場所(おやじは /usr/local/bin/sa_learn )に、下記内容を適当な名前(ex. sa_learn.sh)でファイルを作成する。スクリプト中の WORK_DIR="/usr/local/bin/sa_learn" は設置したパスに併せること。

      #!/bin/sh

      CF_DIR="/var/amavisd/"
      CF_FILES="user_prefs"
      TLEC="http://tlec.linux.or.jp/docs/"
      TLEC_FILES="user_prefs"
      WORK_DIR="/usr/local/bin/sa_learn"

      cd ${WORK_DIR}
      if [ -f ${TLEC_FILES} ]; then
          cp ${TLEC_FILES} ${TLEC_FILES}.2
          wget -q -N ${TLEC}${TLEC_FILES}
          cmp -s ${TLEC_FILES} ${TLEC_FILES}.2
          if [ $? = 1 ]; then
              cp ${TLEC_FILES} ${CF_DIR}${CF_FILES}
              /var/amavisd/maia/scripts/load-sa-rules.pl
              /etc/rc.d/init.d/amavisd reload
          fi
      else
          wget -q -N ${TLEC}${TLEC_FILES}
          if [ -f ${TLEC_FILES} ]; then
              cp ${TLEC_FILES} ${CF_DIR}${CF_FILES}
              /var/amavisd/maia/scripts/load-sa-rules.pl
              /etc/rc.d/init.d/amavisd reload
          fi
      fi

      exit;


    2. スクリプトに実行権を付与し、実行してみる。初回ならルールをダウンロードして、データが取り込まれ、最後にmaia(Amavisd-new)がreloadされるはずである。

      # chmod 755 /usr/local/bin/sa_learn/sa_learn.sh [Enter]
      # /usr/local/bin/sa_learn/sa_learn.sh [Enter]
      2006-05-06 16:35:25 Maia: [load-sa-rules] Adding new rule: GTUBE (Generic Test for Unsolicited Bulk Email)
      2006-05-06 16:35:25 Maia: [load-sa-rules] Adding new rule: RAZOR2_CHECK (Listed in Razor2 (http://razor.sf.net/))

         ( snip )

      2006-05-06 16:35:40 Maia: [load-sa-rules] 639 new rules added (1514 rules total), all scores updated.
      Reload virus-scanner (amavisd-new)                    done


    3. 動作が確認できたら /etc/crontab に下記内容を追記し、corn で1日1回(下記例では3:12)に実行して更新を行うようにする。

      12 3 * * * root /usr/local/bin/sa_learn/sa_learn.sh >/dev/null 2>&1



■Maia Mailguard のPHPスクリプトのインストール

ダウンロードしたMaia Mailguard のPHPスクリプトをインストールします。インストールは、Apache のドキュメントルート配下で適当なディレクトリを作成して行います。ここでは、http://www.aconus.com/mail/ でアクセスするものとして、「/var/www/html/mail」ディレクトリ配下にインストールしました。

  1. 「/var/www/html/mail」ディレクトリを作成し、そこにダウンロードしたPHPスクリプトをコピーする。

    # mkdir /var/www/html/mail [Enter]
    # cp -r /usr/local/maia/maia-1.0.x/php/* /var/www/html/mail/ [Enter]


  2. 必要に応じておやじの日本語化パッチ( maia_ja-x.x.x.patch )をインストールする。日本語化パッチはパッチというほどのものではなく、日本語にするとフォントが大きすぎるため調整したものである。バージョン1.0.2の日本語化パッチには適用済みなので本作業は不要。

    # cd /var/www/html/mail [Enter]
    # wget http://www.aconus.com/~oyaji/suse9.3/maia_ja-2.2.0.patch [Enter]
    # patch -p0 < maia_ja-2.2.0.patch [Enter]
    # rm maia_ja-2.2.0.patch [Enter]


  3. 株式会社サードウェアさんの日本語化パッチは UTF-8 ベースなので、 PHP の設定を変更する必要がある。他で何も使っていなければ php.ini で設定しても良いが、おやじのところでは既に EUC ベースで動いているソフトがあるので、 .htaccess で対応することにした。

    1. Maiaのディレクトリ( /var/www/html/mail )に下記内容で .htaccess ファイルを作成し設置する。

      php_value mbstring.internal_encoding UTF-8
      php_value mbstring.http_output UTF-8
      php_value mbstring.func_overload 6


    2. このディレクトリで .htaccess ファイルを有効にするため、 AllowOverride ディレクティブで有効にする内容を設定する。上記だけなら Options のみでよいが、後述する admin ディレクトリでの認証制御を行うなら AuthConfig も併せて設定しておくとよい。いろいろ使用する可能性があるなら、All で全て有効にしておいてもよい。この設定は、httpd.conf に直接書いても良いが、おやじは管理しやすくするため /etc/httpd/conf.d/ ディレクトリ配下に下記内容で maia.conf というファイルを作成し設置した。

      <Directory /var/www/html/mail>
         AllowOverride All
      </Directory>


  4. 続けて、Smarty テンプレートエンジンをインストールする。Smarty もシステムベースでインストールしても良いが、他のアプリとの競合を避けるため、Maiaに組み込むことにした。

    # cd /usr/local/maia [Enter]
    # wget http://smarty.php.net/do_download.php?download_file=Smarty-2.6.16.tar.gz [Enter]
    # tar zxf Smarty-2.6.16.tar.gz [Enter]
    # cp -r Smarty-2.6.16/libs /var/www/html/mail/libs/Smarty [Enter]


  5. なお、環境によっては統計の時刻表示がおかしくなる場合(UNIXタイムモドキ)がある。おやじは、バックアップ機のSuSE9.3やCentOS4.2では特に問題はなかったが、現用のx86_64環境のSuSE9.3でおかしくなった。Smartyのdate_formatが正しく動作しない(localtimeがうまく取れない?)ためで、maiadate_formatなるplugin( modifier.maiadate_format.tar.gz )を作成して、stats.tplにパッチ( maia_localtime-2.2.0.patch )をあてて対処した。問題がなければ対処不要。

    # cd /var/www/html/mail/libs/Smarty/plugins [Enter]
    # wget http://www.aconus.com/~oyaji/suse9.3/modifier.maiadate_format.tar.gz [Enter]
    # tar zxfv modifier.maiadate_format.tar.gz [Enter]
    # rm modifier.maiadate_format.tar.gz [Enter]
    # cd /var/www/html/mail [Enter]
    # wget http://www.aconus.com/~oyaji/suse9.3/maia_localtime-2.2.0.patch [Enter]
    # patch -p0 < maia_localtime-2.2.0.patch [Enter]
    # rm maia_localtime-2.2.0.patch [Enter]


  6. Maiaの設定はconfig.phpで行うが、初期ファイルはconfig.php.distをコピーして作成する。

    # cd /var/www/html/mail [Enter]
    # cp config.php.dist config.php [Enter]


  7. 環境に合わせてMaiaの設定を行う。設定したのは、日本語環境への対応、maiaデータベースへのアクセス関係、バーチャルドメイン対応とログイン認証関係の設定である。(config.phpの以下のパラメータを変更)

    //$default_display_language = "en";
    $default_display_language = "ja";

    //$default_charset = "ISO-8859-1";
    $default_charset = "UTF-8";

    //$maia_sql_dsn = "dbtype://dbuser:passwd@tcp(hostname:port)/maia";
    //$maia_sql_dsn = "mysql://amavis:passwd@tcp(localhost:3306)/maia";
    //$maia_sql_dsn = "mysql://dbuser:passwd@unix(/var/tmp/mysql.sock)/maia";
    //$maia_sql_dsn = "mysql://dbuser:passwd/maia";
    $maia_sql_dsn = "mysql://amavis:passwd@tcp(localhost:3306)/maia";

    //$address_rewriting_type = 0;
    $address_rewriting_type = 4;

    //$auth_method = "internal";
    $auth_method = "sql";

    // Database connection string to use for authentication. This may
    // be a different database than the one Maia uses. The connection
    // string uses the same format as $maia_sql_dsn.
    //$auth_sql_dsn = "dbtype://dbuser:passwd@tcp(localhost:3306)/dbname";
    $auth_sql_dsn = "mysql://postfix:new_password1@tcp(localhost:3306)/postfix";

    // Name of the table that contains the user's authentication info
    //$auth_sql_table = "auth";
    $auth_sql_table = "mailbox";

    // Name of the column that contains the user's name
    $auth_sql_username_column = "username";

    // Name of the column that contains the user's password
    $auth_sql_password_column = "password";

    // Name of the column that contains the user's e-mail address
    //$auth_sql_email_column = "email";
    $auth_sql_email_column = "username";

    // Password encryption type:
    //
    // "plaintext" - no encryption
    // "md5" - MD5 hash
    // "crypt" - crypt() hash
    //$auth_sql_password_type = "plaintext";
    $auth_sql_password_type = "crypt";


    1. $default_display_language
      デフォルトで使用する言語をlocaleにあるフォルダ名で指定する。日本語の「ja」を設定。

    2. $default_charset
      画面表示で使用するキャラクタセットを指定する。言語ファイルはUTF-8なので、これにあわせる。

    3. $maia_sql_dsn
      MySQLのデータベースへのアクセスパラメータを設定する。「passwd」の部分を先に設定したパスワードに変更すること。

    4. $address_rewriting_type
      通常は、"0" で良いが、バーチャルドメインの場合はドメインを含めてuserとして扱うため "4" に変更する。

    5. $auth_method
      Maia Mailguard にログインするときの認証を行う方法を指定する。通常なら認証方法に依存しない"pop3"で行うのが簡単。おやじは、バーチャルドメインでMySQLで認証しているため、"sql"で認証することにした。もちろんpop3でも可である。

    6. $auth_sql_dsn
      データベースはpostfixの認証で作成したmailboxテーブルで行うものとし、dbtype: mysql 、dbuser: postfix 、passwd: new_password1(postfixのところで設定したパスワード) 、dbname: postfix と設定する。

    7. $auth_sql_table
      "mailbox"テーブルで認証する。

    8. $auth_sql_username_column/$auth_sql_password_column
      デフォルト値がpostfixのテーブルと同じなのでそのまま。

    9. $auth_sql_email_column
      メールアドレス = "username"なので、"username"を設定。

    10. $auth_sql_password_type
      パスワードタイプは"crypt" とする。と、書いたが、CentOS4.4 の PHP は MCrypt をサポートしていないため、標準のままでは plaintext とするしかない。当然、関連するPostfixAdminやDovecotも合わせる必要がある。 Courier-imap では authdaemon が cleartext を扱えないため、Courier-imapを使用する場合はPHP を MCrypt 対応にすればよいので、対応したい場合はこちらを参照のこと。手っ取り早くできればいいだけの方は、ダウンロードにおやじが作成した RPM(32/64ビット) を置いておくのでインストールしてください。


  8. PHPスクリプトをApacheのオーナにあわせておく。

    # chown -R apache:apache /var/www/html/mail [Enter]


  9. ここでApacheのセキュリティ対策を行っておく。

    1. こちらを参考に、admin ディレクトリへのアクセスに認証を行うようにする。

    2. こちらを参考に、mail ディレクトリ配下へのアクセスは HTTPS のみとするように設定する。

  10. ここで設定を反映させるため、Apacheをリロードしておく。

    # service httpd reload [Enter]


■PHP及びデータベース関係の設定の確認

ここで、PHPとデータベース関係の設定に問題がないか、configtest.php を使ってチェックしておきます。
http://www.aconus.com/mail/admin/configtest.php にアクセスすれば、自動的に環境チェックが行われ結果が表示されます。


おやじの初期の環境では、上記のとおりかなりのモジュールが入っていませんでした。
  1. まず、おやじの環境では下記のようなメモリ不足のエラーが出てそのままでは更新できなかったので、/etc/php.iniの設定をデフォルトの8Mから倍の16Mに変更した。おやじのデバック機では何も問題は発生しなかったり環境に依存するので、うまくいかない場合のみ対処すればよい。(赤字:追加、緑字:変更、青字:削除)

    [エラーメッセージ]

    PHP Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 64 bytes) in /usr/share/pear/PEAR/Common.php on line 2004
    Allowed memory size of 8388608 bytes exhausted (tried to allocate 0 bytes)


    [/etc/php.ini修正内容]

    ;memory_limit = 8M ; Maximum amount of memory a script may consume (8MB)
    memory_limit = 16M


  2. まずは不足しているPHPライブラリを追加する。IMAPとGDがなかったので、以下でイントールした。

    # yum install php-gd php-imap [Enter]

      (snip)

    Transaction Summary
    =============================================================================
    Install      2 Package(s)         
    Update       0 Package(s)         
    Remove       0 Package(s)         
    Total download size: 150 K
    Is this ok [y/N]: y [Enter]

      (snip)

    Installed: php-gd.i386 0:4.3.9-3.22 php-imap.i386 0:4.3.9-3.22
    Complete!


  3. まずは不足しているPEARモジュールのうちyumでインストールできるものをインストールした。全てpearでインストールしても良い。

    # yum list | grep pear [Enter]
    php-pear.i386                            4.3.9-3.22             installed
    pearpc.i386                              0.3.1-1.2.el4.rf       dag
    php-pear-excel.noarch                    0.9.0-1.el4.rf         dag
    php-pear-log.noarch                      1.9.3-1.2.el4.rf       dag
    php-pear-mail_mime.noarch                1.3.1-1.2.el4.rf       dag
    php-pear-ole.noarch                      0.5-2.2.el4.rf         dag
    php-pear-phpunit.noarch                  1.3.1-1.2.el4.rf       dag
    # yum install php-pear-log php-pear-mail_mime [Enter]

      (snip)

    Transaction Summary
    =============================================================================
    Install      2 Package(s)
    Update       0 Package(s)
    Remove       0 Package(s)
    Total download size: 59 k
    Is this ok [y/N]: y [Enter]

      (snip)

    Installed: php-pear-log.noarch 0:1.9.3-1.2.el4.rf php-pear-mail_mime.noarch 0:1.3.1-1.2.el4.rf
    Complete!


  4. 残りはpearでインストールする。

    # pear install DB_Pager [Enter]

    downloading DB_Pager-0.7.tgz ...
    Starting to download DB_Pager-0.7.tgz (3,447 bytes)
    ....done: 3,447 bytes
    install ok: DB_Pager 0.7
    # pear install Auth_SASL [Enter]

    downloading Auth_SASL-1.0.2.tgz ...
    Starting to download Auth_SASL-1.0.2.tgz (5,645 bytes)
    .....done: 5,645 bytes
    No handlers for package.xml version 2.0

    # pear install Net_IMAP [Enter]

    downloading Net_IMAP-1.0.3.tgz ...
    Starting to download Net_IMAP-1.0.3.tgz (27,192 bytes)
    .........done: 27,192 bytes
    install ok: Net_IMAP 1.0.3
    # pear install Net_POP3 [Enter]

    downloading Net_POP3-1.3.6.tgz ...
    Starting to download Net_POP3-1.3.6.tgz (10,076 bytes)
    .....done: 10,076 bytes
    install ok: Net_POP3 1.3.6


    ※ AUTH_SASLが「No handlers for package.xml version 2.0」でインストールできない場合は、以下の方法でpearを1.4.0以降にバージョンアップする必要があります。おやじの環境での手順です。依存関係等があり、以下の手順が良いと思いますが、環境によってはエラーを見ながら対処が必要です。

    1. PEARがArchive_Tarの1.3.1以降を要求してくるので最新版にする。

      # pear upgrade Archive_Tar [Enter]


    2. PEARの最新(2007/01/08現在)版は1.4.11であるが、1.3.3以降でないとアップグレードできないので二段構えでアップグレードする。

      # pear upgrade PEAR-1.3.3 [Enter]
      # pear upgrade PEAR [Enter]


    3. これで、AUTH_SASLがインストールできるようになるのでインストールする。

      # pear install AUTH_SASL [Enter]


    4. ついでに、インストールモジュールを最新版にしておく。

      # pear install AUTH_SASL [Enter]



■Amavisd-maiaのインストール

Amavisd-new と MaiaMailguard を連携させるため、Maia Mailguard では Amavisd-new にパッチを当てた状態の amavisd-maia というファイルが提供されており、更に前作業の日本語化でパッチがあたっているのでそれを利用します。既に Amavisd-new がインストールされているなら、アンインストールしてください。

  1. Amavisd-maia をインストールする。

    # cd /usr/sbin [Enter]
    # cp /usr/local/maia/maia-1.0.x/amavisd-maia amavisd [Enter]
    # chown root amavisd [Enter]
    # chmod 755 amavisd [Enter]


  2. Amavisd-new の起動スクリプトを設定する。CentOS4.4のスクリプトではうまく起動できないので注意。

    # cp /usr/local/maia/maia-1.0.x/reference/amavisd-new-2.2.1/amavisd_init.sh /etc/rc.d/init.d/amavisd [Enter]
    # chmod 755 /etc/rc.d/init.d/amavisd [Enter]
    # chkconfig amavisd on [Enter]



■Amavisd-newの設定

Amavisd-new の設定は /etc/amavisd.conf で行いますが、Amavisd-new を MaiaMailguard と連携させるためには MaiaMailguard のサイトにある amavisd.conf のサンプルファイルをベースに編集していきます。CentOS4.xデフォルトの amavisd.conf を編集するのはかなり面倒なので、アンインストールして残っていても、バックアップして作成しなおしたほうが良いです。

  1. MaiaMailguard のための設定ではないが、 Amavisd-new の基本的な設定を行う。(赤字:追加)

    1. ドメインの変更

      #$mydomain = 'yourdomain.tld'; # a convenient default for other settings
      $mydomain = 'mail.aconus.com'; # a convenient default for other settings


    2. ホスト名の変更

      #$myhostname = 'host.domain.tld'; # must be a fully-qualified domain name!
      $myhostname = 'mail.aconus.com'; # must be a fully-qualified domain name!


  2. MaiaMailguard のサンプルコンフィグでは隔離・キャッシュするメール本文の暗号化機能がオプションといいながら有効になっているが、おやじの環境では PHP(mimeDecode.php)でエラーがでて復号化できないので無効にした。このままで運用してしまうと、後でMaiaMailguardのビューアでは本文が見えなくなってしまうので要注意。

    # Blowfish encryption key file (optional)
    #$key_file = "$MYHOME/maia.key";

  3. 動作を確認するためログレベルを変更して、詳細なログを採るようにする。確認ができたら元の'0'に戻す。

    #$log_level = 0;
    $log_level = 5;


  4. MySQLのデータベースにアクセスするための設定を追加する。データベース名: maia 、ユーザ: amavis 、下記「passwd」は、先に設定したデータベース用のパスワードを設定すること。

    # @lookup_sql_dsn =
    #   ( ['DBI:mysql:database=mail;host=127.0.0.1;port=3306', 'user1', 'passwd1'],
    #     ['DBI:mysql:database=mail;host=host2', 'username2', 'password2'] );
    @lookup_sql_dsn = ( ['DBI:mysql:database=maia;host=127.0.0.1;port=3306', 'amavis', 'passwd'] );


  5. Amavisd-new でのメールの最終処理の設定を必要なら変更する。Amavisd-new ではスパムとおかしなヘッダのメールはデフォルトで 'D_PASS' (通過させる)ようになっているが、これではMaia Mailguard を入れてる意味がないので、'D_DISCARD'に変更する。但し、この設定ではMaia Mailguardに宛先がない(ユーザがいるがまだ一度もMaia Mailguardにログインしていない場合を含む)メールが誤認識されると廃棄されてしまうので、システムで取り扱っているドメインは必ず登録しておくこと。

    $final_virus_destiny        = D_DISCARD;
    $final_banned_destiny       = D_DISCARD;
    $final_spam_destiny         = D_DISCARD;
    $final_bad_header_destiny   = D_DISCARD;


    # SOME OTHER VARIABLES WORTH CONSIDERING (see amavisd.conf-default for all)

    $warnvirussender = 0;
    $warnspamsender  = 0;


  6. ここで設定を反映させるため、Amavisd-newを再起動しておく。

    # /etc/init.d/amavisd restart [Enter]


  7. 使用するウイルススキャナに併せて、設定を変更する。サンプルの amavisd.conf では ClamAV 用の設定がされている。ClamAV をデーモンモードで使用するならAmavisd-new側がソケットファイル通信になっているのでLocalsocket のファイル指定を行うが、CentOS4.4のClamAVのデフォルトは"/var/run/clamav/clamd.sock"のため、"/var/amavisd/clamd.sock"から変更する必要がある。

    ### http://www.clamav.net/
    ['ClamAV-clamd',
       \&ask_daemon, ["CONTSCAN {}\n", "
    /var/run/clamav/clamd.sock"],
       qr/\bOK$/, qr/\bFOUND$/,
       qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
    # NOTE: run clamd under the same user as amavisd; match the socket
    # name (LocalSocket) in clamav.conf to the socket name in this entry
    # When running chrooted one may prefer: ["CONTSCAN {}\n","$MYHOME/clamd"],


     他のスキャナを使用する場合は、下記のとおりとする。

    1. Amavisd-new では、プライマリとセカンダリにそれぞれ複数のスキャナを登録できる。Amavisd-new はプライマリのスキャナで検出するまで全てのスキャナでスキャンし、プライマリスキャナの全てが失敗した場合にセカンダリスキャナでスキャンする。

    2. 一般的に、プライマリスキャナには毎回スキャンされるためレスポンスが良いデーモンモードのスキャナを使用し、セカンダリにはコマンドモードのスキャナを配置するとよい。但し、無料で使用できるデーモンモードのスキャナはClamAVぐらいしかなくなってしまったので、両方ともコマンドモードでもかまわない。

    3. プライマリスキャナは必ず登録しないと、Amavisd-newが動作するたびにエラーが出てしまうので注意すること。また、プライマリに複数のスキャナを登録できるとはいえ、正常メールは毎回その全てでスキャンされるので負荷がかかるので、一つにすべきである。

    4. 使用するスキャナ毎の設定方法がこちらにあるので参考に設定すれば良い。その際、プライマリはプライマリ・スキャナ・アレイ(@av_scanners)にセカンダリはセカンダリ・スキャナ・アレイ(@av_scanners_backup) に設定する。


      F-Prot のみを動かした時の一例を以下に示す。F-Protは、サーバ用とフリーで使える一般用があるが、サーバ用はデーモンモードで動作するが一般用はコマンドラインモードでしか動作できないため、CentOS4.4のAmavisd-newのデフォルトのまま動作させると以下のようなエラーがでる。

      Dec 2 20:21:47 server amavis[5869]: (05869-01) FRISK F-Prot Daemon: Can't connect to INET socket 127.0.0.1:10201: Connection refused, retrying (2)
      Dec 2 20:21:47 server amavis[5869]: (05869-01) FRISK F-Prot Daemon: Can't connect to INET socket 127.0.0.1:10202: Connection refused, retrying (3)
      Dec 2 20:21:47 server amavis[5869]: (05869-01) FRISK F-Prot Daemon: Can't connect to INET socket 127.0.0.1:10203: Connection refused, retrying (4)
      Dec 2 20:21:47 server amavis[5869]: (05869-01) FRISK F-Prot Daemon: Can't connect to INET socket 127.0.0.1:10204: Connection refused, retrying (5)
      Dec 2 20:21:48 server amavis[5869]: (05869-01) FRISK F-Prot Daemon: Can't connect to INET socket 127.0.0.1:10200: Connection refused, retrying (6)
      Dec 2 20:21:48 server amavis[5869]: (05869-01) FRISK F-Prot Daemon: Can't connect to INET socket 127.0.0.1:10201: Connection refused, retrying (7)
      Dec 2 20:21:48 server amavis[5869]: (05869-01) FRISK F-Prot Daemon: Can't connect to INET socket 127.0.0.1:10202: Connection refused, retrying (8)
      Dec 2 20:21:48 server amavis[5869]: (05869-01) FRISK F-Prot Daemon: Can't connect to INET socket 127.0.0.1:10203: Connection refused, retrying (9)
      Dec 2 20:21:48 server amavis[5869]: (05869-01) FRISK F-Prot Daemon: Can't connect to INET socket 127.0.0.1:10204: Connection refused, retrying (10)
      Dec 2 20:21:54 server amavis[5869]: (05869-01) FRISK F-Prot Daemon av-scanner FAILED: Too many retries to talk to 127.0.0.1:10200 (Can't connect to INET socket 127.0.0.1:10200: Connection refused) at (eval 58) line 257.
      Dec 2 20:21:54 server amavis[5869]: (05869-01) WARN: all primary virus scanners failed, considering backups


      これは、CentOS4.4のAmavisd-newのデフォルトのamavisd.confでは、F-Protはprimaryスキャナとしてデーモンモードで設定されており、secondaryスキャナとしてコマンドラインモードで設定されているため、一般用のコマンドラインモードのスキャナにデーモンモードでつなぎに行こうとするので、上記のエラーが出る。 対策としては、以下の2点を変更すればよい。

      • amavisd.confのprimaryスキャナセクションにあるF-Protのデーモンモード用の設定をコメントアウトする。

      • amavisd.confのsecondaryスキャナセクションにあるF-Protのコマンドライン用の設定をprimaryスキャナセクションにコピーし、元のsecondaryスキャナセクションにあるF-Protのコマンドライン用の設定をコメントアウトする。
        これは、1項だけでも動くが、スキャンする毎にprimaryスキャナがないというエラーが出るための対策。

      両方の対策を実施した結果を下記に示す。

      @av_scanners = (

        (snip)

      # このブロックをコメントアウト
      ### http://www.f-prot.com/
      #['FRISK F-Prot Daemon',
      #  \&ask_daemon,
      #  ["GET {}/*?-dumb%20-archive%20-packed HTTP/1.0\r\n\r\n",
      #    ['127.0.0.1:10200','127.0.0.1:10201','127.0.0.1:10202',
      #     '127.0.0.1:10203','127.0.0.1:10204'] ],
      #  qr/(?i)<summary[^>]*>clean<\/summary>/,
      #  qr/(?i)<summary[^>]*>infected<\/summary>/,
      #  qr/(?i)<name>(.+)<\/name>/ ],

      # このブロックはこちらからコピー
      ### http://www.f-prot.com/
      ['FRISK F-Prot Antivirus', ['f-prot','f-prot.sh'],
        '-dumb -archive -packed {}', [0,8], [3,6],
        qr/Infection: (.+)|\s+contains\s+(.+)$/ ],

        (snip)

      );

      @av_scanners_backup = (

        (snip)

      # このブロックをコメントアウト
      ### http://www.f-prot.com/   - backs up F-Prot Daemon
      #['FRISK F-Prot Antivirus', ['f-prot','f-prot.sh'],
      #  '-dumb -archive -packed {}', [0,8], [3,6],
      #  qr/Infection: (.+)|\s+contains\s+(.+)$/ ],

      (snip)

      );


■Postfix の設定

 
最後にPostfix関係の設定を行います。関連ページと重複しますが間違えないように再掲します。基本的にフィルタ関係の処理が不要になり、一般的なAmavisd-newを使ったフィルタリングの設定と同じです。

  1. Postfix の /etc/postfix/main.cf に [smtpd] サーバで受信したメールをAmavisd-new 10024番ポートにfowarding する設定を追加する。

    # postconf -e 'content_filter=smtp-amavis:[127.0.0.1]:10024' [Enter]
    # postconf -e 'max_use=10' [Enter]


  2. Postfix の /etc/postfix/master.cf に下記を追加する。なお、実際の設定時は、smtp-amavis と127.0.0.1:10025 の行頭に空白を入れないことと、オプション行の先頭と行内のパラメータの区切りは「Tab」を使用すること。空白ではエラーとなることがあるので注意が必要である。(赤字:追加、青字:変更)

    # ==========================================================================
    # service type  private unpriv  chroot  wakeup  maxproc command + args
    #               (yes)   (yes)   (yes)   (never) (100)
    # ==========================================================================
    smtp      inet  n       -       n       -       -       smtpd
    smtps     inet  n       -       n       -       -       smtpd
        -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes

    pickup    fifo  n       -       n       60      1       pickup

    smtp-amavis unix -      -       n       -       2       smtp
        -o smtp_data_done_timeout=1200
        -o smtp_send_xforward_command=yes
        -o disable_dns_lookups=yes
        -o max_use=20
    127.0.0.1:10025 inet n  -       n       -       -       smtpd
        -o content_filter=
        -o local_recipient_maps=
        -o relay_recipient_maps=
        -o smtpd_restriction_classes=
        -o smtpd_delay_reject=no
        -o smtpd_client_restrictions=permit_mynetworks,reject
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o smtpd_data_restrictions=reject_unauth_pipelining
        -o smtpd_end_of_data_restrictions=
        -o mynetworks=127.0.0.0/8
        -o strict_rfc821_envelopes=yes
        -o smtpd_error_sleep_time=0
        -o smtpd_soft_error_limit=1001
        -o smtpd_hard_error_limit=1000
        -o smtpd_client_connection_count_limit=0
        -o smtpd_client_connection_rate_limit=0
        -o receive_override_options=
    no_address_mappings,no_header_body_checks,no_unknown_recipient_checks


    [smtp-amavis]
    1. smtp-amavis は、Amavisd-newのREADME.postfxを参考に設定する。

    [[127.0.0.1:10025]
    1. ここも、Amavisd-newのREADME.postfxを参考に設定する。
    2. PostfixAdminの転送機能を利用していると、README.postfxの設定では転送先に2通同じメールが配送されてしまう。その対策として、上記のように receive_override_options に 「 no_address_mappings 」を追加する。
      なお、上記では転送元にも配送されるが、転送先にだけに配送すればよい場合は、main.cf に「 receive_override_options = no_address_mappings 」を追記すればよい。


  3. ウイルス/SPAM検出時のメール通知ユーザ(virusalert / spamalert )を追加するが、バーチャルドメインの場合は、Postfix Admin で alias(別名)を追加する。通常は、aliases(/etc/aliases) にウイルス/SPAM検出時のメール通知ユーザを追加する。設定後、newaliases すること。

    # vi /etc/aliases [Enter]

    virusalert: root
    spamalert: root

    [Esc],[:],[w],[q]で保存。

    # newaliases [Enter]



■メンテナンス用スクリプトの設定

Maia Mailguard にはいくつかの管理用スクリプトが用意されているので、それらを設定します。スクリプトはいずれも corn で周期的に起動することを前提に作成されているので、ドキュメントに従い /etc/crontab に設定します。なお、これらのスクリプトは Amavisd-new のユーザ(CentOSならamavis)で実行する必要があります。

  1. process-quarantine.pl

    ユーザがスパムや正規メールと判定した情報を元に、Bayesデータベースを学習させるためのスクリプトで毎時走らせるように指定されている。オプションがいくつかあるが、Bayesデータベースを学習させる --learn とし、毎時12分に実行させるように下記をcrontabに追加した。

    12 * * * * amavis /var/amavisd/maia/scripts/process-quarantine.pl --learn >/dev/null 2>&1


    [BayesデータベースのMySQL化]

    Bayesデータべースのバックアップを良く忘れるので、下記を参考にMySQL化した。データベースそのものは、maia-mysql.sqlでデータベースを作成したときに作成されているので、設定のみである。

       http://www.maiamailguard.com/maia/wiki/SpamAssassin3SQLBayes

    1. /etc/mail/spamassassin/local.cfに下記を追加する。

      use_bayes 1
      bayes_store_module          Mail::SpamAssassin::BayesStore::SQL
      #bayes_store_module         Mail::SpamAssassin::BayesStore::PgSQL
      bayes_sql_dsn               DBI:mysql:maia
      #bayes_sql_dsn              DBI:Pg:dbname=maia;host=localhost;port=5432
      bayes_sql_username         
      amavis
      bayes_sql_password         
      passwd
      auto_whitelist_factory      Mail::SpamAssassin::SQLBasedAddrList
      user_awl_dsn                DBI:mysql:maia
      #user_awl_dsn               DBI:Pg:dbname=maia;host=localhost;port=5432
      user_awl_sql_username       
      amavis
      user_awl_sql_password       
      passwd


    2. 後は、amavisd-newをreloadすればおしまいである。

      # /etc/init.d/amavis reload [Enter]



    [余談]

    maiaのDBはデフォルトのままではmysqldumpでバックアップできないので、以下でLOCK TABLESの使用を許可する。

    GRANT LOCK TABLES ON maia.* TO amavis@localhost IDENTIFIED BY 'passwd';


  2. maiadbtool.pl

    maiadbtool.pl は、バージョン1.0.2から提供された多目的のデータベースユーティリティであるが、今回は、Bayes database token の整理に使用した。
    最近、スコアが0のスパムがかなり届くようになった。これは spamassassin でのスキャンがうまくできていないことが原因であると考えいろいろ調査した。その結果、bayes データベースの容量オーバに伴う自動エクスポートが原因とほぼ判明したので、本ユーティリティで定期的にエクスポートするようにした。 spamassassin はデフォルトの設定で運用を続けるとデータベースがどんどん肥大化していくが、bayes_expiry_max_db_size (default: 150000)の75%もしく100,000tokenを超えると、 bayes_auto_expire (default: 1)の設定に従って自動的に古いデータをエクスポートする。このエクスポート動作は、サーバの負荷に関係なく行われるので、スパムで負荷が高くなるような場合にタイムアウトしてしまい、スコアが0になっていると想定された。
    よく調べたら何のことはない。Maia Mailguard の FAQ に対策が記述されていたので、これに従い設定した。
    1. /etc/mail/spamassassin/local.cf に下記を追加し、自動エクスポートメカニズムを無効にする。

      bayes_auto_expire   0


    2. /etc/crontab に 下記を追加し amavis/maiaユーザ(CentOSはamavis)で、1日1回、負荷が少ない時間にエクスポートプロセスを動作させる。

      # expire Bayes tokens daily at 03:15
      15 3 * * * amavis /var/amavisd/maia/scripts/maiadbtool.pl --expire-bayes


      なお、下記設定でも同様の動作になるので、こちらでも良い。

      # expire Bayes tokens daily at 03:15
      15 3 * * * amavis sa-learn --sync --force-expire


    3. 設定が完了したら、amavid-newを再起動しておく。
      なお、expireすると下記のようなメールが来るはずである。

      2007-03-21 16:25:01 Maia: [maiadbtool] Expiring tokens from the SpamAssassin Bayes database
      2007-03-21 16:25:22 Maia: [maiadbtool] expired old bayes database entries in 19 seconds
      2007-03-21 16:25:22 Maia: [maiadbtool] 132663 entries kept, 2230 deleted
      2007-03-21 16:25:22 Maia: [maiadbtool] token frequency: 1-occurrence tokens: 89.52%
      2007-03-21 16:25:22 Maia: [maiadbtool] token frequency: less than 8 occurrences: 8.40%



  3. send-quarantine-reminders.pl

    ユーザがMaia Mailguardのメンテナンスを行わないと隔離エリアにメールが溜まるので、メンテナンスするようにメール通知する機能があるが、機能をユーザが停止していてもシステムとしてメンテナンスを促す場合に設定する。下記は1週間に1回、金曜日に通知する例である。

    37 11 * * 5 amavis /var/amavisd/maia/scripts/send-quarantine-reminders.pl >/dev/null 2>&1


  4. send-quarantine-digests.pl

    ユーザがMaia Mailguardで隔離エリアのメールダイジェストを要求しているかどうかをチェックするスクリプトで、ユーザは分単位で設定できるが負荷がかかるので、システムとしては5分間隔でチェックすれば十分と思われる。

    0-59/5 * * * * amavis /var/amavisd/maia/scripts/send-quarantine-digests.pl >/dev/null 2>&1



    なお、通知するMaia Mailguardのログイン用URLを/etc/maia.conf を編集して変更する必要がある。

    ### send-quarantine-digests.pl

    # Base URL to Maia's PHP scripts
    #$base_url = "http://example.com/";
    $base_url = "http://www.aconus.com/mail/";


    なお、ここで送信されるダイジェストが日本語化されていないとのご指摘があったので対処しました。本機能を使用する場合は下記対処をしてください。(maia-1.0.1のみ。1.0.0は未対応) なお、maia-1.0.2は日本語化パッチで対処済みなのでJcodeのみインストールしてください。

    1. まず、日本語にデコードするため Jcode を使用するので、インストールしてなければ下記でCPANからインストールする。

      # perl -MCPAN -e shell [Enter]
      cpan> install Jcode [Enter]

          (snip)

      cpan> quit [Enter]
      Lockfile removed.

    2. maia-1.0.1を解凍したディレクトリに日本語化パッチをダウンロードしパッチをあて、コピーする。

      # cd /usr/local/maia [Enter]
      # wget http://www.aconus.com/~oyaji/suse9.3/maia-1.0.1-send-quarantine-digests-japanese.patch [Enter]
      # patch -p0 < maia-1.0.1-send-quarantine-digests-japanese.patch [Enter]
      # cp maia-1.0.1/scripts/send-quarantine-digests.pl /var/amavisd/maia/scripts [Enter]
      # cp maia-1.0.1/templates/digest.tpl /var/amavisd/maia/templates [Enter]

    3. /etc/maia.conf を編集し、表のタイトルを日本語化する。
      /etc/maia.conf を編集(緑字:変更)

      # Heading titles for each section of the digest report
      $titles = { 'spam'        => "
      スパム",
                  'virus'       => "
      ウイルス感染メール",
                  'banned_file' => "
      危険な添付ファイル",
                  'bad_header'  => "
      不正ヘッダを持つメール",
                  'ham'         => "
      正規メール"
      };


  5. stats-snapshot.pl (1.0.2ベース)

    このスクリプトは、メール管理の状態をグラフ表示するための各種統計値のテーブルのスナップショットを作製する場合に使用するもので、毎正時に実行させます。

    0 * * * * amavis /var/amavisd/maia/scripts/stats-snapshot.pl >/dev/null 2>&1


    続けて、グラフを書かせるための設定を行います。

    1. グラフ関係のPEARモジュールが入っていない場合(入っていなければ、「PHP及びデータベース関係の設定の確認(configtest.php)」のところで赤くなっているはず)は、インストールする。
      インストールするのは、PEAR::Image_Color、PEAR::Image_Canvas、PEAR::Image_Graph、PEAR::Numbers_Roman、PEAR::Numbers_Words の5つのモジュールをインストールするが、Image_Canvas、Image_Graph、Numbers_Wordsに関しては、エラーがでてインストールできなかった(stableバージョンがないため?)ので、チャネル指定でインストールした。

      # pear install Image_Color [Enter]
      # pear install channel://pear.php.net/Image_Canvas-0.3.0 [Enter]
      # pear install channel://pear.php.net/Image_Graph-0.7.2 [Enter]
      # pear install Numbers_Roman Numbers_Words [Enter]
      # pear install channel://pear.php.net/Numbers_Words-0.15.0 [Enter]


      ここで、再度 http://www.aconus.com/mail/admin/configtest.php にアクセスしてチェックすると、インストールしたPEAR::Image_Graph 0.7.2ではパッチをあてないと駄目と出るので修正した。
      修正するのは、/usr/share/pear/Image/Graph/Plot/Pie.php で、下記の502と616行目を削除すればよい。

      502行目  $this->_clip(true);
      616行目  $this->_clip(false);


    2. このままで設定を変更してグラフを書くと凡例が文字化けしてしまうので、以下で対策をする。
      まず、使用したいフォントをフォントを「/usr/share/pear/Image/Canvas/Fonts/」配下にコピーするかロジカルリンクする。今回は、デフォルトで入っているTrueTypeフォントをコピーした。

      # cp /usr/share/fonts/ja/TrueType/*.ttf /usr/share/pear/Image/Canvas/Fonts/ [Enter]


      次に、コピーしたフォントの中で使用する可能性のあるフォントを「/usr/share/pear/Image/Canvas/Fonts/fontmap.txt」に追記する。書き方は、"適当なフォント名","対応するTrueTypeフォントファイル名"とカンマ区切りで設定する。今回は、とりあえずkochi gothicのみを設定した。

      # vi /usr/share/pear/Image/Canvas/Fonts/fontmap.txt [Enter]

      Kochi Gothic,kochi-gothic-subst.ttf   # "適当なフォント名","対応するTrueTypeフォントファイル名"

      [Esc],[:],[w],[q]で保存。


      後は、 config.php の $chart_font に上記で設定したフォント名(ここでは"Kochi Gothic")を設定すれば良い。

         $chart_font = 'Kochi Gothic';
          //$chart_font = 'coolveti';




■Maia Mailguardへのログイン

メールシステムのユーザが、Maia Mailguard にログインするのに特別な操作は不要です。ユーザは単に Maia Mailguard のトップページにアクセスして自分のメールアカウント(oyaji@mail.aconus.com とドメイン名まで含めて)とそのアカウントのパスワードでログインできます。画面イメージを示します。


◆スーパ管理者の登録

まず最初に、Maia Mailguard の全ての管理ができるスーパ管理者を登録します。そのためには、ブラウザのアドレス欄に下記のように "?super=register" を付加してアクセスすると、通常のログイン画面が表示されるので、スーパ管理者とするユーザアカウントでログインします。認証が成功し正常にログインできれば、そのユーザがスーパ管理者として登録されます。既にスーパ管理者が存在する場合は、通常のログインとなります。なお、そのユーザがスーパ管理者かどうかは、管理画面上部のアイコンに鍵のアイコン(右から3つ目)があるかどうかでわかります。

http://www.aconus.com/mail/login.php?super=register


◆スーパ管理者の削除

スーパ管理者を削除するには、ブラウザのアドレス欄に下記のように "?super=unregister" を付加してアクセスすると、通常のログイン画面が表示されるので、スーパ管理者のユーザアカウントでログインします。認証が成功し正常にログインできれば、スーパ管理者の特権は解除され一般ユーザとしてログインされます。なお、そのユーザのスーパ管理者特権が解除されたかどうかは、管理画面上部のアイコンに鍵のアイコン(右から3つ目)がなくなっていることでわかります。

http://www.aconus.com/mail/login.php?super=unregister




Top Pageへ