AWS_LAMBDA_SECURITY_NOTIFICATION への対応

# はじめに

もう少し皆さんも興味が湧くような内容を紹介していきたいと日々考えている [@\_\_\_nix___](https://twitter.com/___nix___) です。

今回もAWSからの通知でお悩みの方向けの記事です。

# 背景

<details><summary>AWSからの通知例</summary>
これは、2024 年 7 月 4 日の Lambda GetFunction API 認可の変更についてのご連絡のフォローアップで、お客様の対応が必要となる場合があります。この変更の実施は、以前にお知らせした 2024 年 7 月 27 日から 2024 年 10 月 2 日に延期されました。また、お客様に確認と必要な変更の時間を設けるため、お客様のアカウントを 2024 年 XX 月 XX 日まで例外リストに追加しました。 以前は、ListTags API を明示的に使用する場合にのみ ListTags に対する権限が必要でした。しかし、GetFunction API 権限を持つプリンシパルは、ListTags API が明示的に拒否されている場合でも、GetFunction 呼び出しによって出力されたタグ情報にアクセスできました。2024 年 10 月 2 日以降、Lambda は GetFunction API を呼び出すプリンシパルに ListTags API に対する明示的な許可権限が設定されたポリシーがある場合にのみタグデータを返すようになります。GetFunction API を呼び出すロールに ListTags API への拒否ポリシーがあるか、アクセスを明示的に許可するポリシーがない場合、Lambda は GetFunction API 呼び出しへの応答でタグデータを返しません。
</details>

AWS は、2024年10月2日より Lambda サービスの GetFunction API の動作に重要な変更を実施します。この変更は、セキュリティとアクセス制御の強化を目的としており、特に Lambda 関数のタグ情報へのアクセスに影響を与えます。

従来、GetFunction API を呼び出す権限を持つエンティティは、明示的な拒否がない限り、関数のタグ情報も取得できました。しかし、この変更により、タグ情報を取得するためには明示的な ListTags API へのアクセス権限が必要となります。

:::note alert
記事中の日時はAWSアカウント毎に異なる場合があるのでそれぞれの通知内容をご確認ください。
:::

# 概要

変更の主なポイントは以下の通りです：

1. GetFunction API の動作変更：
   - 変更前：GetFunction 呼び出しで自動的にタグ情報が返される
   - 変更後：タグ情報を取得するには、明示的な ListTags 権限が必要

2. 影響を受ける可能性のあるシステム：
   - Lambda 関数のタグ情報を利用しているアプリケーション
   - CI/CD パイプライン
   - タグベースのリソース管理や課金分析ツール

3. 重要な日程：
   - 変更実施日：2024年10月2日
   - 猶予期間終了：2024年XX月XX日

# 調査

## 調査方法

GetFunction API を使用しているエンティティを特定するため、以下のコマンドを使用して CloudTrail ログを分析します：

```bash
aws cloudtrail lookup-events \
--lookup-attributes AttributeKey=EventName,AttributeValue=GetFunction \
--start-time YYYY-MM-DDThh:ii:ssZ \
--end-time YYYY-MM-DDThh:ii:ssZ \
--query 'Events[*].CloudTrailEvent' \
--output json | jq -r '.[]' | jq -r | grep userName | sort | uniq
```

:::note info
ログの調査期間は皆さんの運用に合わせてください。
:::

このコマンドは、指定期間内に GetFunction API を呼び出した IAM ユーザーと IAM ロールのリストを返します。

## レスポンスの解釈

結果は以下のようなフォーマットで返されます：

```
    "userName": "hoge-iam-user",
        "userName": "hoge-role"
        "userName": "fuga-assume-role"
    "userName": "fuga-iam-user",
    ...
```

- インデントが1つのエントリは IAM ロールを示します。
- インデントが2つのエントリは IAM ユーザーを示します。

# 対応

調査結果に基づいて、以下の手順で対応を行います：

1. 権限の確認：
   特定された各 IAM ユーザーと IAM ロールについて、現在の権限設定を確認します。

   IAMユーザーの場合：
   ```bash
   aws iam get-user-policy --user-name USER_NAME --policy-name POLICY_NAME
   ```

   IAMロールの場合：
   ```bash
   aws iam get-role-policy --role-name ROLE_NAME --policy-name POLICY_NAME
   ```

   または、AWS Management Console の IAM セクションで該当するユーザーやロールのポリシーを直接確認することもできます。

2. 必要な ListTags 権限：
   確認の結果、ListTags 権限が付与されていない場合は、以下のようなポリシーステートメントが必要です：

   ```json
   {
       "Effect": "Allow",
       "Action": "lambda:ListTags",
       "Resource": "arn:aws:lambda:region:account-id:function:*"
   }
   ```

   注意: 
   - セキュリティのベストプラクティスに従い、必要最小限の権限のみを付与してください。
   - 可能であれば、`*` の代わりに特定の Lambda 関数の ARN を指定することを検討してください。

これらの手順に従って権限を確認し、必要に応じて ListTags 権限を追加することで、2024年10月2日以降の GetFunction API の変更に適切に対応することができます。権限の更新後は、影響を受ける可能性のあるアプリケーションやプロセスが正常に機能することを確認してください。

# 終わりに

CloudTrail からの調査ですと Event 詳細が json では無く文字列となるので少し見た目の良く無いコマンドでの調査方法をご紹介しました。

もっと良い調査方法がある方は是非教えてくださいませ。

# 一言

この記事良かったと少しでも思って頂けたら是非 [@\_\_\_nix___](https://twitter.com/___nix___) をフォローしてあげてください。或いは記事に対してリアクションをお願い致します。