capistranoデプロイ時にデプロイするファイルをウィルススキャンする

プライベートの検証環境を使って、 capistranoデプロイ時にデプロイするファイルをウィルススキャンするようにしてみました。

やっていることは、capistranoデプロイ時にclamdscanしているだけです。 上手くいってそうなので、メモとして残しておきます。

使用した環境

capistranoを実行する環境

デプロイ先

実行するタスクを準備

以下のタスクを準備します。 今回はウィルス検知時に即時ウィルスを削除して欲しいので、オプションは --remove を設定しました。 ※ デプロイ先でclamdscanを実行できるようにしておくこと

namespace :clamd do
  desc 'execute clamdscan'
  task :scan do
    on roles(:all) do
      execute :clamdscan, "--remove", release_path
    end
  end
end

そして、deploy:publishing の前に追加したタスクを実行するようにします。

before 'deploy:publishing', 'clamd:scan'

無事ウィルススキャンができるようになりました。

00:03 deploy:set_current_revision
      01 echo "2f1f01d423a5302f423e9b5b5add61e64880b83b" > REVISION
    ✔ 01 root@sshd 0.049s
00:03 clamd:scan
      01 clamdscan --remove /var/www/app/releases/20200521155121
      01 /var/www/app/releases/20200521155121: OK
      01
      01 ----------- SCAN SUMMARY -----------
      01 Infected files: 0
      01 Time: 0.021 sec (0 m 0 s)
    ✔ 01 root@sshd 0.074s
00:03 deploy:symlink:release
      01 ln -s /var/www/app/releases/20200521155121 /var/www/app/releases/current
    ✔ 01 root@sshd 0.048s
      02 mv /var/www/app/releases/current /var/www/app
    ✔ 02 root@sshd 0.049s

ウィルス検知時は、このようにデプロイが失敗します。

00:03 deploy:set_current_revision
      01 echo "a1590ccbb73f48b484651db1e04aeec737a3d380" > REVISION
    ✔ 01 root@sshd 0.049s
00:03 clamd:scan
      01 clamdscan --remove /var/www/app/releases/20200521160613
      01 /var/www/app/releases/20200521160613/eicar: Eicar-Signature FOUND
      01 /var/www/app/releases/20200521160613/eicar: Removed.
      01
      01 ----------- SCAN SUMMARY -----------
      01 Infected files: 1
      01 Time: 0.037 sec (0 m 0 s)
(Backtrace restricted to imported tasks)
cap aborted!
SSHKit::Runner::ExecuteError: Exception while executing as root@sshd: clamdscan exit status: 1

今回検証した環境は、dockerで動かせるようにしたので、動きを確認したい場合は以下の環境でお試しすることができます。

github.com

では