ClamAV で 新しいGoogle Safe Browsing を使う

セキュリティー

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 は下のサイトからダウンロードできます。

GitHub - Cisco-Talos/clamav-safebrowsing
Contribute to Cisco-Talos/clamav-safebrowsing development by creating an account on GitHub.

「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/24IPサブネットは 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=zbridgezbrige を使います
–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を使うなら設定しておきたい拡張機能です。

タイトルとURLをコピーしました