Debian10(buster)でClamAVをmake
Linux(Debian)のライトユーザーの筆者にとってmakeは大きな壁です。少し前まではそれが何かもよくわかりませんでした。
ここでは最新バージョンについていくことが好ましいオープンソース(無料)のセキュリティアプリClamAVを例にmakeする方法の覚書を残しています。
追記
2023年2月で、ついにclamAVのメジャーバージョンが1となりました。そしていつの間にかdebパッケージも配布しています。
そして、ビルドで使用するライブラリにも変化があったようです(正確には0.104からのようですが)。そのため、この後の記述は古いものになりますが、makeの使い方として残しておきます。
Debianでインストールするなら先のリンクからdebパッケージを利用するのがいいと思います。
makeとは
ソースコードからコンパイルしてアプリを作成(ビルド)することです。汎用的な環境が整っているWindowsとは違い、Linuxでは使用環境によりライブラリなどの使用状況に差があるため、環境に合わせたコンパイルが必要です。
またDebianではパッケージ管理ソフトAPTで様々なアプリやライブラリをインストールできますが、それらは依存するパッケージを含め安定的な稼働が確認されてから登録されるので、最新のバージョンでない場合が多いです。そのため、最新のバージョンを使いたいというときにもmakeでアプリを作成します。
makeに必要なアプリ
gccやgmakeをはじめmakeに必要なアプリは多数あります。それらのすべてを作成していたら膨大な時間が必要なので、そこはAPTの力を借ります。
必要な環境はbuild-essentialというメタパッケージ(パッケージのリスト)を使ってまとめてインストールできます。これに「automake」を加えればひとまず環境構築は完了です。
$ su ... # apt update ... # apt install buid-essential automake ...
git
アプリのソースコードを取得する際に、圧縮されたファイルを公式ページからダウンロードしてくるという流れが一般的ですが、近ごろではgitレポジトリにソースファイルが存在することも多くなりました。その場合gitアプリをインストールしてあるとソースの取得が簡単です。
gitとはプログラムのバージョン管理システムで複数の人でプログラムを開発する際に用いられます。GitHubやBitbucketなどのサービスが広がるにつれて、gitによる不特定多数の有志で開発されるアプリも増えてきました。
そのようなアプリを利用する際は「git」アプリのインストールも必要です。ClamAVでは本体は公式ページで配布されていますが、一部補助ツールなどはGitHubに公開されています。
gitを使ってソースコードを取得するには、「git clone ソースコードあるURL」となります。これを実行すると、公式ページでxxx.tar.gz等のファイルをダウンロードして展開した後と同じ状態になります。
# apt install git ... # git clone https://xxx.yyy.xxx
ClamAVのソースコードを取得
ClamAVは公式ページでソースコードを管理しています。今回は、ここからDebian(Linux)用のclamav-0.102.4.tar.gzを取得しました。
# wget https://www.clamav.net/downloads/production/clamav-0.102.4.tar.gz ... tar zxvf clamav-0.102.4.tar.gz ...
ClamAVに必要なライブラリ
ClamAVに必要なライブラリは公式ページに載っています。アプリを作成する際は通常使用とは違った開発用のものが必要です。たとえば通常のOpenSSLはインストールしてあっても、開発用のOpenSSLが無いとOpenSSLが存在しないというエラーがでます。それらをAPTから取得する場合はたいてい「-dev」という識別子がついています。
必須のライブラリは、
・zlib1g-dev(zlib)圧縮ライブラリ
・libssl-dev(openssl)
推奨のライブラリは、
・libbz2-dev(bz2)圧縮ライブラリ
・libpcre2-dev(pcre2)正規表現ライブラリ
・libxml2-dev(libxml2)XMLライブラリ
です。加えて、ドキュメントではオプション扱いしたが、後で必要になると分かったので次のライブラリを加えます
・libcurl4-openssl-dev(curl)URLベースデータ転送ライブラリ
まとめてインストールします。
# apt install zlib1g-dev libssl-dev libbz2-dev libpcre2-dev libxml2-dev libcurl4-openssl-dev ...
アプリの作成(コンパイル)
アプリを作成(コンパイル)するには、まず展開したディレクトリに移動してconfigureコマンドを実行します。この時オプションで様々な設定ができます。アプリによってはここで特定のオプションを指定しないと望んだように稼働しなかったりもします。「-help」オプションでconfigureを起動させるとそれらのオプションの一覧が出ますので確認して設定します。
ここではsysconfdirオプションを使って、アプリの設定ファイルの場所を/etcに指定しています。
このコマンドにより環境チェックが行われて内部的にmake時の設定が整えられます。ここで必要なライブラリ等がないとエラーが出て先に進めません。
ログはconfig.logに保存されます。またconfigureが正常に終了すると、config.statusというファイルが生成され、前回と同じオプションでconfigureを実行したい場合はこのファイルを実行することができます。また./config.status --configとすることで、前回のオプション(暗黙のものも含む)が表示されます。
# cd clamav-0.102.4/ # ./configure --sysconfdir=/etc ...
筆者の環境では上のようなエラーがでました。ドキュメントではcurlライブラリはオプションということでしたが、「is required in order to build freshclam(freshclamをビルドするためには必要)」とのことなのでインストールしてconfigureを実行しなおしました。
configureが成功したら今度は「make」コマンドを実行します。
ソースコードに問題があるとエラーやワーニングがでます。今回は何か所かワーニングがでましたが今の自分にはどうしようもないので、そのままにしました。
「make」が終わったら今度は、「make install」コマンドを実行します。makeはアプリの作成、make installは作成したアプリを配置するコマンドです。配置する場所はconfigure時に指定することもできますが、今回は指定しなかったのでデフォルトの/usr/local/binにインストールされました。
すべてのアプリが使用可能だとは限りませんが、makeしたディレクトリで「make uninstall」とするとアンインストールができるものもあります。アンインストール機能が提供されていない場合は、「make -n install」とするとインストールコマンドが表示されるのでどこに何が配置されたかを確認して削除します。
チェックをしたい場合
先では省略しましたが、「check」というユニットテスト用のアプリをインストールし、configure時に--enable-checkとすることで、「make」と「make install」の間で「make check」コマンドを実行して作成したアプリの動作チェックができます。--enable-checkをつけずに作成した場合は「make check」の実行はできますがエラーで終了します。
check(checkmk)のバイナリはAPTでインストールできるのですが、開発用のバイナリをAPTからは見つけられませんでした。なのでGitHubにあったソースからmakeしました。GitHubですがこのプロジェクトではtar.gzを配布していますのでそれをwgetで取得しました。
# wget https://github.com/libcheck/check/releases/download/0.15.2/check-0.15.2.tar.gz ... # tar zxvfo check-0.15.2.tar.gz ... # cd check-0.15.2 # ./configure # make && make install
tarのoオプションは所有権の修正です。「make && make install」とすることで、makeに成功した場合続けてmake installされます。
そのようにして環境を整え、「make check」を実行すると、しばらくした後に結果が出ます。すべての結果がPASSかSKIPなら成功です。
ClamAVの設定
makeによるインストール作業は以上ですが、ついでにインストールしたClamAVの初期設定の方法も書いておきます。
configureで設定ファイルの保存場所に指定した/etcディレクトリに、「freshclam.conf.sample」と「clamd.conf.sample」が存在しているはずなので、ファイル名から.sampleを除去します。
freshclam.confはウイルスデータベース更新時の設定、clamd.confはウイルススキャンデーモンの設定になります。
# mv /etc/freshclam.conf.sample /etc/freshclam.conf # mv /etc/clamd.conf.sample /etc/clamd.conf
リネームが終わったら、それぞれの.confファイルの先頭部に「Example」という文字が入っているので、これをコメントアウトします。
次に、ウィルスデータベースディレクトリを作成します。デフォルトはインストールディレクトリ/share/clamavです。ここでは「/usr/local/share/clamav」を作成しました。このディレクトリはfreshcram.confのDatabaseDirectoryの項目で変更もできます。
ClamAVの実行とエラー
まずは定義ファイル更新をします。freshclamコマンドで実行されます。
# freshclam ... freshclam: error while loading shared libraries: libclamav.so.9: cannot open shared object file: No such file or directory
エラーが出ました。ローカルのライブラリディレクトリ(筆者の場合は/usr/local/lib/)に「libclamav.so.9」が存在していて、「/etc/ld.so.conf.d/」内のファイルにも/usr/local/lib/にあるライブラリのに対して読み込み設定がされているなら、ldconfigコマンドを実行し、ライブラリの更新するだけで解決します。
ERROR: Can't create temporary directory /usr/local/share/clamav/tmp.xxxx Hint: The database directory must be writable for UID xxx or GID yyy
再度エラーが出ました。こちらのエラーはHint通りにします。
定義ファイル更新が終わったらスキャンしてみます。スキャンコマンドは「clamscan -r ディレクトリ」です。rオプションで再帰的にディレクトリを検索します。
TREND MICROのページにテストウィルスがあるので、ダウンロードしてチェックしてみるのもいいかもしれません。
追記
clamav-0.103.3では、次の必要なツールと、依存ライブラリが次のように変わっていました。
ツール
- gcc
- make
- pkg-config
- valgrind
依存ライブラリ
- check
- libbz2-dev
- libcurl4-openssl-dev
- libjson-c-dev
- libmilter-dev
- libncurses5-dev
- libpcre2-dev
- libssl-dev
- libxml2-dev
- zlib1g-dev
またconfigure時に次のようなワーニングも出ました。libjson-cが衝突する可能性があるから、--with-libjson-staticオプションでライブラリの場所を指定するように言われています。ライブラリ自体はlibjson-c-devをインストールすることで利用可能になりますが、-fPICフラグがついているか不明です。readelfで確認できるような情報もありましたが、よくわかりませんでした。とりあえずワーニングということなので、今回は無視しました。
configure: WARNING: ****** libjson-c is known to share symbol names with other JSON libraries ****** which may result in crashes for applications that use libclamav. ****** Consider using --with-libjson-static=path/to/libjson-c.a, ****** providing a json-c library that was compiled with CFLAGS="-fPIC".