[アップデート] Amazon Macie で S3 バケットが直接パブリックアクセス出来ない場合でも、CloudFront の OAI と OAC が設定されている場合に外部公開リスクとして検出出来るようになりました

2023.02.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

Amazon Macie は S3 バケットを対象にセキュリティまたはプライバシーに関するリスクを検出するサービスです。

Macie の検出結果には 2 つのタイプがあって、ポリシーの検出結果と機密データの検出結果があります。

前者は S3 バケットのポリシーの設定や変更によってセキュリティリスクが発生した際に検出結果を生成します。例えば S3 バケットがパブリックアクセス出来る状態になったことなどを検出します。
後者は特定のパターンを使ってオブジェクト内の機密データを検出します。例えばオブジェクト内にアクセスキーなどの認証情報やクレジットカード番号などを含んでいる場合にパターン検出を行います。

アップデート内容

先日のアップデートで、Macie はポリシー検出として S3 バケットポリシーとしてはパブリックアクセスが拒否されているが、CloudFront の OAI (Origin Access identity) や OAC (Origin Access Control) 経由でのアクセスを許可している場合もリスクとして検出出来るようになりました。

OAI と OAC は S3 バケットのプライベートアクセスを保ちつつ CloudFront 経由でのみアクセスを許可する仕組みです。
OAI は古い機能で、現在は OAC の利用が推奨されています。

今回のアップデートについて What's New at AWS の記事はまだありませんが、Amazon Macie のドキュメント更新履歴では 2023 年 2 月 24 日の更新が追加されています。

Document history for Amazon Macie - Amazon Macie

New functionality
Macie can now generate an additional type of policy finding for an S3 bucket: Policy:IAMUser/S3BucketSharedWithCloudFront.
This type of finding indicates that a bucket's policy was changed to allow the bucket to be shared with an Amazon CloudFront origin access identity (OAI), a CloudFront origin access control (OAC), or both.
In addition, buckets that are shared with CloudFront OAIs or OACs are now considered to be shared externally in statistics and metadata that Macie provides about your Amazon S3 data.

S3 バケットのアクセス設定の検出については他に S3 アクセスアナライザーなどもあります。

私は知らなかったのですが、S3 アクセスアナライザーでは OAI は検知出来るようなのですが、OAC はまだ対応してないようですね。
後述の手順で OAI と OAC のアクセスを許可したバケットをそれぞれ用意したところ、OAC を許可したバケットは検出されませんでした。

検証

では実際に検証してみたいと思います。

Amazon Macie の有効化

まずは Amazon Macie を有効化されていることを確認します。
重要な点として、Macie の 2 つの検出結果のうち今回対象のポリシー検出に関しては、Macie が有効化された後の変更を検出します。
例えばパブリックアクセスが許可された S3 バケットが既に存在している状態から Macie を有効化しても検出してくれません。

そのため、始めに Macie が有効化されているかを確認する必要があります。

OAC と OAI 経由でのアクセスを許可するバケットをそれぞれ用意する

Macie が有効化されていたら OAC と OAI を作成して S3 バケットのバケットポリシーに設定していきます。
設定方法は以下を参考に設定しました。

今回はおまけでパブリックアクセスを許可する S3 バケットも用意してみました。

OAC の設定箇所とバケットポリシー

OAC は CloudFront のオリジンアクセスの「コントロール設定」タブから設定が可能です。
バケットポリシーではディストリビューションの指定を行うようなので適当なディストリビューションを作成し、対象 S3 バケットのオリジンを作成してこの OAC を設定しています。

バケットポリシーは以下です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowCloudFrontServicePrincipalReadOnly",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudfront.amazonaws.com"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::hoge0226oac/*",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceArn": "arn:aws:cloudfront::123456789012:distribution/ESJQZ5QV49M03"
                }
            }
        }
    ]
}

OAI の設定箇所とバケットポリシー

OAI は CloudFront のオリジンアクセスの「アイデンティティ(レガシー)」タブから設定が可能です。
こちらは特にディストリビューション上ではまだ設定していません。

バケットポリシーは以下です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowLegacyOAIReadOnly",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E2RT3VDF17NDCA"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::123456789012/*"
        }
    ]
}

Macie で検出結果を確認する

数分待つと Macie の検出結果一覧に期待した検出結果が表示されました。

キャプチャーの表示が省略文字になっていて、しまったという感じなのですが検出結果タイプとしてはPolicy:IAMUser/S3BucketSharedWithCloudFrontが検出されています。

また、パブリックアクセス可能になっているバケットは重要度が High でしたが、S3BucketSharedWithCloudFrontの重要度は Medium でした。
Macie を EventBridge などで使っていて、detail.serverityあたりでフィルタリングしている場合は重要度を少し気にしてあげてください。

個別の検出結果でダウンロード可能な JSON データは次のような description が確認できました。

[
  {
    "accountId": "123456789012",
    "archived": false,
    "category": "POLICY",
    "count": 2,
    "createdAt": "2023-02-25T21:24:12.400Z",
    "description": "The bucket policy for the Amazon S3 bucket allows the bucket to be shared with a CloudFront Origin Access Identity (OAI) or a CloudFront Origin Access Control (OAC)",
:
  }
]

さいごに

本日は Amazon Macie で S3 バケットが直接パブリックアクセス出来ない場合でも、CloudFront の OAI と OAC が設定されている場合に外部公開リスクとして検出出来るようになっていたので実際に確認してみました。

現在 S3 アクセスアナライザーで OAC が検出されないことは知らなかった(何か設定を見落としている?)のですが、たしかに OAC 経由で機密情報をパブリックに公開してしまう可能性はあるので、重要度 Medium としてセキュリティ管理者が検出出来るパスがあるのは良いなと思いました。