🐋

AWSで始めるコンテナイメージスキャン

に公開

想定読者

  • これからコンテナイメージスキャンを導入したい人
  • コンテナイメージスキャンを実施するための方法の概要を知りたい人
  • AWSでコンテナサービスを利用している人

はじめに

コンテナイメージには、ベースイメージのOSパッケージやアプリケーションの依存ライブラリなど、多くのソフトウェアコンポーネントが含まれていて、それらに関する新しい脆弱性(CVE)が日々発見されており、放置しておくとセキュリティリスクにとなります。そのため、コンテナイメージのスキャンをすることで脆弱性を検知し、対応していくことが大切です。
一方で、コンテナイメージのスキャンと聞くとハードルが高く感じたり、運用負荷が高いのでは?と思うことも多いのではないかと思っており、どんなことができるのかなどについてイメージを掴んでいただけたらと思っております。

コンテナイメージスキャンを実施するための選択肢

AWS環境でサービスを構築していることを前提としており、AWSサービスを使う場合とその他のパターンで全体としては以下のような選択肢があるかと思います。

  • AWSサービス
    • ECR ベーシックスキャン
    • ECR 拡張スキャン(Amazon Inspector)
  • OSSツール
    • Trivy など
  • 有償サービス
    • Snyk, Sysdig など

Trivy を使うメリット・デメリット

Trivyは無償で使うことができ、以下のようなコマンドを実行するだけでコンテナイメージをスキャンすることができるため非常に手軽に扱うことができます。イメージ作成直後など実行環境からコンテナイメージにアクセスしやすい環境においてはコマンドを1行追加するだけなのでお手軽です。

trivy image <イメージ名>

参考:https://zenn.dev/dotdtech_blog/articles/923f7e97253304

メリット・デメリットをまとめると以下のようになります。少し主観や経験に基づく要素を含むかもしれません。

  • メリット
    • CIに組み込むことでマージやデプロイ前にブロックできる
    • ライブラリもスキャン可能
    • 無料で使える
  • デメリット
    • CI の実行時間が伸びる
    • 定期実行の仕組みを作らないと新規CVEを検知できない
    • 実行環境や設定のセットアップ・メンテナンスが必要
    • 専用のUI等はない

ECRベーシックスキャンとECR拡張スキャンについて

TrivyはCLIからの実行を前提していたのに対して、ECRのスキャン機能はECRにプッシュされたことをトリガーとしてスキャンが実行されます。また、拡張スキャンでは継続的スキャンの機能がありイメージをプッシュした後に見つかる脆弱性についても検知することがあります。

無料のベーシックスキャンと拡張スキャン(Inspector)があり、それぞれを比較すると以下のようになります。

項目 ベージックスキャン 拡張スキャン
料金 無料 有料
スキャン対象 OSパッケージのみ OS + 言語ライブラリ
プッシュ時スキャン
継続的スキャン ×
新規CVE検出時の再スキャン ×
Security Hub連携 -
EventBridge連携 完了イベントのみ 詳細なイベント
  • OSパッケージだけでなく言語ライブラリも検査したいか
  • プッシュ後も継続的なスキャンをしたいか
    あたりが選択に当たって大きな要素になるかと思います。

また、脆弱性が見つかった場合にSlackなどへの通知をする実装する場合にも差が出ます。ベーシックスキャンでは完了時にサマリを検知できるのみなのに対して、拡張スキャンでは見つかった脆弱性ごとにEventBridgeでハンドリングすることができます。
手動スキャンができるのはベーシックスキャンの方だけになるので、もし1日に1回など定期スキャンを明示的にやりたいなら、EventBridge Scheduler + Lambda で start-image-scan を定期実行する仕組みを作る選択肢もあります。

参考:https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/image-scanning-enhanced-events.html

有償サービスを利用について

基本的にTrivyやECRのスキャンでできることが全てできると考えていいと思います。GUIでの操作もしやすくコストや稟議などの懸念をクリアできれば良い選択肢かと思います。無償トライアルできるサービスもあると思うので選択肢として考えて見るのもいいかもしれません。(本記事では詳細は割愛)

ECRの拡張スキャンを使った運用イメージ

どの選択肢を取るかは何を優先したいかによるところですが、

  • CIをこれ以上遅くしたくない
  • プッシュした後も継続的に新しい脆弱性に気付きたい
  • まずはAWSサービスで完結させたい
    といったケースではECRの拡張スキャンが向いているかと思います。このセクションではECRの拡張スキャンを使うケースについて深掘りしたいと思います。

見つかった脆弱性をSlackに通知する仕組みとして図のようなリソースを作成します。

図はこちらの記事から拝借しました。SecurityHubを挟まなくても通知はできるのですが、SecurityHubと連携することでseverityごとに通知を分けたりすることができたりSecurityHub上で対応の管理もしやすくなります。
https://dev.classmethod.jp/articles/notify-inspector-v2-findings-using-chatbot

実際の運用としてやることは以下の内容になります。

  • 上記の環境をセットアップ
  • CI/CDパイプラインの中でECRへイメージをプッシュ(変更なし)
  • Slackで通知を受け取る
  • 脆弱性の内容を確認して対応
  • SecurityHubのステータスを変更

脆弱性については修正バッチが出ておらずすぐに直せないもあったりすると思うので、もの細かい運用については組織ごとに定めるといいと思います。

まとめ

以上で、AWSで始めるコンテナイメージスキャンについての紹介になります。大要を掴んでいただき最初の一歩を踏み出す際の参考になれば幸いです。

Discussion