#author("2018-05-10T13:36:13+09:00","default:nowsky","nowsky")
*NGINX [#j8aa9529]
同時処理速度、メモリの軽さが特徴のWebサーバ。
Webサーバ以外にもリバースプロキシとして動かす事も出来る。
ソフトウェア実装としては珍しい、UDPリバースプロキシにも対応している。
#author("2018-07-28T23:13:06+09:00","default:nowsky","nowsky")
*Rspamd [#kfbc9f81]
スパムメールチェック、電子署名付与、外部プログラム連携を実装するメール管理ソフトウェア。
スパムフィルタ・ウイルスチェックを実装する場合、従来は複数のソフトウェアを組み合わせていたが、
Rspamdのみで管理する事が出来るのでメンテナンス性が向上する。
 
殆どのコンポーネントはSQLiteにデータを書き込むが、
ニューラルネットワーク、メール構文解析など高度・高速処理が必要な物は、
Redis(RemoteDictionaryServer)にデータを書き込む為、[[Redisも構築:https://www.ns-lab.org/wiki/?Linux/Mail/Redis]]する必要がある。
~
*参考サイト [#xa3eb017]
-[[nginx news:+http://nginx.org/]]
-[[Nginxをソースコードからインストール:+https://qiita.com/HayneRyo/items/eccc36302623088ad7f3]]
-[[Serving CGI Scripts With Nginx On OpenSUSE:+https://www.howtoforge.com/serving-cgi-scripts-with-nginx-on-opensuse-11.4-p2]]
*参考サイト [#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]]
~
*インストール [#b4387b1b]
*構築環境 [#r4abcaa7]
-[[配布サイト:+https://github.com/vstakhov/rspamd/releases/]]
-[[公式ドキュメント:+https://rspamd.com/doc/]]
 
#block
|LEFT:80|LEFT:180|LEFT:180|c
|CENTER:~IP/FQDN|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){FQDN};|mx1.test.org|mx2.test.org|
|&color(#2020ff){SQLite};|localhost|localhost|
|&color(#2020ff){Redis};|127.0.0.1|127.0.0.1|
|&color(#2020ff){MAIL};|>|test-mail☆mail.test.org|
※ MAILの星マークは「@」に置換して下さい
 
|LEFT:80|LEFT:180|LEFT:180|c
|CENTER:~Parameter|CENTER:~SERVER-A|CENTER:~SERVER-B|h
|&color(#2020ff){USER};|>|rspamd|
|&color(#2020ff){GROUP};|>|rspamd|
|&color(#2020ff){VERSION};|>|v1.7.4|
|&color(#2020ff){PREFIX};|>|/usr/local/rspamd|
|&color(#2020ff){DB};|>|/var/lib/rspamd|
※ PREFIXは後でバージョン番号にリネームして下さい
#block(next)
#ref(Linux/Mail/Rspamd/wiki_rspamd_01.png,35%,left,nowrap)
#block(end)
~
*インストール [#n591e033]
-&size(16){&font(b){1. インストール};};
nginxの全機能を利用するにはプログラムをソースコードからビルドする必要がある。
特に、リバースプロキシなど最新の実装機能を利用する場合には必須となる。
今回は機能を全部有効化してビルドするので、長くなるconfigure指定を別ファイル化しておき、
configureする時にコマンド置換(バッククォート)で読み込む。
 # vi configure.option
 ---
  --prefix=/usr/local/nginx-1.13.9
  --with-select_module
  --with-poll_module
  --with-threads
  --with-file-aio
  --with-http_ssl_module
  --with-http_v2_module
  --with-http_realip_module
  --with-http_addition_module
  --with-http_xslt_module
  --with-http_geoip_module
  --with-http_gunzip_module
  --with-http_gzip_static_module
  --with-http_auth_request_module
  --with-http_secure_link_module
  --with-http_degradation_module
  --with-http_slice_module
  --with-http_stub_status_module
  --with-mail
  --with-mail_ssl_module
  --with-stream
  --with-stream_ssl_module
  --with-stream_realip_module
  --with-stream_geoip_module
  --with-stream_ssl_preread_module
  --with-cpp_test_module
  --with-compat
  --with-pcre
  --with-pcre-jit
  --with-libatomic
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
 
 # wget http://nginx.org/download/nginx-1.13.9.tar.gz
 # tar zxvf nginx-1.13.9.tar.gz
 # cd nginx-1.13.9
 # ./configure `cat ../configure.option | tr '\r\n' ''`
 # 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スクリプトにPIDファイルを埋め込んでいる為、
後で作成するコンフィグのPID指定もsystemdに記載した物と合わせる。
 # vi /usr/lib/systemd/system/nginx.service
実行ユーザ、systemdスクリプト、ログローテートを設定しておく。
Rspamdはファイル入出力を多量に使う為、
systemdスクリプトには "LimitNOFILE" を埋め込み、ファイルディスクリプタを上書きする。
また、設定ファイル・インストール先を変更しているので、環境に合わせて設定も変更する。
 
インストール先については、プレフィックス・パスでインストールした後、
バージョン番号付にリネームする事で、パッケージ管理をしやすくする。
 # vi /usr/lib/systemd/system/rspamd.service
 ---
 [Unit]
 Description=NGINX - Web server and Reverse proxy
 Documentation=http://nginx.org/en/docs/
 After=local-fs.target remote-fs.target network.target nss-lookup.target
 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
 
 [Service]
 Type=forking
 NotifyAccess=all
 PIDFile=/var/run/nginx.pid
 ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /etc/nginx/nginx.conf
 ExecStart=/usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf
 ExecReload=/bin/kill -s HUP $MAINPID
 ExecStop=/bin/kill -s QUIT $MAINPID
 
 ## Security Setting
 DevicePolicy=closed
 PrivateDevices=true
 PrivateTmp=true
 ProtectSystem=full
 ProtectHome=true
 
 # vi /etc/logrotate.d/nginx
 # vi /etc/logrotate.d/rspamd
 ---
 /var/log/nginx/*.log {
 /var/log/rspamd/rspamd.log {
     weekly
     compress
     rotate 4
     missingok
     ifempty
     sharedscripts
     create 0644 rspamd rspamd
     postrotate
         systemctl restart nginx > /dev/null 2>/dev/null || true
         systemctl restart rspamd > /dev/null 2>/dev/null || true
     endscript
 }
 
 # ln -s /usr/local/nginx-1.13.9 /usr/local/nginx
 # ln -s /usr/local/nginx/conf /etc/nginx
 # rm /etc/nginx/koi-utf /etc/nginx/koi-win /etc/nginx/win-utf
 # mkdir /var/log/nginx
 # groupadd nginx
 # useradd -g nginx -s /sbin/nologin -d /var/nginx nginx
 # systemctl unmask nginx
 # systemctl enable nginx
 # 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. 基礎設定};};
nginxは利用する機能に応じてコンフィグの内容が大きく変化する。
下記では、nginxの実行ユーザなど基本的な部分のみ記載する。
 # vi /etc/nginx/nginx.conf
初期設定にはコンフィグウィザードを利用出来るが、細かい設定は直接編集する必要がある。
Rspamdのコンフィグは優先度順に階層化されており、棲み分けは下記の通りとなる。
-- 既存設定に追記修正する物は&color(#2020ff){ "local.d" };ディレクトリ内に設定
-- 設定を強制上書きする場合は&color(#2020ff){ "override.d" };ディレクトリに保存
-- デフォ設定を直編集する時は&color(#2020ff){ "modules.d" };ディレクトリを編集

>ただし、基本的には&color(#2020ff){ "local.d" };にて設定を上書修正しておき、
モジュールを無効化する場合のみ&color(#2020ff){ "override.d" };内に&color(#ff0000){ "enabled=false" };を1行記載する。
 
設定ファイルの拡張子は ".conf/.inc" の二つが存在する。
対応する拡張子は設定ファイル毎に違う為、呼び出し元となる&color(#2020ff){ "modules.d" };を都度確認する。
 # rspamadm configwizard
 ---
 user       nginx;
 pid        /var/run/nginx.pid;
 error_log  /var/log/nginx/error.log;
 ・コンフィグウィザードの開始
 Do you wish to continue?[Y/n]: y
 
 worker_processes       auto;
 worker_rlimit_nofile   4096;
 ・WEB管理画面の設定
 Controller password is not set, do you want to set one?[Y/n]: y
 Enter passphrase: 
 
 events {
     worker_connections 1024;
     accept_mutex_delay 50ms;
     multi_accept       on;
     use                epoll;
 }
~
*コンフィグ [#x116780f]
nginxは通常のWebサーバ動作や、リバースプロキシ動作など様々な用途に利用出来る。
用途に応じて必要な設定とディレクティブ指定が変わる為、使う機能に応じて内容を変更する。
同じサーバで違う処理を実装する場合、 "include" を使って設定を外出しすると整理しやすくなる。
 ・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
 
 ・Redisのイニシャライズ
 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]]でも解説している、Rspamd v1.7系の迷惑メール判定閾値設定
閾値のパラメータは小数点も設定可能で、設定した値が迷惑メールスコアに表示される
 reject     = null;
 add_header = 10;
 greylist   = null;
#endregion

----
--local.d/classifier-bayes.conf
#region(&color(#ff0000){設定内容};)
Rspamdのスパムメール学習データを格納するSQLite設定
SPAMのtrue/falseを切り替える事で、スパムメール・非スパムメール学習データの切り替えを行う
 backend           = "sqlite3";
 languages_enabled = true;
 min_tokens        = 11;
 min_learns        = 200;
  
 tokenizer {
     name   = "osb";
 }
 cache {
     path   = "/var/lib/rspamd/learn_cache.sqlite";
 }
 statfile {
     symbol = "BAYES_HAM";
     path   = "/var/lib/rspamd/bayes.ham.sqlite";
     spam   = false;
 }
 statfile {
     symbol = "BAYES_SPAM";
     path   = "/var/lib/rspamd/bayes.spam.sqlite";
     spam   = true;
 }
#endregion

-&size(16){&font(b){UDPリバースプロキシ};};
UDPリバースプロキシのコンフィグは、nginxのTCPリバースプロキシ設定とほぼ同じになる。
ただし、nginxのフロントエンドとなるlistenの箇所にudpを指定する点に注意する。
--local.d/dkim_signing.conf
#region(&color(#ff0000){設定内容};)
DKIM署名を付与する場合は "dkim_signingモジュール" を利用し、
DKIM検証を行う場合は "dkimモジュール" を利用する。
 
下記はフロントエンドを「10.0.0.1」で待ち受け、
バックエンドの2IPアドレス「192.168.0.1」「192.168.0.2」へUDP53で振り分ける設定となる。
 stream {
     access_log /var/log/nginx/access.log basic;
     error_log  /var/log/nginx/error.log  info;
 
     upstream DNS {
         hash   $remote_addr;
         server 192.168.0.1:53;
         server 192.168.0.2:53;
DKIMはheader情報を元に制御するので、use_domainの設定をheader値で上書きする
サブドメインメール環境でeSLDを有効化すると、
署名対象がサブドメインのFQDNから、ドメインに変わってしまうので無効化を推奨
証明書の作り方などは[[OpenDKIM構築手順:+https://www.ns-lab.org/wiki/?cmd=read&page=Linux%2FMail%2FOpenDKIM]]のメモを見る
 allow_envfrom_empty      = true;
 allow_hdrfrom_mismatch   = true;
 allow_hdrfrom_multiple   = false;
 allow_username_mismatch  = true;
  
 use_esld                 = false;
 use_redis                = false;
 use_domain               = "header";
 use_domain_sign_networks = "header";
 use_domain_sign_local    = "header";
  
 domain {
     mail.hoge.org {
         path     = "/etc/rspamd/dkim/mail.hoge.org";
         selector = "20180401";
     }
 
     server {
         listen          10.0.0.1 udp;
         proxy_pass      DNS;
         proxy_timeout   1s;
         proxy_responses 1;
     }
 }
 
#endregion

----
--local.d/history_redis.conf
#region(&color(#ff0000){設定内容};)
Redisに書き込むデータ行数などの設定。nrowsは10000以上に変更する事を推奨
compressを有効化しないと、データが肥大化するので有効化しておく
 servers         = 127.0.0.1:6379;
 key_prefix      = "rs_history";
 nrows           = 10000;
 compress        = true;
 subject_privacy = false;
#endregion

-&size(16){&font(b){HTTP Webサーバ};};
Apacheと違う所として「.htaccess」ファイルが動かない事と、
PHPを動かす時にはPHP-FPMを起動させて代理処理する点に注意する
 
下記はDocumentRootを "/var/nginx/html" とした上で、
nginxをWebサーバとして稼働させる設定例となる。
 http {
     default_type    application/octet-stream;
     include         /etc/nginx/mime.types;
     access_log      /var/log/nginx/access.log combined;
 
     # Server Setting
     sendfile            on;
     tcp_nopush          on;
     autoindex           off;
     etag                off;
     server_tokens       off;
     keepalive_timeout   5;
 
     # Contents Compress
     gzip                on;
     gzip_http_version   1.0;
     gzip_disable        msie6;
     gzip_min_length     1024;
     gzip_types          text/plain
                         text/xml
                         text/css
                         application/xml
                         application/xhtml+xml
                         application/rss+xml
                         application/atom_xml
                         application/javascript
                         application/x-javascript
                         application/x-httpd-php;
 
     # HTTP Server
     server {
         listen      0.0.0.0:80 default_server;
         server_name _;
 
         location / {
             root    /var/nginx/html;
             index   index.html index.htm;
--local.d/logging.inc
#region(&color(#ff0000){設定内容};)
Rspamdのログ保存設定。ファイル直書き・syslog出力の2種類がある
デバッグモジュールを設定すると、特定もモジュールのみデバッグログ出力する事も出来る
例えば、DKIMモジュールのデバッグを行う場合は、"debug_modules = ["dkim_signing"];"と設定する
 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を有効化する
Rspamdで処理したメールに独自ヘッダーを付与するには、add-headersを指定する
ドキュメントは情報が古い為、最新の設定内容を使う場合はソースを直接見る
 use                   = ["add-headers", "x-virus"];
 extended_spam_headers = true;
  
 routines {
     add-headers {
         headers {
             X-Rspamd-Scanned = "X-Original-Header";
         }
 
         add_header  X-Frame-Options        SAMEORIGIN;
         add_header  X-XSS-Protection       "1; mode=block";
         add_header  X-Content-Type-Options nosniff;
         remove  = 1;
     }
     x-virus {
         header  = "X-Virus";
         symbols = ["CLAM_VIRUS", "FPROT_VIRUS"];
         remove  = 1;
     }
 }
 
#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

-&size(16){&font(b){CGI実行環境};};
nginxの処理体系はイベント型の為、CGIを実行するには別途プログラムを噛ませる必要がある。
今回はCGI実行環境としてFastCGIを利用する。
--local.d/options.inc
#region(&color(#ff0000){設定内容};)
Rspamdの基本動作設定。参照先DNSサーバのロードバランス、RspamdCluster設定もこのファイルで行う
RspamdにはC言語モジュール・LUAモジュールの二つが存在するが、
C言語モジュールの読込み設定はこのファイルの&color(#2020ff){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以上の空きメモリが必要なので、自鯖用途ならモジュールを無効化するか、
メモリを利用する箇所を明示的に無効化しておく
下記ではメモリを大量消費する全モジュールを無効化している
 phishing {
     openphish_enabled = false;
     openphish_premium = false;
     phishtank_enabled = false;
 }
#endregion

--local.d/redis.conf
#region(&color(#ff0000){設定内容};)
参照先のRedis指定。対象サーバのIPアドレスを設定
Read/Writeの両方を設定出来る為、Redisをクラスタ構成にしている場合に負荷分散も出来る
 write_servers = "127.0.0.1";
 read_servers  = "127.0.0.1";
#endregion

--local.d/worker-controller.inc
#region(&color(#ff0000){設定内容};)
RspamdコントローラとWebGUIログイン情報の設定。 &color(#2020ff){[$ 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
 
下記はopenSUSE上でのCGI実行環境の構築例となる。
 # zypper install spawn-fcgi FastCGI FastCGI-devel
 # ln -s /usr/include/fastcgi/fastcgi.h     /usr/local/include/
 # ln -s /usr/include/fastcgi/fcgi_config.h /usr/local/include/
 # ln -s /usr/include/fastcgi/fcgi_stdio.h  /usr/local/include/
 # ln -s /usr/include/fastcgi/fcgiapp.h     /usr/local/include/
 # ln -s /usr/include/fastcgi/fcgimisc.h    /usr/local/include/
 # ln -s /usr/include/fastcgi/fcgio.h       /usr/local/include/
 # ln -s /usr/include/fastcgi/fcgios.h      /usr/local/include/
 
 # cd /usr/local/src
 # git clone https://github.com/gnosek/fcgiwrap `date "+%Y%m%d"`
 # ln -s `date "+%Y%m%d"` fcgiwrap
 # cd fcgiwrap
 # autoreconf -i
 # ./configure
 # make
 # make install
 
 # vi /etc/init.d/spawn-fcgi
 # chmod 755 /etc/init.d/spawn-fcgi
 # chown root.root /etc/init.d/spawn-fcgi
 # chkconfig --add spawn-fcgi
 # systemctl enable spawn-fcgi
 # systemctl start spawn-fcgi
#region(/etc/init.d/spawn-fcgi)
 #!/bin/sh
 #
 # spawn-fcgi        FastCGI rapper daemon
 #
 # chkconfig:        35 95 10
 # description:      FastCGI and SpawnFCGI rapper daemon
 #
 ### BEGIN INIT INFO
 # Provides:         spawn-fcgi
 # Description:      Start the spawn-fcgi
 # Required-Start:   $local_fs $remote_fs $network
 # Required-Stop:    $local_fs $remote_fs $network
 # Default-Start:    3 5
 # Default-Stop:     0 1 6
 ### END INIT INFO
 
 . /etc/rc.status
 rc_reset
 
 BIN="/usr/local/sbin/fcgiwrap"
 PID="/var/run/spawn-fcgi.pid"
 SOCK="/var/run/spawn-fcgi.socket"
 OPT="-M 0660"
 
 NAME=spawn-fcgi
 USER=nginx
 GROUP=nginx
 
 case "$1" in
   start)
     echo -n "Starting ${NAME}"
     /usr/bin/spawn-fcgi -u ${USER} -g ${GROUP} -s ${SOCK} -S ${OPT} -F 1 -P ${PID} -- ${BIN}
     rc_status -v
   ;;
 
   stop)
     echo -n "Shutdown ${NAME}"
     checkproc -p ${PID} ${BIN} || echo -n "- Warning: ${NAME} not running!"
     killproc -p ${PID} -TERM ${BIN}
     if [ -S ${SOCK} ]; then
       rm -f ${SOCK}
     fi
     rc_status -v
   ;;
 
   restart)
     $0 stop && sleep 3 && $0 start
     rc_status
   ;;
 
   *)
     echo "Usage: spawn-fcgi {start|stop|restart}"
     exit 1
   ;;
 esac
 
 rc_exit
-&size(16){&font(b){5. WebGUI画面};};
RspamdはWebUIを備えており、WebUIからメール解析状況の確認・スパムメール学習などを行う事が出来る。
通常は、IP:127.0.0.1/TCP:11334で待ち受けているが変更する事も出来る。
ただし、WebUIは通信暗号化に対応していない為、SSL化を行う場合にはNginxをリバプロ動作させる必要がある。
設定方法は[[オフィシャル:+https://rspamd.com/doc/quickstart.html#setting-the-controller-password]]で公開されているのでそちらを参照。
例としてSSL通信を強制しつつ、リバプロ動作させるNginx設定を下記記載する

--nginx.conf
#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
 
 # vi /etc/nginx/nginx.conf
 ---
 http {
     server {
         location ~ [^/]\.(cgi|pl)($|\?|\/) {
            root            /var/nginx/html;
            fastcgi_pass    unix:/var/run/spawn-fcgi.socket;
            fastcgi_index   index.cgi,index.pl;
            include         /etc/nginx/fastcgi_params;
            fastcgi_param   PATH_INFO $fastcgi_path_info;
            fastcgi_param   PATH_TRANSLATED $document_root$fastcgi_path_info;
            fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
         }
-&size(16){&font(b){6. クラスタリング};};
Rspamdはクラスタリング構成を取る事が出来る。
ただ、クラスタリングと言っても一般的なActive/Activeクラスタでは無く、
WebUIを通した管理通信をクラスタ内のサーバへ同時適用する事や、
ステータスをクラスタ全体で合算して表示するなど管理統合に限定される。
例として &color(#2020ff){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 {
     server_a {
         host = "https://10.0.0.1:443";
         path = "/rspamd/";
     }
     server_b {
         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}/
 
-&size(16){&font(b){B. 迷惑メールヘッダー};};
milter_headerの設定により迷惑メールヘッダーのスコアを変更出来る。
大まかに、詳細パラメータで制御を行う物とシンボル制御の2種類がある。
詳細は[[公式ドキュメント:+https://rspamd.com/doc/modules/milter_headers.html]]のmilter_header項目を参照。
--[x-spamd-bar]
#region(&color(#ff0000){ヘッダー情報};)
 通常のメール <X-Spamd-Bar: ->
 スパムメール <X-Spamd-Bar: +>
#endregion

----
--[x-spamd-result]
#region(&color(#ff0000){ヘッダー情報};)
 通常のメール <X-Spamd-Result: default: False>
 スパムメール <X-Spamd-Result: default: True>
#endregion

-&size(16){&font(b){PHP実行環境};};
CGIと同様に、nginx上でPHPを実行する場合も別プログラムに投げる必要がある。
PHPを実行する手段は多種存在するが、今回はphp-fpmを利用手法をメモしておく。
 # zypper install php7 php7-devel php7-fpm
 # cp /etc/php7/fpm/php-fpm.conf.default /etc/php7/fpm/php-fpm.conf
 # cp /etc/php7/fpm/php-fpm.d/www.conf.default /etc/php7/fpm/php-fpm.d/www.conf
 # vi /etc/php7/fpm/php-fpm.d/www.conf
 ---
 [www]
 user  = nginx
 group = nginx
 listen = /var/run/php-fpm.socket
 listen.owner = nginx
 listen.group = nginx
 listen.mode  = 0660
 listen.allowed_clients = 127.0.0.1
 
 # /etc/init.d/php-fpm start
 # vi /etc/nginx/nginx.conf
 ---
 http {
     server {
         location ~ \.(php)$ {
             root            /var/nginx/html;
             fastcgi_pass    unix:/var/run/php-fpm.socket;
             fastcgi_index   index.php;
             include         /etc/nginx/fastcgi_params;
             fastcgi_param   PATH_INFO $fastcgi_path_info;
             fastcgi_param   PATH_TRANSLATED $document_root$fastcgi_path_info;
             fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
         }
     }
 }
--[x-spam-status]
#region(&color(#ff0000){ヘッダー情報};)
 通常のメール <X-Spam-Status: No, score=X.XX>
 スパムメール <X-Spam-Status: Yes, score=X.XX>
#endregion