[アップデート] Amazon MacieでHTTP BASIC認証ヘッダー / HTTP Cookie / JWTを検出できるようになりました

「クレデンシャルがログに残ったまま運用がされていました」みたいなことを防ぐためにもAmazon Macieを使おう
2022.04.27

Amazon Macieに3種類の新しいマネージドデータ識別子が

こんにちは、のんピ(@non____97)です。

Amazon Macieに3種類の新しいマネージドデータ識別子が追加されました。

このアップデートでS3バケット内の以下情報を検出できるようになりました。

  • HTTP BASIC認証ヘッダー
  • HTTP Cookie
  • JSON Web Token(以降JWT)

AWS公式ドキュメントのマネージド識別子一覧にも追加されています。

アプリケーションのデバッグログをS3バケットに出力していると、なんだか紛れ込みそうな情報ですよね。

早速やってみたので紹介します。

やってみた

テスト用ファイルの作成

HTTP BASIC認証ヘッダー

まず、テスト用のファイルを作成します。

Amazon Macieで検出されるためにはRFC 7617 - The 'Basic' HTTP Authentication Schemeで記載されているようなフィールド名と認証スキームを含む完全なヘッダーが必要です。

今回はAuthorizationヘッダーとProxy-Authorizationヘッダーを入力しました。

HTTP BASIC認証ヘッダーのテスト用ファイルは以下の通りです。

HTTP_BASIC_AUTH_HEADER.txt

Authorization: Basic bm9uLTk3d293d293
Proxy-Authorization: Basic bm9uLTk3cGllbnBpZW4=

ちなみにbm9uLTk3d293d293bm9uLTk3cGllbnBpZW4=はBASE64でエンコードした文字列です。

> echo bm9uLTk3d293d293 | base64 -d
non-97wowwow

> echo bm9uLTk3cGllbnBpZW4= | base64 -d
non-97pienpien

HTTP Cookie

検出には完全なCookieヘッダーまたはSet-Cookieヘッダーが必要です。

HTTP Cookieのテスト用ファイルは以下の通りです。

HTTP_COOKIE.txt

Set-Cookie: id=non-97
Cookie: session=8888; lang=ja

JWT

Amazon Macieで検出されるためにはRFC 7519 - JSON Web Token (JWT)で指定された要件に準拠する必要があります。

今回はJSON Web Tokens - jwt.ioでエンコードしました。

JWTのテスト用ファイルは以下の通りです。

JSON_WEB_TOKEN.txt

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Im5vbi05NyIsImlhdCI6MTUxNjIzOTAyMn0.AqLcYeBto0xNa-4aOVtYws-UIgBbVUG2snrSWPBpxYI

エンコード元のヘッダーやペイロード、署名は以下の通りです。

JWTヘッダー

{
  "alg": "HS256",
  "typ": "JWT"
}

JWTペイロード

{
  "sub": "1234567890",
  "name": "non-97",
  "iat": 1516239022
}

署名

HMACSHA256(
  base64UrlEncode(JWTヘッダー) + "." +
  base64UrlEncode(JWTペイロード),
  non-97-secret
) secret base64 encoded

テスト用ファイルの作成が完了したら、ファイルをS3バケットにアップロードします。

テスト用ファイルをS3バケットにアップロード

Amazon Macieのジョブの作成

それでは、Amazon Macieのジョブを作成します。

まだAmazon Macieを利用していない場合は、Amazon Macieのコンソールからご利用開始にあたってをクリックします。

Amazon Macieのご利用開始にあたって

Macieを有効化をクリックします。

Macieを有効化

ちなみに作成されるIAMロールのポリシーと信頼関係は以下の通りです。

AWSServiceRoleForAmazonMacieのポリシー

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "cloudtrail:DescribeTrails",
        "cloudtrail:GetEventSelectors",
        "cloudtrail:GetTrailStatus",
        "cloudtrail:ListTags",
        "cloudtrail:LookupEvents",
        "iam:ListAccountAliases",
        "organizations:DescribeAccount",
        "organizations:ListAccounts",
        "s3:GetAccountPublicAccessBlock",
        "s3:ListAllMyBuckets",
        "s3:GetBucketAcl",
        "s3:GetBucketLocation",
        "s3:GetBucketLogging",
        "s3:GetBucketPolicy",
        "s3:GetBucketPolicyStatus",
        "s3:GetBucketPublicAccessBlock",
        "s3:GetBucketTagging",
        "s3:GetBucketVersioning",
        "s3:GetBucketWebsite",
        "s3:GetEncryptionConfiguration",
        "s3:GetLifecycleConfiguration",
        "s3:GetReplicationConfiguration",
        "s3:ListBucket",
        "s3:GetObject",
        "s3:GetObjectAcl",
        "s3:GetObjectTagging"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "cloudtrail:CreateTrail",
        "cloudtrail:StartLogging",
        "cloudtrail:StopLogging",
        "cloudtrail:UpdateTrail",
        "cloudtrail:DeleteTrail",
        "cloudtrail:PutEventSelectors"
      ],
      "Resource": "arn:aws:cloudtrail:*:*:trail/AWSMacieTrail-DO-NOT-EDIT"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:CreateBucket",
        "s3:DeleteBucket",
        "s3:DeleteBucketPolicy",
        "s3:DeleteBucketWebsite",
        "s3:DeleteObject",
        "s3:DeleteObjectTagging",
        "s3:DeleteObjectVersion",
        "s3:DeleteObjectVersionTagging",
        "s3:PutBucketPolicy"
      ],
      "Resource": [
        "arn:aws:s3:::awsmacie-*",
        "arn:aws:s3:::awsmacietrail-*",
        "arn:aws:s3:::*-awsmacietrail-*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup"
      ],
      "Resource": [
        "arn:aws:logs:*:*:log-group:/aws/macie/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogStreams"
      ],
      "Resource": [
        "arn:aws:logs:*:*:log-group:/aws/macie/*:log-stream:*"
      ]
    }
  ]
}

