Google Safe Browsing は閲覧者が危険なサイトに踏み込まないようにするためのフレームワークです。
マイクロソフトの SmartScreen と同様の機能です。
2019年11月11日の時点で、Googleが Safe Browsing API の利用規約の変更を発表したため、ClamAV で使うことができなくなりました。
safebrowsing リストを Google Safe Browsing API 経由でダウンロードして独自にデータベースを生成する clamav-safebrowding プロジェクトによって 再び ClamAV に実装できるようになりました。
Google Safe Browsing でClamAVを拡張することで、マルウエアに加えてフィッシングサイトリンクの検出も可能になります。
ClamAVをメールゲートウェイやウェブプロキシで使う場合は Google Safe Browsing 拡張のメリットは大きいと感じます。
Google Safe Browsing API でClamAVを拡張する方法を解説します。
Google API key を取得する
Google Safebrowsing API を使うためにはGoogleアカウントが必要です。
まずGoogleアカウントを取得してから Google Cloud Platform にアクセスして APIキーを取得します。
https://console.developers.google.com/に移動してサインインします。
[ダッシュボード]に移動し、[プロジェクトを選択]をクリックします。
[新しいプロジェクト]をクリックします。
プロジェクト名フィールドに名前を入力し、[作成]をクリックします。
メニューパネルで「認証情報」に移動します。
「認証情報の作成」をクリックして、「APIキー」を選択します。
APIキーが作成されます。
APIキーをコピーして保存しておきます。
「閉じる」をクリックします。
APIキーを取得できました。
セキュリティーを設定しておきます。
「認証情報」のページで「APIキー」リストの名前「APIキー1」をクリックします。
「APIキーを編集」画面で「APIの制限」で「キーを制限」を選択します。
「Select APIs」ドロップダウンリストの中の「Safe Browsing API」にチェックを入れて「OK」をクリックします。
「Safe Browsing API」にチェックを入れて「OK」をクリックします。
「保存」をクリックします。
clamav-safebrowsing の実装
ClamAV でGoogle Safe Browsing を使うに clamav-safebrowsing を実装します。
clamav-safebrowsing は、Google Safebrowsing APIを介して Google Safebrowsing のリストを取得し、ClamAV GDB(Googleデータベース)ファイルにパッケージ化するツールです。
最新の ClamAV をインストールする方法で設定したDockerコンテナに clamav-safebrowsing を実装していきます。
clamav-Safebrowsing を起動するには、少なくとも12GBのメモリー(RAM)が必要です。
clamav-safebrowsing のダウンロード
clamav-Safebrowsing は下のサイトからダウンロードできます。
「Code」をクリックして Git の URL をコピーします。
clamav0 コンテナにログインします。
docker exec -it clamav0 bash
git をインストールします。
/srv/ ディレクトリーに移動して、コピーした Git URL から clamav-safebrowsing をダウンロードします。
apt -y install git
cd /srv
git clone https://github.com/Cisco-Talos/clamav-safebrowsing.git
ダウンロードした clamav-safebrowsing/ の中は以下の通りです。
# apt install tree
# tree -a clamav-safebrowsing/
clamav-safebrowsing/
├── .git
│ ├── HEAD
│ ├── branches
│ ├── config
│ ├── description
│ ├── hooks
│ │ ├── applypatch-msg.sample
│ │ ├── commit-msg.sample
│ │ ├── fsmonitor-watchman.sample
│ │ ├── post-update.sample
│ │ ├── pre-applypatch.sample
│ │ ├── pre-commit.sample
│ │ ├── pre-merge-commit.sample
│ │ ├── pre-push.sample
│ │ ├── pre-rebase.sample
│ │ ├── pre-receive.sample
│ │ ├── prepare-commit-msg.sample
│ │ ├── push-to-checkout.sample
│ │ └── update.sample
│ ├── index
│ ├── info
│ │ └── exclude
│ ├── logs
│ │ ├── HEAD
│ │ └── refs
│ │ ├── heads
│ │ │ └── master
│ │ └── remotes
│ │ └── origin
│ │ └── HEAD
│ ├── objects
│ │ ├── info
│ │ └── pack
│ │ ├── pack-9c67e06dbc344d79a5aa0f869454cd642b1a827e.idx
│ │ └── pack-9c67e06dbc344d79a5aa0f869454cd642b1a827e.pack
│ ├── packed-refs
│ └── refs
│ ├── heads
│ │ └── master
│ ├── remotes
│ │ └── origin
│ │ └── HEAD
│ └── tags
├── .gitignore
├── LICENSE
├── README.md
├── clamsb
│ ├── __init__.py
│ ├── database.py
│ ├── googleapi.py
│ └── utils.py
├── clamsbsync.py
├── clamsbwrite.py
├── etc
│ └── safebrowsing.conf.sample
├── requirements.txt
└── setup.py
19 directories, 38 files
clamav-safebrowsing に必要なものを準備
pyhon ライブラリのインストール
解凍したディレクトリーの requirements.txt にツールを使うために必要なpythonライブラリが示されています。
# cat /srv/clamav-safebrowsing/requirements.txt
mysqlclient
sqlalchemy
google-api-python-client
apacheconfig
これらは setup.py でインストールできます。
setup.py でエラー場出る場合は、pip でインストールできます。
apt -y install pip
pip3 install mysqlclient sqlalchemy google-api-python-client apacheconfig
MySQL サーバーのセットアップ
セーフブラウジングリストの管理とログの構築にMySQLを必要とします。
最新の ClamAV をインストールする方法で設定したDockerコンテナ clamav0 はipvlan ネットワークを使っています。
新たに bridge ネットワークを作って clamav0 と mysql を接続します。
bridge ネットワークを作ります。
docker network create \
--driver=bridge \
--subnet=10.10.11.0/24 \
zbridge
オプション | 意味 |
---|---|
network create | 新しいネットワークを作ります |
–driver=bridge | 「ブリッジネット」ワークです |
–subnet=10.10.11.0/24 | IPサブネットは 10.10.11.0/24 です |
zbridge | ネットワークの名前は zbridge です |
Dockerのネットワークの優先度は「名前順」です。
既存のブリッジネットワーク(名前は bridge)を使うと、ipvlanネットワーク(名前は private-net)よりブリッジネットワークの方が優先度が高くなってしまいます。
clamav0コンテナが private-net を使わなくなり、外部からアクセスができなくなってしまいます。
private-net より優先度の低いブリッジネットワーク zbridge を使う必要があります。
MySQL サーバーを作ります。
今回のMySQLコンテナにはオフィシャルのイメージを使います。
イメージの詳細は Mysql – Official Image | Docker Hub を参照してください。
docker run \
--name mysql1 \
--network=zbridge \
--env MYSQL_ROOT_PASSWORD=oranopasswd \
--volume=/v/MYSQL1/lib:/var/lib/mysql \
--detach=true \
mysql
オプション | 意味 |
---|---|
–name mysql1 | コンテナの名前は mysql1 |
–network=zbridge | zbrige を使います |
–env MYSQL_ROOT_PASSWORD=oranopasswd | 環境変数で mysql の root パスワードを設定します |
–volume=/v/MYSQL1/lib:/var/lib/mysql | コンテナの /var/lib/mysql をホストの /v/MYSQL1/lib にバインドします |
–detach=true | デタッチモードで起動 |
mysql | コンテナイメージは mysql を使います |
zbridge ネットワークにつながった mysql1 に接続できるように clamav0 を zbridge につなぎます。
docker network connect zbridge clamav0
clamav0 にログインして mysql1 にアクセスできることを確認します。
docker exec -it clamav0 bash
クライアントをインストールします。
apt -y install mariadb-client
コンテナ作成時に設定したパスワードで接続します。
mysql -h mysql1 -uroot -poranopasswd
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 76
Server version: 8.0.29 MySQL Community Server - GPL
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]>
データベースを作る
clamav-safebrowsing で使うデータベースを作ります。
CREATE DATABASE gsb DEFAULT CHARACTER SET 'utf8';
CREATE USER 'gsbadmin2'@'10.10.11.%' IDENTIFIED BY 'karenopasswd';
GRANT ALL PRIVILEGES ON gsb.* TO 'gsbadmin2'@'10.10.11.%';
内容は以下の通りです。
コマンド | CREATE DATABASE gsb DEFAULT CHARACTER SET ‘utf8’; | |
意味 | データベース gsb を作る。文字コードをUTF-8にする。 | |
コマンド | CREATE USER ‘gsbadmin2’@’10.10.11.%’ IDENTIFIED BY ‘karenopasswd’; | |
意味 | 10.10.11.0/24セグメントからアクセスできるユーザーgsbadmin2を作る。 パスワードはkarenopasswd。 | |
コマンド | GRANT ALL PRIVILEGES ON gsb.* TO ‘gsbadmin2’@’10.10.11.%’; | |
意味 | ユーザーgsbadmin2にデータベースgsbに対する全権限を付与する。 |
GDB ファイルを保存するディレクトリーの作成
データベース保存用ディレクトリーを作成します。
mkdir /srv/clamav-safebrowsing/gdb
設定ファイルを編集する
ダウンロードしたディレクトリーの中に設定サンプルがあるので、コピーして編集します。
cp /srv/clamav-safebrowsing/etc/safebrowsing.conf.sample /srv/clamav-safebrowsing/etc/safebrowsing.conf
内容は下のようになります。
「apikey」に先ほど取得した Google APIキー を設定します。
cat <<'EOF' >/srv/clamav-safebrowsing/etc/safebrowsing.conf
<safebrowsing>
# Google's apikey for the safebrowsing datafeed
apikey = A*************************************Z
## MySQL database parameters
db_host = mysql1
db_user = gsbadmin2
db_pw = karenopasswd
db_name = gsb
## outputdir is where the update python makes its safebrowsing.gdb
outputdir = /srv/clamav-safebrowsing/gdb/
</safebrowsing>
EOF
以上で clamav-safebrowsing の実行準備が完了しました。
GDB をビルドする
Google Safe Browsing API からリストを取得してデータベースをビルドします。
python3 /srv/clamav-safebrowsing/clamsbsync.py --config /srv/clamav-safebrowsing/etc/safebrowsing.conf build
進行中にWARNINGが表示されますが、しばらくするとビルドが完了します。
1回目のビルドには数十分かかります。
ディレクトリーにデータベースが作成されています。
# ls -lh /srv/clamav-safebrowsing/db/
-rw-r--r-- 1 root root 221M 5月 23 15:57 safebrowsing-1653288893.gdb
このファイルを clamav のデータベース ディレクトリーにコピーします。
cp /srv/clamav-safebrowsing/db/safebrowsing-1653288893.gdb /var/lib/clamav/safebrowsing.gdb
/var/lib/clamav/ ディレクトリーには以下のとおりです。
# ls -l /var/lib/clamav/
合計 580872
-rw-r--r-- 1 clamav clamav 293670 5月 23 11:54 bytecode.cvd
-rw-r--r-- 1 clamav clamav 184987136 6月 8 17:33 daily.cld
-rw-r--r-- 1 clamav clamav 69 5月 24 12:33 freshclam.dat
-rw-r--r-- 1 clamav clamav 170479789 5月 23 11:54 main.cvd
-rw-r--r-- 1 root root 239040826 6月 9 04:12 safebrowsing.gdb
clamd は /var/lib/clamav/ 内のデータベースファイルを読み込む設定なので Safe Browsing が有効になります。
safebrowsing データベースを定期的にアップデートする
ウイルスデータベースと同様に safebrowsing データベースを定期的にアップデートする必要があります。
cron で1日1回アップデートする例です。
アップデート スクリプト update-safebrowsing.sh を次のように作成します。
cat <<'EOF' >/usr/local/etc/update-safebrowsing.sh
python3 /srv/clamav-safebrowsing/clamsbsync.py --config /srv/clamav-safebrowsing/etc/safebrowsing.conf build > /dev/null 2>&1
NEW_DB_FILE=`ls -ltr /srv/clamav-safebrowsing/db/ |tail -n1 |grep -E 'safebrowsing-.+\.gdb' -o`
if [ -n "$NEW_DB_FILE" ];then
cp /srv/clamav-safebrowsing/db/"$NEW_DB_FILE" /var/lib/clamav/safebrowsing.gdb
fi
EOF
update-safebrowsing.sh を cron で毎日1時33分に実行します。
cat <<'EOF' >/etc/cron.d/update-safebrowsing
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
33 1 * * * root sh /usr/local/etc/update-safebrowsing.sh
EOF
リストが毎日大きくなっていくのがわかります。
# ls -lh /srv/clamav-safebrowsing/db/
合計 3.6G
-rw-r--r-- 1 root root 221M 5月 23 15:57 safebrowsing-1653288893.gdb
-rw-r--r-- 1 root root 221M 5月 24 18:21 safebrowsing-1653383971.gdb
-rw-r--r-- 1 root root 222M 5月 26 05:28 safebrowsing-1653510368.gdb
-rw-r--r-- 1 root root 222M 5月 27 03:55 safebrowsing-1653591183.gdb
-rw-r--r-- 1 root root 223M 5月 28 04:07 safebrowsing-1653678311.gdb
-rw-r--r-- 1 root root 223M 5月 29 03:44 safebrowsing-1653763333.gdb
-rw-r--r-- 1 root root 224M 5月 30 03:49 safebrowsing-1653850052.gdb
-rw-r--r-- 1 root root 224M 5月 31 03:52 safebrowsing-1653936612.gdb
-rw-r--r-- 1 root root 225M 6月 1 03:54 safebrowsing-1654023120.gdb
-rw-r--r-- 1 root root 225M 6月 2 03:57 safebrowsing-1654109688.gdb
-rw-r--r-- 1 root root 226M 6月 3 03:51 safebrowsing-1654195752.gdb
-rw-r--r-- 1 root root 227M 6月 4 04:01 safebrowsing-1654282728.gdb
-rw-r--r-- 1 root root 227M 6月 5 03:48 safebrowsing-1654368339.gdb
-rw-r--r-- 1 root root 227M 6月 6 03:54 safebrowsing-1654455118.gdb
-rw-r--r-- 1 root root 228M 6月 7 04:01 safebrowsing-1654541956.gdb
-rw-r--r-- 1 root root 228M 6月 8 04:02 safebrowsing-1654628396.gdb
まとめ
2019年11月までは clamd.conf に「safebrowsing yes」を設定することで safebrowsing が有効になりました。
Google の方針転換で2019年11月以降はClamAVでsafebrowsing が使えなくなっていましたが、各自がデータベースを作成する方法でsafebroswingを復活させることができます。
電子メールでは直接ウイルスを添付したものに代わって、リンクからマルウエアをダウンロードさせる方法が増加しているので、Safe Browsing 機能は重要です。
ウェブ閲覧ではクロスサイトスクリプティングなどで詐欺サイトへのアクセスを誘導される事故が増えていることからも Safe Browsing 機能は重要です。
ClamAVを使うなら設定しておきたい拡張機能です。