【Security Hub修復手順】[Lambda.1] Lambda 関数ポリシーでは、パブリックアクセスを禁止する必要があります。

2023.03.25

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

こんにちは!AWS事業本部のみなみです。

皆さん、お使いのAWS環境のセキュリティチェックはしていますか?

当エントリでは、AWS Security HubによるAWS環境のセキュリティ状況スコアリングに該当する項目についての修正手順をご紹介します。

本記事の対象コントロール

[Lambda.1] Lambda 関数ポリシーでは、パブリックアクセスを禁止する必要があります

[Lambda.1] Lambda function policies should prohibit public access

前提条件

本記事はAWS Security Hubで「AWS基礎セキュリティのベストプラクティススタンダード」を利用されている方向けの内容となります。
AWS Security Hubの詳細についてはこちらのブログをご覧ください。

対象コントロールの説明

Lambda関数はS3やEventBridgeなど様々なAWSサービスをトリガーとしてセットすることができます。その際にAWSサービスがLambda関数を実行する為に、リソースベースのポリシーを設定する必要があります。

リソースベースポリシーについては以下を参考下さい。

本コントロールではリソースベースポリシーがアカウントの外部からのパブリックアクセスを禁止していない場合に検知されます。 具体的にはAWS:SourceAccountに関する条件が含まれていない場合にコントロールは失敗します。

外部からのパブリックアクセスを禁止していない場合、外部からLambda関数を実行される可能性があります。

具体的に関しては以下で説明します。 マネジメントコンソールからトリガー設定をする場合、リソースベースポリシーが自動作成されます。
実際には以下のようなポリシードキュメントが設定されます。

{
  "Version": "2012-10-17",
  "Id": "default",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "s3.amazonaws.com"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:ap-northeast-1:1234567890:function:testLambda",
      "Condition": {
        "StringEquals": {
          "AWS:SourceAccount": "1234567890"
        },
        "ArnLike": {
          "AWS:SourceArn": "arn:aws:s3:::testbucket"
        }
      }
    }
  ]
}

自動作成されるポリシーではConditionsとして、AWS:SourceAccountAWS:SourceArn(呼び出し元のS3バケット)が設定される事でアクセス制御を行います。

一方AWS CLIやIacツールを使って構成管理をしている場合は、以下のようにAWS:SourceAccountを省略して設定することが可能です。

$ aws lambda add-permission \
    --function-name testLambda \
    --statement-id "s3-put-event" \
    --action "lambda:InvokeFunction" \
    --principal "s3.amazonaws.com" \
    --source-arn "arn:aws:s3:::testbucket"

この場合もAWS:SourceArnを指定している為、実行自体には問題はありません。

その後、S3バケットtestbucketだけを削除した場合を考えます。
もし攻撃者が同名のS3バケット(testbucket)を取得し、何らかの手段でLambda関数のARNを特定できた場合、AWS:SourceAccountが指定されていないためにLambda関数を実行できてしまうという状況が発生する可能性があります。

そのため、リソースベースポリシーでAWS:SourceAccountを指定することで、呼び出し元のAWSアカウント自体を制限でき、このような状況を回避することができます。

詳細に関してはこちらのブログを参照下さい。

修復手順

外部からのパブリックアクセスを禁止するために、Lambda関数のリソースベースポリシーにAWS:SourceAccount条件を追加することで修正できます。

マネジメントコンソールから修正する場合

Lambda関数の詳細ページを開き、「設定」→「アクセス権限」を開き、リソースベースのポリシーステートメントを確認します。

「ポリシー」の表示をクリックすることで、現在のポリシードキュメントが表示されます。

「編集」からポリシードキュメントの内容を変更することが可能です。ソースアカウントを入力して、保存をして下さい。

AWS CLIから修正する場合

以下コマンドを実行することで、現在設定されているリソースベースポリシーを取得することが可能です。

$ aws lambda get-policy --function-name <function-name>

add-permissionコマンドでは更新することは出来ない為、一度削除を行います。

$ aws lambda remove-permission --function-name <function-name> --statement-id <statement-id>

add-permissionコマンドを利用して再度設定を行います。

$ aws lambda add-permission \
    --function-name 関数名 \
    --statement-id "test" \
    --action "lambda:InvokeFunction" \
    --principal "s3.amazonaws.com" \
    --source-arn "arn:aws:s3:::testbucket" \
    --source-account "1234567890"

上記のコマンドを実行することで、以下のようなポリシーを設定することが可能です。

{
    "Version": "2012-10-17",
    "Id": "default",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": "s3.amazonaws.com"
            },
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:ap-northeast-1:1234567890:function:testLambda",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceAccount": "1234567890"
                },
                "ArnLike": {
                    "AWS:SourceArn": "arn:aws:s3:::testbucket"
                }
            }
        }
    ]
}

最後に

今回は、AWS Security HubによるAWS環境のセキュリティ状況スコアリングに該当する項目についての修正手順をご紹介しました。

コントロールを修正して、お使いのAWS環境のセキュリティをパワーアップさせましょう!

最後までお読みいただきありがとうございました!どなたかのお役に立てれば幸いです。

以上、みなみでした!