🤔

急に "Lambda security notification" って何ですか!?

2024/07/08に公開

はじめに

もう半年以上、バーストし続けてメンタルクレジットが枯渇気味の @___nix___ です。

さて、AWS Health Dashboard の通知を Chatbot 経由で Slack に送信していたり、或いはメールで次のような案内があったと思います。(AWSアカウントを多く持っているとスパムのように大量に届くのですよね...)

AWS Health - AWS_LAMBDA_SECURITY_NOTIFICATION

Lambda GetFunction API の認証に変更に際し、お客様のアクションが必要になる可能性があるため、ご連絡しております。 これまで、ListTags API を明示的に使用する場合にのみ、ListTags への権限が必要でした。しかし、GetFunction API 権限を持つプリンシパルにおいても、GetFunction 呼び出しにより出力されたタグ情報にはアクセスできました。2024 年 7 月 27 日以降、Lambda は GetFunction API を呼び出すプリンシパルに ListTags API に対する明示的な許可権限が設定されたポリシーがある場合にのみタグデータを返すようになります。GetFunction API を呼び出すロールに対して、拒否ポリシーが設定されているか、ListTags API へのアクセスを明示的に許可するポリシーがない場合、Lambda は GetFunction API 呼び出しへの応答でタグデータを返さなくなります。 お客様のアカウントには、GetFunction API へのアクセスを許可するロールがあることを確認しましたが、そのポリシーでは ListTags API へのアクセスが許可されていません。引き続き GetFunction API を使用してタグデータを受信する場合は、GetFunction API を呼び出すために使用される AWS Identity and Access Management (IAM) ロールに、明示的な「ListTags API のアクセス許可」をするポリシーを追加する必要があります。Lambda リソースでタグを使用するために必要な権限については、ユーザーガイド[1]の「タグの操作に必要なアクセス許可」を参照してください。 確認と必要な変更を行う期間を確保するため、2024 年 9 月 1 日まで、お客様のアカウントを許可リストに追加しました。この日以降、GetFunction API の呼び出し時に、呼び出し元がListTags API へのアクセスを明示的に許可されている場合にのみ、タグデータが返されます。呼び出し元が ListTags へのアクセスを許可されていないか、拒否されている場合、GetFunction API はタグデータを除いた関数の設定を返します。また、メッセージには新しい TagsError オブジェクトが含まれ、タグデータを返さない理由が示されます。 既存のユーザーに不足している権限を追加する方法については、ユーザーガイド [2] の「IAM ID のアクセス許可の追加および削除」を参照してください。 確認と更新により多くの期間を要する場合、および、その他ご不明点がある場合には、AWS サポート [3] にお問い合わせください。
[1] https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-tags.html#permissions-required-for-working-with-tags-cli
[2] https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_manage-attach-detach.html
[3] https://aws.amazon.com/support

背景

従来、GetFunction APIを使用してLambda関数の情報を取得する際、ListTags APIに対する明示的な許可がなくても、関数に付与されたタグ情報を含めて取得することができました。しかし、セキュリティ強化の一環として、AWSはGetFunction APIの認証を強化し、タグ情報へのアクセスにはListTags APIに対する明示的な許可を必須とするように変更しました。

この変更により、GetFunction APIを利用するユーザーやロールは、ListTags APIの実行権限を持つIAMポリシーを明示的に設定する必要が生じます。設定を行わない場合、2024年9月1日以降はGetFunction APIでタグ情報を取得することができなくなります。

概要

AWS LambdaのGetFunction APIを利用してLambda関数に関する情報を取得する際、これまで暗黙的に許可されていたタグ情報へのアクセスが、2024年9月1日より明示的な許可が必要になります。これは、Lambda GetFunction APIの認証が強化され、よりセキュアなアクセス制御が求められるようになることを意味します。

何をすれば良いの?

大きく分けると次の2つです。

(1) AWS Lambda が GetFunction API を利用しているか?

Lambda関数のコードを追うのも良いでしょう。
ただ、全てのLambda関数のコードを追うのは現実的ではありませんので今回は CloudTrail のイベントログから探してみましょう。

探す為の ShellScript を作成しましたので CloudShell 等で実行します。

#!/bin/bash

for region in $(aws ec2 describe-regions --query 'Regions[*].RegionName' --output text); do
  echo "Searching for Lambda GetFunction in $region"
  aws cloudtrail lookup-events \
  --region "$region" \
  --lookup-attributes AttributeKey=EventName,AttributeValue=GetFunction \
  --output json | \
  jq '.Events[] | select(.EventSource == "lambda.amazonaws.com") | 
    {EventTime, Username, EventSource, ResourceName: .Resources[0].ResourceName}' | \
  jq -s '.'
done

以下のように結果が空([])であれば問題ありません。この Qiita の記事を閉じて貰って構いません。
もし結果が返ってくるようなら Yes なので(2)の対応へ進みましょう。

Searching for Lambda GetFunction in ap-south-1
[]
Searching for Lambda GetFunction in eu-north-1
[]
Searching for Lambda GetFunction in eu-west-3
[]
Searching for Lambda GetFunction in eu-west-2
[]
...

(2) (1) が Yes だった場合

つまり GetFunction を使ってる(レアな)Lambda関数が見つかった場合は実行ロールに次のようなポリシーを追加してあげましょう。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:ListTags",
            "Resource": "arn:aws:lambda:<region>:<account-id>:<function:function-name>"
        }
    ]
}

以上です。

おわりに

AWS が騒いだ割にはそれ程対応に時間が掛からなかったわけですが、例えば全リージョンのチェックはウザいなと思う方は for の部分を以下と差し替えてみてください。

regions=("ap-northeast-1" "us-west-2" "us-east-1")
for region in "${regions[@]}"; do

これで3つのリージョンに絞ってチェックすることができます。

一言

インフラの方であれば「AWSからこんな通知が届いたんだけどウチは大丈夫??」と相談を受けることもあるでしょう。

これを使って ( ー`дー´)キリッ と対応して評価を上げましょう。(上がるのか?)

久しぶりに書いた記事が軽めですみません。
今後も時間があれば少しずつでも前進していけるように頑張りますん。

Discussion