アクセス制御されているECRのスキャン結果をInspectorダッシュボードから参照する


はじめに

昨年のre:Invent2021でECRの拡張スキャンが発表されましたが、実際に使用しているとInspectorダッシュボードから脆弱性結果が確認できないことがあったので、その解消方法について確認していきます。
https://aws.amazon.com/jp/about-aws/whats-new/2021/11/amazon-inspector-continual-vulnerability-management/

この記事でわかること

  • アクセス制御されたECRリポジトリで脆弱性スキャンを行うための設定手順
  • ECRリポジトリに設定するリソースベースポリシーの内容
  • Inspectorダッシュボードからの脆弱性結果確認方法

事前準備

ECRリポジトリは事前に作成しておきます。作成時にリポジトリ単位のイメージスキャンは無効化したままにします。

リポジトリのリソースベースポリシーで自IP以外のアクセスを拒否しておきます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "ecr:*",
      "Condition": {
        "NotIpAddress": {
          "aws:SourceIp": "XXX.XXX.XXX.XXX/32"
        }
      }
    }
  ]
}

ECRの拡張スキャンが有効化されていることを確認します。

Inspectorのダッシュボードから、脆弱性スキャン結果が1つもないことを確認します。

手順

イメージのBuild&Push

前回も利用した以下のコマンドでイメージを作成して、ECRリポジトリにPushします。

$ cat <<EOF > Dockerfile
FROM ubuntu:16.04
EOF
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com
$ docker build -t test-repository .
$ docker tag test-repository:latest XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/test-repository:latest
$ docker push XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/test-repository:latest

無事ECRリポジトリにPushされました。

脆弱性スキャン確認

結果をInspectorのダッシュボードからも脆弱性スキャン結果を確認してみると、10分以上経ってもリポジトリ自体が認識されず、スキャン結果も表示される様子はありません。

これはECRリポジトリがリソースベースポリシーでアクセスを制限されており、InspectorのサービスがECRに対してアクセスできないことが原因です。

リソースベースポリシー修正

以下のドキュメントを見るとInspectorはサービスリンクロールという特定のIAMロールを使用して各AWSサービスにアクセスするようになっております。
そのため、ECRのリソースベースポリシーでこのロールを許可(または除外)するような設定を追加する必要があります。

『Amazon Inspectorは、AWS Identity and Access Management(IAM) サービスにリンクされたロールを使用します。サービスにリンクされたロールは、AmazonInspectorに直接リンクされている一意のタイプのIAMロールです。サービスにリンクされたロールはAmazonInspectorによって事前定義されており、サービスがユーザーに代わって他のAWSサービスを呼び出すために必要なすべてのパーミッションが含まれています。』
https://docs.aws.amazon.com/ja_jp/inspector/latest/user/using-service-linked-roles.html

これは知らなかったのですが、Inspectorのサービスを有効化した時点で「AWSServiceRoleForAmazonInspector2」という名前のIAMロールが自動で作成されるようです。

このロールにはInspectorの実行に必要な以下の権限が付与されています。

  • Amazon EC2アクションを使用して、インスタンスとネットワークパスに関する情報を取得します。
  • AWS Systems Managerアクションを使用して、AmazonEC2インスタンスからインベントリを取得します。
  • Amazon ECRアクションを使用して、コンテナーイメージに関する情報を取得します。
  • AWS Organizationsアクションを使用して、関連付けられたアカウントを記述します。

上記を踏まえた上で以下のようにECRのリソースベースポリシーを修正します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "ecr:*",
      "Condition": {
        "NotIpAddress": {
          "aws:SourceIp": "XXX.XXX.XXX.XXX/32"
        },
        "ArnNotEquals": {
          "aws:PrincipalArn": "arn:aws:iam::<AWSアカウントID>:role/aws-service-role/inspector2.amazonaws.com/AWSServiceRoleForAmazonInspector2"
        }
      }
    }
  ]
}

イメージの再Push&結果確認

再度PushするためにDockerfileの中身を少し修正して、再度Pushコマンドを実行します。

$ cat Dockerfile
FROM ubuntu:16.04
RUN echo 'hello world!'
$ docker build -t test-repository .
$ docker tag test-repository:latest XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/test-repository:v1
$ docker push XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/test-repository:v1

新規でイメージタグが作成されたことを確認します。

Inspectorのダッシュボードを再度見てみると先ほどPushしたイメージタグが表示されていることがわかります。

イメージタグを押下すると詳細な脆弱性結果を確認することができます。

ここまで設定できていれば、ECRに新しいイメージタグを追加すると、

数分後にはInspectorダッシュボードからも脆弱性結果を見れるようになっています。

補足

上記の手順で、もしいつまでたってもスキャンが実行されない場合、リポジトリのステータスがAccess deniedになっている可能性があります。

その場合、InspectorダッシュボードのAccount managementからECR container scanningをdisable⇒enableする操作を行うことで、最新のリポジトリステータスが取得され、正常にスキャンができるようにステータスを更新することができます。
ただし、この方法だと過去の脆弱性スキャン結果が消えてしまうので、実施する場合は注意が必要です。

おわりに

というわけで、今回はアクセス制御がされたECRリポジトリの脆弱性スキャン結果をInspectorダッシュボードから見るための設定方法について確認しました。
セキュリティ観点からリポジトリへのアクセスを制御しなければいけないことは十分にありうることだと思いますので、拡張スキャンを設定する場合はInspectorのサービスリンクロールの許可設定を忘れずに実施するようにしましょう。