amavis Postfix Server

【docker-compose】amavisでメールのウイルス検知およびスパム検知、遮断

2023年9月27日



目的

amavisを導入して、ウイルス検知、スパム検知、フィルタ機能を一元管理することを目的とする。
amavisの構築は以下2パターンあるが、本書では前者について記載し、文末で後者との差分を記載する。

  1. amavisコンテナを独立して構築し、postfixコンテナと連携する
  2. docker-mailserverの中にバンドルされたamavisを使用して、コンテナの中でpostfixと連携する

9/20時点でウイルス検知、スパム検知できていない

環境:

  • OS : Ubuntu
  • docker-compose環境を構築済
  • docker-mailserverを構築済

参考:

amavisのdocker-compose.yml作成

各ポート番号は以下のとおり

  • 783:spamassassin
  • 3310:clamav
  • 10024:amavis(対Postfix受信、送信用)
version: '2'
services:
    mariadb:
        image: mariadb
        restart: always
        volumes:
            - /mariadb/data:/var/lib/mysql
        environment:
                MYSQL_ROOT_PASSWORD: murci

    amavis:
        image: aknaebel/amavis
        links:
            - mariadb
        ports:
            - "783:783"
            - "3310:3310"
            - "10024:10024"
        volumes:
            - ./amavis:/var/lib/amavis
            - ./clamav:/var/lib/clamav
            - ./spamassassin:/var/lib/spamassassin
            - ./amavis/conf.d:/etc/amavis/conf.d
            - ./clamav/conf:/etc/clamav
            - ./spamassassin/conf:/etc/spamassassin 
        environment:
                VIMBADMIN_PASSWORD: murci
                DBHOST: mariadb
                HOSTNAME: think01.murci.local
        container_name: amavis
        restart: always
        dns:
            - 8.8.8.8

postfixのdocker-compose.yml編集

amavisで検査したメールの受信口であるポート10025を開放する

ports:
      - "25:25"
      - "143:143"
      - "465:465"
      - "587:587"
      - "9993:993"
      - "10025:10025"

amavisの設定

/etc/amavis/conf.d/50-custom

@local_domains_acl = qw(.);
$notify_method  = 'smtp:[192.168.9.10]:10025';
#$inet_socket_bind = '0.0.0.0'];
$inet_socket_bind = undef;
@inet_acl = qw( 127.0.0.1 [::1] 172.18.0.0/16 192.168.0.0/16 );
$forward_method = 'smtp:[127.0.0.1]:10024';
・・・1
$requeue_method = 'smtp:[192.168.9.7]:10025';
・・・2
$localhost_name = 'think01.murci.local';

1. postfixから転送されたメールを検査して、postfixへ返送するためのamavis側のIPポート。IPはコンテナ名でも可。
2. postfixへ返送するためのpostfix側のIPポート。IPはコンテナ名でも可。

/etc/amavis/conf.d/50-user

amavis起動時にエラー出るので以下コメントアウト

# We need to provide list of domains for which filtering need to be done
#@lookup_sql_dsn = (
#    ['DBI:mysql:database=vimbadmin;host=mariadb;port=3306',
#     'vimbadmin',
#     'murci']);

/etc/amavis/conf.d/15-content_filter_mode

以下コメント解除して、検査を有効にする

$ grep bypass 15-content_filter_mode
@bypass_virus_checks_maps = (
   \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
@bypass_spam_checks_maps = (
   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

spamassassinの設定

/etc/spamassassin/local.cf

件名にスパム識別文字を追加する

required_scoreでスパムレベルを設定する(1.0〜10.0、デフォルト5)。値が小さいほど厳格になり検知のハードルが低い

$ cat local.cf
report_safe 0 
report_header 1
rewrite_header Subject [SPAM!!!] 
required_score 1.0

postfixの設定

/etc/postfix/main.cf

フィルタ名とメールの転送先であるamavisのIP
ポートを指定する

$ grep content_filter ~/src/config/docker/docker-mailserver/config/main.cf
content_filter = smtp-amavis:[192.168.9.10]:10024

/etc/postfix/master.cf

postfix起動時に自動で以下追記される?

#
# Amavis configuration
#

smtp-amavis     unix    -       -       n       -       2       smtp
  -o syslog_name=postfix/$service_name
  -o smtp_data_done_timeout=1200
  -o smtp_send_xforward_command=yes
  -o disable_dns_lookups=yes
  -o max_use=20
  -o smtp_tls_security_level=none
  -o smtp_tls_wrappermode=no

127.0.0.1:10025 inet    n       -       n       -       -       smtpd
・・・1
  -o syslog_name=postfix/smtpd-amavis
  -o content_filter=smtp-amavis:[192.168.9.10]:10024
  -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 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_header_body_checks,no_unknown_recipient_checks,no_milters
  -o smtp_tls_security_level=none

1. amavisで検査されたメールの転送を受けるpostfix側のIPポート

コンテナを起動する

$ docker-compose up -d

clamavの定義ファイル更新

インターネットからウイルス検知用の定義ファイルをダウンロードする

amavisコンテナに入り、以下を実行する

# /etc/init.d/clamav-freshclam start
Starting ClamAV virus database updater: freshclam.

# freshclam
Wed Sep 20 15:33:25 2023 -> ClamAV update process started at Wed Sep 20 15:33:25 2023

ウイルス、スパム検知テスト

9/20時点で、EICARウイルスチェックおよびスパムメール検知は失敗。postixからamavisへのメール転送には成功しているが、amavisからpostixへの返送時にタイムアウトとなる

murci.localドメインからmurci.internalへメール送付時ログ

Eicar
「eicar.com」ファイルとして保存することでウィルスと認識させることが出来ます。
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

GTUBE
メール本文に貼り付けることでスパムメールとして認識させることが出来ます。
XJSC4JDBQADN1.NSBN32IDNENGTUBE-STANDARD-ANTI-UBE-TEST-EMAILC.34X

docker-mailserverの中にバンドルされたamavisを使用して、コンテナの中でpostfixと連携する場合の差分

amavisの設定

/etc/amavis/conf.d/50-custom

同じコンテナ内でamavisが起動しているため、$requeue_methodを127.0.0.1に変更


# cat 50-custom
@local_domains_acl = qw(.);
$notify_method  = 'smtp:[127.0.0.1]:10025';
#$inet_socket_bind = '0.0.0.0'];
$inet_socket_bind = undef;
@inet_acl = qw( 127.0.0.1 [::1] 172.18.0.0/16 192.168.0.0/16 );
$forward_method = 'smtp:[127.0.0.1]:10024';
$requeue_method = 'smtp:[127.0.0.1]:10025';
$localhost_name = 'host01.murci.internal';

postfixの設定

/etc/postfix/main.cf

同じコンテナ内でamavisが起動しているため、127.0.0.1に変更


$ grep content_filter ~/src/config/docker/docker-mailserver/config/main.cf
content_filter = smtp-amavis:[127.0.0.1]:10024

CATEGORIES & TAGS

amavis, Postfix, Server,

Author:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

カテゴリー

むるし

フリーランスのインフラ系エンジニア。
備忘録で色々書いていきます。
お問い合わせは↓
mo-gyu@murci.net
LPIC303 Security
%d人のブロガーが「いいね」をつけました。