「Dockerで本番環境に上げたら、突然セキュリティアラートが大量に出て大騒ぎになった」——そんな経験をしたエンジニアは少なくないはずです。コンテナは便利な反面、ベースイメージの中に古いライブラリや既知の脆弱性が潜んでいることがあります。そこで今回は、無料で使えるコンテナ脆弱性スキャナー「Trivy」を使って、本番投入前に問題を検出する方法を解説します。
まず「なぜスキャンが必要なのか」を、身近なたとえで考えてみましょう。Dockerイメージは「冷凍食品」のようなものです。中に何が入っているか、パッケージを開けてみないとわからない——いや、もっと正確に言えば「成分表示を読まないと危険なものが混入していても気づかない」のです。nginx:latestというイメージを何も確認せずに使うのは、賞味期限も原材料も確認せずに冷凍食品を食べるようなもの。Trivyはその「成分表示をくまなく読んでくれるツール」です。
実際の現場でよくある会話を再現してみましょう。
新人エンジニアA:「このDockerイメージ、公式のubuntu:20.04をベースにしてるから安全ですよね?」
ベテランエンジニアB:「公式だから安全、ってわけじゃないんだよ。公式イメージでも古いOpenSSLや既知CVEを含んでることがある。スキャンした?」
A:「え、スキャンするんですか?」
B:「当然。Trivyで10秒もあればわかる。やってみせるよ」
Trivyのインストールと基本的な使い方は非常にシンプルです。まずインストールから始めましょう(macOSの場合)。
brew install trivy
インストールが完了したら、Dockerイメージをスキャンしてみましょう。たとえばnginxの公式イメージを対象にする場合はこうなります。
trivy image nginx:latest
実行すると、CVE番号・深刻度(CRITICAL/HIGH/MEDIUM/LOW)・修正バージョンの一覧が出力されます。深刻度CRITICALやHIGHの脆弱性が含まれる場合は、ベースイメージをより新しいバージョンや軽量な「distroless」イメージに切り替えることを検討しましょう。
さらに一歩進んで、CI/CDパイプライン(GitHub Actionsなど)にTrivyを組み込むと、Pull Request時に自動でスキャンが走り、CRITICALが検出されたらマージをブロックする運用が実現できます。設定例はこちらです。
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
with:
image-ref: 'myapp:latest'
format: 'table'
exit-code: '1'
severity: 'CRITICAL,HIGH'
「exit-code: 1」の設定がポイントで、CRITICALまたはHIGHの脆弱性が見つかったときにCIを失敗させることができます。セキュリティは後回しにするほどコストが跳ね上がります。今日からTrivyをパイプラインに組み込む習慣をつけましょう。
コメントを残す