Aqua Enterpriseをパイプラインに組み込んで許可されたベースイメージのみを使用するよう強制してみた

こんにちは。
枡川です。

Aqua Enterpriseを使用して許可されたベースイメージ以外を使用した場合にパイプラインが失敗するように設定してみました。
これはApproved Base Imageと呼ばれるポリシーを使用することで実現可能です。
それなりの規模でコンテナを使用している場合、使用するベースイメージを管理するには相当な労力が必要だと思います。
Aqua EnterpriseではImage Scanのポリシー画面でその他のセキュリテイ項目と合わせて管理することができます。

前提・注意点について

本記事における検証においては、Aqua社から提供いただいたトライアルアカウントを利用しています。
コンテナイメージや、セットアップ用のドキュメントなどは、公式ドキュメントアクセス用のアカウントが必要となりますのでご留意ください。

セットアップについて

パイプラインとは別にAqua Enterprise自体のセットアップが必要です。
EC2にDockerをインストールしてセットアップしたり、ECS Fargateを使用したりできます。
詳細な内容は下記ブログを参照下さい。

シナリオ

下図のような単純なパイプラインを想定します。
GitHubへのpushをトリガーにして、ビルドとECRへのpush、ECSへのデプロイを実施するものになります。
CodeBuild内で下記のように専用CLIを使用してAqua Enterpriseでのイメージスキャンを実施します。

./scannercli scan --host $AQUA_URL --user $AQUA_USER --password $AQUA_PASSWORD --local $REPOSITORY_URI:$TAG --no-verify --htmlfile aqua.html

CodeBuild内でのAqua Enterpriseの呼び出しについては、下記ブログおよびブログ内で紹介しているハンズオンにより詳細な記載があります。

Approved Base Imageについて

Aqua EnterpriseにはImage Assurance Policyと呼ばれるポリシーが存在し、イメージスキャンの際にチェックする項目を定義できます。
CI/CDの最中にスキャンを組み込んで、違反した場合はその後の処理をさせないようにすることも可能です。
Approved Base ImageはImage Assurance Policyの一つであり、設定したベースイメージ以外を使用した場合に違反とみなすポリシーとなります。
その他のImage Assurance Policyの一覧については下記記事に詳しく記載されています。

やってみた

Aqua EnterpriseのImage Assurance Policyに移動して、イメージスキャン用のDefaultポリシーを編集します。
この中でFail the Aqua step in CI/CDにチェックがついていることを確認します。
Approved Base Imageの設定をします。
ベースイメージの管理まで行う場合はECR等のプライベートなレジストリを使用することが多いと思いますので、今回はベースイメージをECRで管理します。
Aqua EnterpriseでECRのイメージを取得するためには別途設定が必要です。
AquaをホストしているEC2やECSのIAMロールに権限を付けて、Aqua Enterpriseで設定をします。
詳細な設定方法は下記ブログに記載しています。

指定するベースイメージとして下記Dockerfileでbase-imageを作成し、ECRにpushします。

FROM ubuntu:20.04
RUN apt-get update
RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser

その上でApproved Base Imageポリシー内で指定し、ベースイメージを制限します。
今回は1つしか登録してませんが、複数登録することももちろん可能です。
また、ベースイメージとして設定する時は事前に手動イメージスキャンを実行しておかないと設定できずに下記エラーが発生します。

The base image(s) provided are not registered in Aqua

FROM ubuntu:20.04でDockerfileを記載してGitHubにpushした場合のビルド結果を見てみます。
Aqua Enterpriseでのスキャンでビルドが終了しています。
Aquaのコンソールを見ると、Approved Base ImagesポリシーでNon-Compliantと判定されていることがわかります。
FROM [ECR上のベースイメージのURI]でDockerfileを記載してGitHubにpushした時のビルド結果を見ると無事成功しています。
Aquaのコンソールを見ると、Approved Base ImagesポリシーでCompliantと判定されていることがわかります。

最後に

ベースイメージを完全に管理して制限するのは相当大変だろうと思いながら試してみましたが、Aqua Enterpriseを入れることで大分楽になるだろうという印象を受けました。
ベースイメージを制限するだけでなく、指定したパッケージが含まれていたらブロックや脆弱性で指定してブロック等さまざまなポリシーが存在するので今後も試してみようと思います。