havp を我が家の Web アクセスの経路に組み込んでみた

ということで、前エントリーからの続き。

我が家のネットワーク環境については、さらにちょっと前のエントリーで既出なわけですが

我が家のネットワーク構成概要 2017/12/16版

概略としては上の図の通りで、 Web アクセスの流れだけを抜き出してみたのが、下の図。

Webアクセス時の経路

まぁ、まんまこの図の通り、家中の PC やスマホからの Web アクセスを内部サーバ上で動いている Squid に集約して、更にそれを VyOS で有効にした webproxy (これも Squid なわけだが)を上位プロキシにしている、というわけ。
で、内部サーバで動いてる Squid 周りの設定を変更して、インストール済みの havp を更に挟み込む、というのが今回の内容。

HAVP (HTTP Anti Virus Proxy) を利用してWebアクセスにもアンチウィルス

多分、自分が見落としていただけなのだと思うのだけど、 Web アクセス時のアンチウィルスを実現するためのものとして、 HAVP というのがあるのに気がついた。

Short Description

HAVP (HTTP Antivirus Proxy) is a HTTP proxy with an antivirus scanner. It supports the free ClamAV , but also commercial solutions e.g. Kaspersky, Sophos and F-Prot.

[From HAVP – HTTP Anti Virus Proxy – The Free HTTP Anti Virus Proxy]

プロキシとして機能して、ウィルスチェックについては ClamAV などを呼び出して実行するというもの、だそうで。

「子供たちにネット使わせるには、Web アクセスのタイミングでもウィルスチェックしたほうがいいんだろうなぁ…。」と漠然と考えていたんですが、どう実現させるかというとこまでは至っていなかったので、コレは渡りに船とばかりに試してみた次第。

インストールは、コマンド一発!

インストールはそんなに難しいものではなくて、 Debian の場合( jessie 以降)であればコマンドラインから "aptitude install havp" 一発で関連パッケージまで含めてインストール完了。

