#author("2018-06-03T23:30:56+09:00","default:nowsky","nowsky")
*Rspamd [#kfbc9f81]
スパムメールチェック、メール電子署名、外部プログラム連携を実装するメール管理ソフトウェア。
スパムメール・ウイルスメールチェックを実装する場合、従来は複数のソフトウェアを組み合わせる必要があったが、
Rspamdを使用すると設定が簡素化される為、メンテナンス性が向上する。
 
殆どのコンポーネントはSQLiteにデータを書き込むが、NeuralNetworkプラグインなど高速処理が必要な物は、
Redis(RemoteDictionaryServer)にデータを書き込む為、Redisも構築を行う必要がある。
~
*参考サイト [#k13967fe]
-[[Rspamd:+https://rspamd.com/]]
-[[Soukaku's HENA-CHOKO Blog:+https://www.downtown.jp/~soukaku/archives/2017/1118_175322.html]]
-[[Rspamdで迷惑メールを判定:+https://gato.intaa.net/archives/9407]]
~
*構築環境 [#r4abcaa7]
-[[配布サイト:+https://github.com/vstakhov/rspamd/releases/]]
-[[公式ドキュメント:+https://rspamd.com/doc/]]
 
#block
|LEFT:80|LEFT:180|LEFT:180|c
|CENTER:~Parameter|CENTER:~SERVER-A|CENTER:~SERVER-B|h
|&color(#2020ff){OS};|openSUSE Leap 42.3|openSUSE Leap 42.3|
|&color(#2020ff){IP};|10.0.0.1|10.0.0.2|
|&color(#2020ff){USER};|>|rspamd|
|&color(#2020ff){GROUP};|>|rspamd|
|&color(#2020ff){VERSION};|>|v1.7.4|
|&color(#2020ff){PREFIX};|>|/usr/lcoal/rspamd-1.7.4|
#block(next)
未設画像
#block(end)
~
*インストール [#n591e033]
-&size(16){&font(b){1. インストール};};
yum/apt-get/zypper辺りのパッケージ管理でもインストールする事が出来るが、
Rspamd公式がオフィシャルパッケージを推奨している為、今回はソースコードをビルドして利用する。
構築例ではopenSUSEを利用しているがCentOS/Debianでも同手順で構築可能である。
 # zypper install ragel libevent-devel sqlite3-devel file-devel
 # zypper install lua lua-devel lua51-luajit lua51-luajit-devel
 # zypper install pcre-devel pcre2-devel libfann-devel libfann2
 # zypper install jemalloc-devel libjemalloc2 gd-devel
 
 # cd /usr/local/src
 # wget https://github.com/vstakhov/rspamd/archive/1.7.4.tar.gz
 # tar zxvf 1.7.4.tar.gz
 # cd rspamd-1.7.4
 # cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/rspamd \
           -DINSTALL_EXAMPLES=ON                    \
           -DINSTALL_WEBUI=ON                       \
           -DENABLE_JEMALLOC=ON                     \
           -DENABLE_LUAJIT=ON                       \
           -DENABLE_SQLITE=ON                       \
           -DENABLE_REDIRECTOR=ON                   \
           -DENABLE_URL_INCLUDE=ON                  \
           -DENABLE_TORCH=ON                        \
           -DENABLE_FANN=ON                         \
           -DENABLE_PCRE2=ON                        \
           -DENABLE_GD=ON
 # make && make install
 
-&size(16){&font(b){2. 起動準備};};
実行ユーザ、systemdスクリプト、ログローテート設定を準備する。
systemdスクリプトにはLimitNOFILEを埋め込み、ファイルディスクリプタを上書きする。
設定ファイル・インストール先ディレクトリも書き換えている為、
環境に合わせて名前も変更する。
 # vi /usr/lib/systemd/system/rspamd.service
 ---
 [Unit]
 Description=rapid spam filtering system
 After=nss-lookup.target network-online.target
 Documentation=https://rspamd.com/doc/
 
 [Service]
 LimitNOFILE=1048576
 NonBlocking=true
 ExecStart=/usr/local/rspamd/bin/rspamd -c /etc/rspamd/rspamd.conf -f
 ExecReload=/bin/kill -HUP $MAINPID
 User=rspamd
 Group=rspamd
 RuntimeDirectory=rspamd
 RuntimeDirectoryMode=0755
 Restart=always
 
 [Install]
 WantedBy=multi-user.target
 
 # vi /etc/logrotate.d/rspamd
 ---
 /var/log/rspamd/rspamd.log {
     weekly
     compress
     rotate 4
     missingok
     ifempty
     sharedscripts
     create 0644 rspamd rspamd
     postrotate
         systemctl restart rspamd > /dev/null 2>/dev/null || true
     endscript
 }
 
 # groupadd rspamd
 # useradd -g rspamd -s /sbin/nologin rspamd
 # mkdir /var/log/rspamd /var/lib/rspamd
 # chown rspamd.rspamd /var/log/rspamd /var/lib/rspamd
 # cd /usr/local
 # mv rspamd rspamd-1.7.4
 # ln -s /usr/local/rspamd-1.7.4 rspamd
 # ln -s /usr/local/rspamd/etc/rspamd /etc/rspamd
 
-&size(16){&font(b){3. 基礎設定};};
初期設定はコンフィグウィザードを利用するが、細かい設定は直接編集する必要がある。
ただし、Rspamdのコンフィグは階層化されており、
既存設定に追記する物は&color(#2020ff){ "local.d" };ディレクトリに設定し、
設定を上書きする場合は&color(#2020ff){ "override.d" };ディレクトリに保存する必要がある。
また、設定ファイルの拡張子も [.conf][.inc] の二つが存在する。
利用する拡張子は設定ファイル毎に違う為、呼び出し元ファイルを確認する。
 
また、モジュールを無効化する場合は [enabled = false;] のみを記載した設定を作成し、
"local.d" 内に無効化したいモジュール名で保存する。
Redisの接続パスワード、DKIM設定などは環境に合わせて設定する。
 # rspamadm configwizard
 ---
 ・設定の開始
 Do you wish to continue?[Y/n]: y
 
 ・WEB管理画面の設定
 Controller password is not set, do you want to set one?[Y/n]: y
 Enter passphrase: 
 
 ・Redisの設定
 Do you wish to set Redis servers?[Y/n]: y
 Input read only servers separated by `,` [default: localhost]: localhost
 Input write only servers separated by `,` [default: 127.0.0.1]: 127.0.0.1
 Do you have any password set for your Redis?[y/N]: y
 Do you have any specific database for your Redis?[y/N]: y
 
 ・DKIM設定(今回は未使用)
 Do you want to setup dkim signing feature?[y/N]: n
 
 ・トークンタイムアウト
 Expire time for new tokens [100d]: 100d
 
 ・設定の出力
 Reset previous data?[y/N]: y
 
 ・データイニシャライズ
 Do you wish to convert them to Redis?[Y/n]: y
 
 ・設定の保存
 Apply changes?[Y/n]: y
 
-&size(16){&font(b){4. オプション設定};};
ウィザードの設定だけでは細かい制御が出来ない為、ローカル設定を別途作成する。
モジュール概要は [[公式ドキュメント:+https://rspamd.com/doc/modules/]] がパラメータを公開しているのでそちらを参照
下記は特に重要となる項目のみ参考として列挙。

--"local.d/actions.conf"
#region(&color(#ff0000){設定内容};)
[[コチラ:+https://gato.intaa.net/archives/12407]] で解説している迷惑メール判定閾値の変更
 reject     = null;
 add_header = 10;
 greylist   = null;
#endregion

--"local.d/classifier-bayes.conf"
#region(&color(#ff0000){設定内容};)
Rspamd学習データを格納するSQLiteの設定
 backend           = "sqlite3";
 languages_enabled = true;
 min_tokens        = 11;
 min_learns        = 200;
 
 tokenizer {
         name   = "osb";
 }
 cache {
         path   = "${DBDIR}/learn_cache.sqlite";
 }
 statfile {
         symbol = "BAYES_HAM";
         path   = "${DBDIR}/bayes.ham.sqlite";
         spam   = false;
 }
 statfile {
         symbol = "BAYES_SPAM";
         path   = "${DBDIR}/bayes.spam.sqlite";
         spam   = true;
 }
#endregion

--"local.d/history_redis.conf"
#region(&color(#ff0000){設定内容};)
Redisの制御設定。nrowsはデフォルト値から増強する事を推奨。
 servers         = 127.0.0.1:6379;
 key_prefix      = "rs_history";
 nrows           = 10000;
 compress        = true;
 subject_privacy = false;
#endregion

--"local.d/logging.inc"
#region(&color(#ff0000){設定内容};)
Rspamdのログ保存設定。ファイル直書き・syslog出力の二つが出来る。
デバッグログを設定すると、特定もモジュールのみデバッグログ出力する事も出来る。
 type          = "file";
 filename      = "/var/log/rspamd/rspamd.log";
 log_urls      = true;
 log_re_cache  = true;
 debug_modules = [];
#endregion

--"local.d/milter_headers.conf"
#region(&color(#ff0000){設定内容};)
スパム判定のヘッダー処理を定義出来る。
汎用的な値を使うなら、extended_spam_headersを有効化する。
 extended_spam_headers = true;
 local_headers         = ["x-spamd-bar"];
 skip_local            = false;
#endregion

--"local.d/mime_types.conf"
#region(&color(#ff0000){設定内容};)
メール添付ファイル種類毎のスコア設定。
攻撃に使われやすい拡張子を高スコア設定にしたり、強制削除フラグを付与する。
 bad_extensions = {
   ace = 4,
   arj = 4,
   bat = 2,
   cab = 3,
   com = 2,
   exe = 1,
   jar = 2,
   lnk = 4,
   scr = 4,
 };
 bad_archive_extensions = {
   pptx = 0.1,
   docx = 0.1,
   xlsx = 0.1,
   pdf = 0.1,
   jar = 3,
   js  = 0.5,
   vbs = 4,
 };
 archive_extensions = {
   zip = 1,
   arj = 1,
   rar = 1,
   ace = 1,
   7z  = 1,
   cab = 1,
 };
#endregion

--"local.d/options.inc"
#region(&color(#ff0000){設定内容};)
Rspamdの基本動作設定。DNSサーバのロードバランス、RspamdCluster設定もこのファイルで行う。
RspamdにはC言語モジュール・LUAモジュールの二つが存在するが、
C言語モジュールの読込み設定はこのファイルの [filters] で設定する。
ただし、一部のLuaモジュールはC言語モジュールを必須としているので注意。
 filters  = "chartable,dkim,spf,surbl,regexp,fuzzy_check";
 raw_mode = false;
 one_shot = false;
  
 dns {
     # nameserver = "master-slave:127.0.0.1:53:10,8.8.8.8:53:1";
     timeout      = 1s;
     sockets      = 16;
     retransmits  = 5;
 }
  
 classify_headers = [
     "User-Agent",
     "X-Mailer",
     "Content-Type",
     "X-MimeOLE",
 ];
  
 history_rows    = 10000;
 allow_raw_input = true;
 words_decay     = 10000;
 local_addrs     = "127.0.0.1/32";
#endregion

--"local.d/phishing.conf"
#region(&color(#ff0000){設定内容};)
フィッシングメールフィルターの設定。
このモジュールは全メールのURL解析・URLブラックリストとの参照を行う為、
メモリをもの凄く使うので利用時は注意する。
真面に動かす場合は16GB以上の空きメモリが必要なので、
[enabled = false;] のみ記載してモジュールを無効化するか、
メモリを利用する箇所を明示的に無効化する。
下記ではメモリを大量消費するモジュール(openphish_enabled/openphish_premium/phishtank_enabled)を無効化している
 phishing {
     openphish_enabled = false;
     openphish_premium = false;
     phishtank_enabled = false;
 }
#endregion

--"local.d/redis.conf"
#region(&color(#ff0000){設定内容};)
読み書きするRedisの指定。Read/Writeの両方を設定する点に注意
 write_servers = "127.0.0.1";
 read_servers  = "127.0.0.1";
#endregion

--"local.d/worker-controller.inc"
#region(&color(#ff0000){設定内容};)
RspamdのコントローラとWebGUIの設定。[rspamadm pw] コマンドでGUI認証パスワードを生成出来る
"password"はGUI閲覧のみ、"enable"はGUIから設定変更も可能になる。
"secure_ip"に記載したIPからGUIを閲覧すると、認証パスワードが掛からなくなる。
RspamdClusterを構築する際はAPI代わりにHTTP-GETを送っているので、
認証回避する為に"secure_ip"設定が必要となる。
 password        = "$2$...";
 enable_password = "$2$...";
 secure_ip       = "127.0.0.1";
#endregion
 
-&size(16){&font(b){5. WebGUI画面};};
RspamdはWebUIを備えており、メール解析状況の確認・スパムメール学習などを行う事が出来る。
通常はIP:127.0.0.1/TCP:11334で待ち受けているが、設定により変更する事も出来る。
ただし、WebUIは通信暗号化に対応していない為、SSL化を行う場合にはNginxをリバプロ動作させる必要がある。
設定方法は [[オフィシャル:+https://rspamd.com/doc/quickstart.html#setting-the-controller-password]] で公開されているのでそちら参照の事。
例としてSSL通信を強制しつつ、リバプロ動作させる設定を下記記載する
#region(&color(#ff0000){設定内容};)
 location /rspamd/ {
     # Reverse proxy
     proxy_bind         127.0.0.1;
     proxy_pass         http://127.0.0.1:11334/;
     proxy_set_header   Host $host;
     proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
 
     # IP access restrict
     allow  10.0.0.1;
     allow  10.0.0.2;
     deny   all;
 
     # Force SSL/TLS request
     if($server_port != 443){ return 403; }
 }
#endregion
 
-&size(16){&font(b){6. クラスタリング};};
Rspamdはクラスタリング構成を取る事が出来る。
ただ、クラスタリングと言っても一般的なActive/Activeクラスタでは無く、
WebUIを通した管理通信をクラスタ内のサーバへ同時適用したり、
ステータスをクラスタ全体で合算して表示するなど一部機能に限定される。
例として、Master:10.0.0.1/Slave:10.0.0.2でクラスタを構築する設定を記載する

--"local.d/options.inc"
#region(&color(#ff0000){設定内容};)
クラスタ構成するWebUIのURLを設定する。
下記ではhost/pathを設定しているが、hostのみでも構築する事が出来る。
pathの値はオフィシャルではトレイリングスラッシュ(最後の'/')を付けていないが、
付けないとAPI接続エラーになるので、path設定時は付与させる事。
 neighbours {
     server1 {
             host = "https://10.0.0.1:443";
             path = "/rspamd/";
     }
     server2 {
             host = "https://10.0.0.2:443";
             path = "/rspamd/";
     }
 }
#endregion

--"local.d/worker-controller.inc"
#region(&color(#ff0000){設定内容};)
クラスタ用のWeb通信を認証なしで通す為、
クラスタノードからの接続をパスワード認証無しにする。
 secure_ip = "10.0.0.1";
 secure_ip = "10.0.0.2";
#endregion
~
*スパム判定 [#p6f93cc3]
-&size(16){&font(b){A. 迷惑メール学習};};
正確にメール判定を行う為には大量のスパムメールと正規メールの学習が必要になる。
本番環境で行う場合、ユーザ領域を直接処理するとデッドロックする可能性がある為、
ProcMail等で全メールをコピーしておき、別処理として学習させる。
 ・迷惑メール学習(1通)
 # rspamc -c bayes -h 127.0.0.1:11334 learn_spam /${FilePath}/mail.eml
 
 ・迷惑メール学習(複数)
 # rspamc -c bayes -h 127.0.0.1:11334 learn_spam /${FilePath}/
 
 ・正常メール学習1通)
 # rspamc -c bayes -h 127.0.0.1:11334 learn_ham /${FilePath}/mail.eml
 
 ・正常メール学習(複数)
 # rspamc -c bayes -h 127.0.0.1:11334 learn_ham /${FilePath}/