AWSServiceRoleForAmazonMacieの信頼関係

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "macie.amazonaws.com"
      },
      "Action": [
        "sts:AssumeRole"
      ]
    }
  ]
}

ジョブの作成はジョブ-ジョブを作成をクリックします。

ジョブを作成

まず、対象のS3バケットを選択します。先ほどテスト用ファイルをアップロードしたS3バケットを選択して、次へをクリックします。

対象のS3バケットを選択

対象のS3バケットを確認して、問題なければ次へをクリックします。

対象のS3バケットを確認

次にデータ検出オプションです。

今回は一回のみのジョブなので、ワンタイムジョブを選択して次へをクリックします。

データ検出オプション

次にマネージドデータ識別子オプションです。

今回は全てのマネージドデータ識別子を使用するので、Allのまま次へをクリックします。

マネージドデータ識別子オプション

次にカスタムデータ識別子の選択です。

今回はカスタムデータ識別子は使用しないので、そのまま次へをクリックします。

カスタムデータ識別子の選択

次に名前と説明の入力です。

ジョブの名前としてamazon-macie-testを入力して次へをクリックします。

名前と説明の入力

最後に設定内容の確認です。

問題がなければ送信をクリックします。

設定内容の確認

ジョブの作成は以上です。

検出結果の確認

10分ほど待つとジョブの実行が完了していました。

ジョブのJSONを確認すると以下のようになっていました。

{
  "clientToken": "0adeb9d9-e01c-42ed-923f-ecee801627f6",
  "createdAt": "2022-04-26T04:51:18.709Z",
  "customDataIdentifierIds": [],
  "description": null,
  "initialRun": false,
  "jobArn": "arn:aws:macie2:us-east-1:<AWSアカウントID>:classification-job/912a29dc5e7c4b72e5b25961555b4320",
  "jobId": "912a29dc5e7c4b72e5b25961555b4320",
  "jobStatus": "COMPLETE",
  "jobType": "ONE_TIME",
  "lastRunErrorStatus": {
    "code": "NONE"
  },
  "lastRunTime": "2022-04-26T04:51:23.990Z",
  "managedDataIdentifierSelector": "ALL",
  "name": "amazon-macie-test",
  "s3JobDefinition": {
    "bucketDefinitions": [
      {
        "accountId": "<AWSアカウントID>",
        "buckets": [
          "amazon-macie-test-20220426"
        ]
      }
    ],
    "scoping": {}
  },
  "samplingPercentage": 100,
  "statistics": {
    "approximateNumberOfObjectsToProcess": 0,
    "numberOfRuns": 1
  },
  "tags": {}
}

検出結果を確認すると、3件検出されていました。

  1. amazon-macie-test-20220426/HTTP_BASIC_AUTH_HEADER.txt : SensitiveData:S3Object/Credentials
  2. amazon-macie-test-20220426/JSON_WEB_TOKEN.txt : SensitiveData:S3Object/Credentials
  3. amazon-macie-test-20220426/HTTP_COOKIE.txt : SensitiveData:S3Object/Personal

検出結果の確認

今回追加されたマネージド識別子で検出されていそうですね。

詳細をそれぞれ確認していきます。

HTTP BASIC認証ヘッダー検出の詳細は以下の通りです。

HTTP BASIC認証ヘッダー検出の詳細

「認証情報 Http basic auth header」が2となっており、テストファイルに入力した2行どちらも検出されたことが分かります。

JWT検出の詳細は以下の通りです。

JWT検出の詳細

「認証情報 Json web token」が1となっており、テストファイルに入力した内容が検出されたことが分かります。

HTTP Cookie検出の詳細は以下の通りです。

HTTP Cookie検出の詳細

「個人情報 Http cookie」が2となっており、テストファイルに入力した2行どちらも検出されたことが分かります。

クレデンシャルの扱いには気をつけよう

Amazon MacieでHTTP BASIC認証ヘッダー / HTTP Cookie / JWTを検出できるようになったアップデートを紹介しました。

上手く活用すれば、「クレデンシャルがログに残ったまま運用がされていました」みたいなことを防げそうですね。

SecurityHubと連携させてアラートを飛ばすことも可能なので、Amazon Macieを使う場合はセットで使いたいです。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!