root@vhost01:~# aptitude install havp
以下の新規パッケージがインストールされます:
clamav{a} clamav-base{a} clamav-freshclam{a} havp libclamav7{a}
更新: 0 個、新規インストール: 5 個、削除: 0 個、保留: 0 個。
アーカイブの 2,100 kB を取得する必要があります。展開後に 4,666 kB のディスク領域が新たに消費されます。
先に進みますか? [Y/n/?]
取得: 1 http://debian-mirror.sakura.ne.jp/debian sid/main amd64 libclamav7 amd64 0.99.3~beta1+dfsg-4 [936 kB]
取得: 2 http://debian-mirror.sakura.ne.jp/debian stable/main amd64 havp amd64 0.92a-4+b2 [135 kB]
取得: 3 http://debian-mirror.sakura.ne.jp/debian sid/main amd64 clamav-base all 0.99.3~beta1+dfsg-4 [303 kB]
取得: 4 http://debian-mirror.sakura.ne.jp/debian sid/main amd64 clamav-freshclam amd64 0.99.3~beta1+dfsg-4 [362 kB]
取得: 5 http://debian-mirror.sakura.ne.jp/debian sid/main amd64 clamav amd64 0.99.3~beta1+dfsg-4 [364 kB]
2,100 kB を 0秒 秒で取得しました (3,778 kB/s)
パッケージを事前設定しています ...
以前に未選択のパッケージ libclamav7:amd64 を選択しています。
(データベースを読み込んでいます ... 現在 381379 個のファイルとディレクトリがインストールされています。)
.../libclamav7_0.99.3~beta1+dfsg-4_amd64.deb を展開する準備をしています ...
libclamav7:amd64 (0.99.3~beta1+dfsg-4) を展開しています...
.../havp_0.92a-4+b2_amd64.deb を展開する準備をしています ...
havp (0.92a-4+b2) を展開しています...
以前に未選択のパッケージ clamav-base を選択しています。
.../clamav-base_0.99.3~beta1+dfsg-4_all.deb を展開する準備をしています ...
clamav-base (0.99.3~beta1+dfsg-4) を展開しています...
以前に未選択のパッケージ clamav-freshclam を選択しています。
.../clamav-freshclam_0.99.3~beta1+dfsg-4_amd64.deb を展開する準備をしています ...
clamav-freshclam (0.99.3~beta1+dfsg-4) を展開しています...
以前に未選択のパッケージ clamav を選択しています。
.../clamav_0.99.3~beta1+dfsg-4_amd64.deb を展開する準備をしています ...
clamav (0.99.3~beta1+dfsg-4) を展開しています...
clamav-base (0.99.3~beta1+dfsg-4) を設定しています ...
libclamav7:amd64 (0.99.3~beta1+dfsg-4) を設定しています ...
libc-bin (2.25-6) のトリガを処理しています ...
havp (0.92a-4+b2) を設定しています ...
グループ `havp' (グループ ID 138) を追加しています...
完了。
There is already /var/lib/havp/havp.loop, maybe from an earlier or custom installation, not building loopback-device
Job for havp.service failed because the control process exited with error code.
See "systemctl status havp.service" and "journalctl -xe" for details.
invoke-rc.d: initscript havp, action "start" failed.
● havp.service - LSB: HAVP virus-scanning HTTP proxy
Loaded: loaded (/etc/init.d/havp; generated; vendor preset: enabled)
Active: failed (Result: exit-code) since Wed 2018-01-03 15:49:19 JST; 14ms ago
Docs: man:systemd-sysv-generator(8)
Process: 26029 ExecStart=/etc/init.d/havp start (code=exited, status=1/FAILURE)

1月 03 15:49:19 vhost01 systemd[1]: Starting LSB: HAVP virus-scanning HTTP proxy...
1月 03 15:49:19 vhost01 havp[26029]: Cleaning up /var/spool/havp... done
1月 03 15:49:19 vhost01 havp[26029]: Starting havp: Starting HAVP Version: 0.92
1月 03 15:49:19 vhost01 havp[26029]: LibClamAV Error: cli_loaddbdir(): No supported database files found in /var/lib/clamav
1月 03 15:49:19 vhost01 havp[26029]: One or more scanners failed to initialize!
1月 03 15:49:19 vhost01 havp[26029]: Check errorlog for errors.
1月 03 15:49:19 vhost01 havp[26029]: Exiting..
1月 03 15:49:19 vhost01 systemd[1]: havp.service: Control process exited, code=exited status=1
1月 03 15:49:19 vhost01 systemd[1]: havp.service: Failed with result 'exit-code'.
1月 03 15:49:19 vhost01 systemd[1]: Failed to start LSB: HAVP virus-scanning HTTP proxy.
E: Error starting service (could be due to port 8080 already in use), ignoring...
systemd (236-2) のトリガを処理しています ...
man-db (2.7.6.1-4) のトリガを処理しています ...
clamav-freshclam (0.99.3~beta1+dfsg-4) を設定しています ...
Created symlink /etc/systemd/system/multi-user.target.wants/clamav-freshclam.service → /lib/systemd/system/clamav-freshclam.service.
clamav (0.99.3~beta1+dfsg-4) を設定しています ...
systemd (236-2) のトリガを処理しています ...

と、インストール時に表示されるメッセージ、 havp のインストール後の起動のところで、エラーが出ている。

curl コマンド使って、Webサイトの挙動を確認する

年末に流れた、以下の tweet。

確かに、Google の検索結果に表示されるリンクをクリックすると、新しい URL へ転送されるので、旧サイト→新サイトへの転送は正しく設定されていることはわかるのだけど、どうやら Google などのクローラが望む形での転送設定ではないようなので、どうなっているのかを調べてみた。
サイト自体は10月までに新しい URL に移行しているそうで、

未だに旧サイトしか検索結果に上がってこないのは如何なものか、という事もあったりするんですけど。

こういう時、Web ブラウザだけでは挙動を追いきれないので、自分は curl コマンドを使って確認することがほとんど。
curl コマンドは、URL 形式で表現( http://〜 や ftp://〜 のような表記のやつ)されるサーバのロケーションへのアクセスしてデータを取得するためのものなのだけど、単純にデータを取ってくるだけ以外の用途でも使えるので、今回は Web サイトの挙動をチェックする際の使い方に絞って、簡単に解説してみる。

まずは、手始めに Web アクセスした時のクライアントからのリクエストの内容と、それに対して返ってくるサーバからのレスポンスの内容をチェックする方法。
これは、 -v オプションを付けて curl を実行すれば OK。

soukaku@vhost01:[~]$ curl -v http://law.e-gov.go.jp/htmldata/H11/H11HO042.html
* Trying 2400:4040:5013:b::13...
* TCP_NODELAY set
* Trying 210.232.23.44...
* TCP_NODELAY set
* Connected to law.e-gov.go.jp (210.232.23.44) port 80 (#0)
> GET /htmldata/H11/H11HO042.html HTTP/1.1
> Host: law.e-gov.go.jp
> User-Agent: curl/7.57.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Connection: close
< Cache-Control: no-cache
< Content-Type: text/html; charset=shift_jis
< Pragma: no-cache
< Content-Length: 189
<
* Closing connection 0
<html><head><title>Request Rejected</title></head><body>The requested URL was rejected. Please consult with your administrator.<br><br>Your support ID is: 10052633866947281389</body></html>

行頭に ">" があるのがリクエストヘッダの内容で、"<" があるのがレスポンスヘッダ。この場合の最後の1行が、実際に Web サーバ側から送られてきたコンテンツの中身(= HTML 形式のデータ)というわけなんだけど、そこを見ると "Request Rejected" とあるので、どうも curl でアクセスすると、上手くアクセスがが出来ないようにサーバ側が設定されているっぽい。

仮想通貨の採掘始めてみました

ここ最近、仮想通貨がブームというか話題になることが多いのですけど、まぁ自分にとってはあんま関係ないな、と思っていたんですけど、GPU を使わず CPU パワーでもって採掘を行なう仮想通貨があるというのを知ったので、ちょっとやってみるか、ということで始めてみました。
元々、 BOINC プロジェクトに参加していたこともあって、常時サーバの CPU パワー全開だったのを仮想通貨の採掘に変えるだけなのでね。

で、掘り始めたのは、 BitZeny
採掘の準備とかは、

今回はUbuntuでマイニングを行うので、そのためのツールをインストールする。といっても非常に簡単で、cpuminerというソフトウェアをgitで引っ張ってきてインストールをすれば終わり。

[From ubuntuでCPU専用仮想通貨「Bitzeny」をマイニング(採掘)してみる。1日にどれくらい、何円分マイニング出来るのか? | Web Net Force]

を参考に。

実働させてみた感想などなど

実際採掘はじめてわかったのだけど、「CPU 専用なのだから、スレッド数の多さが正義!」だと思ったら、意外と物理コア数に合わせて minerd を動かしたほうが採掘効率が良いみたいですな。なんで、それに気づいたか、というと 4C8T かつクロック数も高い Xeon E3-1280 で採掘するより、 4C4T な Xeon X3430 のほうが Hashrate が高いという結果を目の当たりにしまして…。

ということで、現状 3 台で採掘をやってますが、各マシンの Hashrate の最大値は、こんな感じ。

  • Xeon X3430 → 1.80 khash/s
  • Xeon E3-1280 → 2.83 khash/s
    • 8 スレッドで実行すると、 1.43 khash/s と半分ぐらいまで落ちちゃうので、実行スレッド数を制御する -t オプションで "-t 4" を指定して実行中。
  • Celeron E1400 → 0.45 khash/s

Celeron E1400 は、Rolling Version にした VyOS マシンだったりします。Q9450 とか E8400 とか余ってるので、それに載せ替えれば、もちっと採掘ペースが上がるだろうと思うのだけど、しばらくはこのままでちまちまと掘り続けてみますよ。
VyOS を Rolling Version にしたのは、BitZeny の採掘も目的ではあったりする…。ルータだけでは、CPU 殆ど使ってないに等しかったしね。

VyOSでWebプロキシー

自宅内のネットワークというか、サーバの用途変更を色々やっている中で、ルータとしている VyOS マシンで Web プロキシーを動かしてみたので、それに関して得られた知見など、メモとしてまとめておく。
なお、使用している VyOS のバージョンは 1.1.8 です。

VyOS で Web プロキシーを有効化

単純に動作させるだけだったら、

set service webproxy listen-address 172.16.0.1
commit

と、プロキシーを利用させたいクライアンが繋がっている側のインターフェースの IP アドレスを指定すれば、設定が完了して、Squid が動作を開始。

この状態では、透過プロキシーとして動作しているので、クライアント側の設定を変える必要もなく、導入自体はお手軽、なのだけど、これがちょっと曲者といえば曲者だったのよね…。

我が家のネットワーク構成

ここで、簡単に我が家のネットワーク構成を說明しておく。

我が家のネットワーク構成概要 2017/12/16版

自宅内には、サーバが 2 台。1 台は SMTP サーバがメイン用途で、もう 1 台(図中の内部サーバ)はローカルネット内で DNS キャッシュ兼プロキシー兼仮想環境による実験用として使用。
あと、さくらの VPS に Web サーバ、DB サーバの VPS が 1 台づつ。

実際には、各サーバ複数の用途で使っているので、 自宅側の SMTP サーバは DNS のセカンダリ兼務だし、 Web サーバは DNS 権威サーバであり、 SMTP のセカンダリでもある、いう感じ。

ちょっと前までは、 SMTP サーバに IP Masquerade 設定して外部とローカルネットのゲートウェイにしてて、更にそこに Squid でプロキシー立ててたんだけど、新しくサーバを手に入れたのを契機に用途見直ししたので、現状では上の図のようになっています。

んで、今回内部サーバ上のプロキシーの上位プロキシーとして VyOS 上で動作するプロキシーを指定したところ、ちょっとハマったというわけ…。

AppArmor に蹴躓く

11 月末ぐらいから、 bind9 のログが出力できないとか統計情報のファイルが作れないという状況になっていたのですが…。
ログに関しては syslog 経由で出すように設定変えて凌いだんですが、統計情報( rndc stats で出力されるやつ)が出力できないのが正常にならなくて、「 bind の設定いじってないのに、なんででなくなった?」と悩んでいたわけです。

で、今日。ふと思い立って出力ファイル名である named.stats をキーにして、/varlog/syslog に grep を実行してみたところ…。

Dec  6 10:20:14 nexus01 kernel: [927197.495080] audit: type=1400 audit(1512523214.458:3455): apparmor="DENIED" operation="open" profile="/usr/sbin/named" name="/var/log/bind9/named.stats" pid=13306 comm="named" requested_mask="ac" denied_mask="ac" fsuid=109 ouid=109
Dec 6 10:25:01 nexus01 kernel: [927484.822757] audit: type=1400 audit(1512523501.782:3456): apparmor="DENIED" operation="open" profile="/usr/sbin/named" name="/var/log/bind9/named.stats" pid=13306 comm="named" requested_mask="ac" denied_mask="ac" fsuid=109 ouid=109

apparmor って、コレかよ、原因は…。 orz

「何かの依存関係で、インストールされてたなぁ…」というのは、微かに記憶の片隅にあったのだけど、これが原因になっていたとは、予想だにせず。
パッケージのインストールログ( /var/log/aptitude )を漁ってみたら、確かにインストールしてるし、bind のログ出力周りがおかしくなったタイミングとインストールした日時が、ほぼ合致しているので、間違いなく AppArmor をインストールしたことの影響だったようです。

Aptitude 0.8.10: log report
Fri, Nov 24 2017 14:42:09 +0900

IMPORTANT: this log only lists intended actions; actions which fail
due to dpkg problems may not be completed.

Will install 8 packages, and remove 0 packages.
252 MB of disk space will be used
========================================
[HOLD, DEPENDENCIES] openssl:amd64 1.1.0f-5
[HOLD] libssl1.1:amd64 1.1.0f-3
[INSTALL] apparmor:amd64 2.11.1-3
[INSTALL] linux-compiler-gcc-7-x86:amd64 4.14-1~exp1
[INSTALL] linux-headers-4.14.0-trunk-amd64:amd64 4.14-1~exp1
[INSTALL] linux-headers-4.14.0-trunk-common:amd64 4.14-1~exp1
[INSTALL] linux-image-4.14.0-trunk-amd64:amd64 4.14-1~exp1
[INSTALL] linux-kbuild-4.14:amd64 4.14-1~exp1
[UPGRADE] libmariadbclient18:amd64 1:10.1.29-5 -> 1:10.1.29-6
[UPGRADE] mariadb-common:amd64 1:10.1.29-5 -> 1:10.1.29-6
========================================

Log complete.

===============================================================================

# bind9 側に何か変更があった?と思って調べてたんだけど、そちらは全部ハズレだったよ。

Rspamd の設定を細かくやってみる - 力技で正規表現フィルタリング

正規表現でのフィルタリング、「一応」出来るようになったので、メモとして残しておく。

modules.d ディレクトリの中を見ると、 SpamAssassin と連携するための spammassassin.conf や メールヘッダや本文中の文字列を正規表現で引っ掛けるための regexp.conf といったものがあるので、このあたりを使いこなせれば更に検知精度が上げられそうです。正規表現での検知は、実際には Rspamd デフォルトのものが有効化されているので、使われていないわけではないんですけど。

[From Rspamd の設定を細かくやってみる - Soukaku's HENA-CHOKO Blog]

但し、「正しい」方法ではないので、参考にしたいという方は、その点自己責任でお願いします。

本来の「正しい」設定方法

/etc/rspamd/local.d/regexp.conf というファイルを作って、そこにブロックしたいメールのヘッダ情報から、フィルタしたい条件を正規表現で記述します。

nexus01:/etc/rspamd# more local.d/regexp.conf
--
config['regexp']['RECEIVED_worldstream'] = {
re = 'Received=/ customer\\.worldstream\\.nl/i',
score = 2.5,
group = 'header'
}

--
config['regexp']['RECEIVED_93034net'] = {
re = 'Reveived=/\\.93034\\.net/i',
score = 2.5,
group ='header'
}

それが終わったら、rspamadm コマンド使って、フィルタしたい内容が認識されているところ確認して〜、と書きたいところなんですが、これが上手くいかない。
ドキュメント通りに設定書いてるのに、local.d/regexp.conf の記述内容が反映されない…。反映されなので、正しく記述できているのかもわからないという困った状況に陥ってしまいました。

Rspamd の設定を細かくやってみる

先日、前々からやろうと思っていた、自宅内のサーバの用途変更作業をやったんですが、

ということで、自宅内のサーバの役割変更をしていくことになるわけですが、今回入手した 5800/53Xg が仮想環境用とするのであれば、HA8000 を現在自宅内でメールサーバとして動いている Express5800/110Ge の後継に据えて、 5800/110Ge は退役ということにしようかと…。

[From Express5800/53Xg を手に入れたので、色々配置替え中 - Soukaku's HENA-CHOKO Blog]

その際に色々手順をしくじったために、サーバの設定ファイル一式を固めていたバックアップデータの最新のものをふっ飛ばしてしまい、その復旧でアタフタしていたんですが、メール部分だけがなかなかうまく復旧できなかったので、思い切って Rspamd を利用することに…。

いやホントに秘伝のタレ状態になってて、自分でもどー設定したのかを思い出せない部分がチラホラあったんですよ…。

ということで、心機一転。
Rspamd でスパム対策の一切合財をやってしまおう、ということで、実際に設定した内容をまとめておきます。

で、Rspamd を設定する上でのお作法というか、注意点というか、基本的な設定ファイルは /etc/rspamd ディレクトリとその配下にある /etc/rspamd/modules.d ディレクトリに配置されていますが、直接それらはいじらず、基本的な動作や個別に設定を変えたいモジュールの設定ファイルを /etc/rspamd/local.d ディレクトリに配置する形になります。

設定がどうなっているのか、変更した内容がどう反映されるのかは、rspamadm コマンド使ってモジュール単位で確認することが出来るので、ファイル書き換えた後のチェックに使えます。

# rspamadm configdump phishing
*** Section phishing ***
symbol = "PHISHING";
openphish_enabled = true;
openphish_premium = false;
openphish_map = "https://www.openphish.com/feed.txt";
phishtank_enabled = true;
phishtank_map = "https://rspamd.com/phishtank/online-valid.json.zst";
redirector_domains [
"/etc/rspamd/redirectors.inc:REDIRECTOR_FALSE",
"/etc/rspamd/local.d/redirectors.inc:LOCAL_REDIRECTOR_FALSE",
]

*** End of section phishing ***

apache2 を mpm_worker + php-fpm で動かすために、色々イジったのでメモ

今回やりたいこと

しばらく前から、自分のところは HTTP/2 対応が完了していたんですが、apache2 パッケージを 2.4.27-* にアップデートすることに伴って HTTP/2 が無効化されてしまうのを回避する、というのが今回のお題目。
mpm-prefork を使わなければ、 HTTP/2 が使えている状況をデクレードせずに済むというのなら、 mpm-prefork 使わない設定に変えますよ、ということで

  • mpm-prefork + mod_php7.0

となっていた構成を、これを HTTP/2 も有効なまま動かすことの出来る

  • mpm-worker + php-fpm


の構成へ変更していく手順をまとめておきます。
#このエントリ書くために、mpm-prefork + mod_php7.0 に一旦戻しましたとも…。

少し前に書いたエントリー

今回は、 prefork から worker に変更したんですが、それに合わせて FastCGI 対応と PHP7.0 の fpm 対応をして(この辺、作業メモ取り忘れてた…)、さぁ Apache 再起動! と思ったら

[From HTTP/2 が、いつの間にか無効状態になっていまして… - Soukaku's HENA-CHOKO Blog]

の落ち穂拾いでもあります。

HTTP/2 が、いつの間にか無効状態になっていまして…

ふと気がつくと、以前 HTTP/2 対応に設定した Apache2 が HTTP/2 でのアクセスが出来ないようなってて、「設定書き換えたわけではないんだけどな〜」と思いつつ、ログをチェックして HTTP/2 が効かなくなってる時期を特定。
その前後でパッケージのアップデートしてないかチェックしたら、Apache2 のパッケージをアップデートしていたのが判ったので、一旦 2.4.27 から 2.4.25 にダウングレードしてみたら、何の問題もなく HTTP/2 でアクセスが出来るように…。

バクだったら、レポートしといたほうがいいよな、と考えつつ、こんな

tweet しておいたら、以下のような情報を教えていただいた。

早速、チェックしてみたら

*) COMPATIBILITY: mod_http2: Disable and give warning when using Prefork.
The server will continue to run, but HTTP/2 will no longer be negotiated.
[Stefan Eissing]

[From CHANGES_2.4.27]

これがまさに、ビンゴ、ってことで、慌てて Apache2 を mpm_prefork を使わない構成に変更した次第。