Lambda 関数 URL におけるセキュリティと認証モデル - AWS Lambda

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Lambda 関数 URL におけるセキュリティと認証モデル

特定の関数にアタッチされたリソースベースのポリシーに、AuthType パラメータを組み合わせて使用することで、Lambda 関数 URL へのアクセスを制御できます。これら 2 つのコンポーネントの設定によって、関数 URL のために他の管理アクションを呼び出したり実行できるユーザーを指定します。

AuthType パラメーターは、関数 URL へのリクエストを Lambda が認証または承認する方法を決定します。関数 URL を設定する場合は、以下の AuthType オプションのいずれかを指定する必要があります。

  • AWS_IAM – Lambda では、AWS Identity and Access Management (IAM) を使用して、IAM プリンシパルの ID ポリシーと関数のリソースベースのポリシーに基づいて、リクエストを認証および承認します。関数 URL を使用しての関数呼び出しを、認証済みユーザーとロールのみに制限する場合は、このオプションを選択します。

  • NONE – Lambda では、関数を呼び出す前の認証を実行しません。ただし、関数のリソースベースのポリシーは常に有効であり、関数 URL がリクエストを受信できるようにするには、パブリックアクセスを許可する必要があります。関数 URL への、未認証でパブリックなアクセスを許可するには、このオプションを選択します。

関数を呼び出そうとする他の AWS アカウント に対しては、AuthType だけではなくリソースベースのポリシーを使用することでも、アクセス許可を付与することができます。詳しくは、「Lambda でのリソースベースのポリシーの使用」を参照してください。

セキュリティに関するさらなるインサイトを得るには、AWS Identity and Access Management Access Analyzer 使用して、関数 URL への外部アクセスの包括的な分析を取得します。IAM Access Analyzer は、Lambda 関数における新規または更新済みのアクセス許可を監視し、パブリックおよびクロスアカウントのアクセスのために付与する許可を特定するのに役立ちます。すべての AWS のお客様は、IAM Access Analyzer を無料で利用できます。IAM Access Analyzer の使用開始方法については、「AWS IAM Access Analyzer を使用する」を参照してください。

このページには、両方の認証タイプのリソースベースのポリシーの例と、 AddPermission API オペレーションまたは Lambda コンソールを使用してこれらのポリシーを作成する方法が含まれています。アクセス許可の設定後に関数 URL を呼び出す方法については、「Lambda 関数 URL の呼び出し」を参照してください。

AWS_IAM 認証タイプの使用

AWS_IAM 認証タイプが選択されている場合は、Lambda 関数 URL を呼び出す必要のあるユーザーには、lambda:InvokeFunctionUrl アクセス許可が付与されている必要があります。呼び出しリクエストを実行するユーザーによっては、このアクセス許可を付与するために、リソースベースのポリシーを使用することが必要になります。

リクエストを実行するプリンシパルが関数 URL と同じ AWS アカウント 内にある場合、このプリンシパルには、アイデンティティベースのポリシー内に lambda:InvokeFunctionUrl のアクセス許可があるか、または、関数のリソースベースのポリシー内でアクセス許可が付与されているか、そのどちらかが必要です。つまり、既にユーザーがアイデンティティベースのポリシー内にアクセス許可 lambda:InvokeFunctionUrl を持っている場合は、リソースベースのポリシーはオプションです。ポリシー評価は、「Determining whether a request is allowed or denied within an account」(アカウント内のリクエストの許可または拒否の決定) で説明されているルールに従います。

リクエストを行うプリンシパルが別のアカウントにある場合、そのプリンシパルには、アクセス許可 lambda:InvokeFunctionUrl を付与する ID ベースのポリシーがあること、および、呼び出そうとしている関数のためのリソースベースのポリシー内でアクセス許可が付与されていること、その両方が必要となります。これらクロスアカウントのケースでのポリシー評価は、「Determining whether a cross-account request is allowed」(クロスアカウントリクエスト許可されているかどうかの確認) で説明されているルールに従います。

次に示す、クロスアカウントでのインタラクション用のリソースベースのポリシー例では、AWS アカウント 444455556666 内で、example ロールに対し関数 my-function に関連付けられた関数 URL を呼び出すことを許可しています。

例 関数 URL のクロスアカウント呼び出しポリシー
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::444455556666:role/example" }, "Action": "lambda:InvokeFunctionUrl", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:my-function", "Condition": { "StringEquals": { "lambda:FunctionUrlAuthType": "AWS_IAM" } } } ] }

このポリシーステートメントは、以下の手順に従いコンソールから作成できます。

別のアカウントに URL の呼び出し許可を付与するには (コンソール)
  1. Lambda コンソールの関数ページを開きます。

  2. URL での呼び出し許可を付与する関数の名前を選択します。

  3. [Configuration] (設定) タブを開き、次に [Permissions] (アクセス許可) をクリックします。

  4. [Resource-based policy] (リソースベースのポリシー) で、[Add permissions] (アクセス許可を追加) をクリックします。

  5. [Function URL] (関数 URL) をクリックします。

  6. [Auth Type] (認証タイプ) で [AWS_IAM] を選択します。

  7. (オプション) [ステートメント ID]で、ポリシーステートメントのステートメント ID を入力します。

  8. [プリンシパル] には、アカウント ID または許可の付与先となるユーザーまたはロールの Amazon リソースネーム (ARN) を入力します。例えば、444455556666 などです。

  9. [保存] を選択します。

または、次の add-permission AWS Command Line Interface (AWS CLI) コマンド 使用して、このポリシーステートメントを作成することもできます。

aws lambda add-permission --function-name my-function \ --statement-id example0-cross-account-statement \ --action lambda:InvokeFunctionUrl \ --principal 444455556666 \ --function-url-auth-type AWS_IAM

前の例では、条件キー lambda:FunctionUrlAuthType の値は AWS_IAM です。このポリシーでは、関数 URL の認証タイプも AWS_IAM である場合にのみアクセスを許可します。

NONE 認証タイプの使用

重要

関数 URL の認証タイプが NONE で、リソースベースのポリシーでパブリックアクセスを許可している場合には、認証されていないすべてのユーザーが、関数 URL を使用して関数を呼び出すことができます。

場合によると、関数 URL の公開が必要な場合もあります。例えば、ウェブブラウザから直接行われたリクエストを処理する場合などです。関数 URL へのパブリックアクセスを許可するには、認証タイプに NONE を選択します

NONE の認証タイプを選択すると、Lambda は関数 URL へのリクエストに対して IAM による認証を行いません。この場合でも、依然としてユーザーには、関数 URL を正常に呼び出すためのアクセス許可 lambda:InvokeFunctionUrl が必要です。アクセス許可 lambda:InvokeFunctionUrl は、以下のリソースベースのポリシーを使用して付与することが可能です。

例 すべての認証されていないプリンシパル向けの関数 URL 呼び出しポリシー
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "lambda:InvokeFunctionUrl", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:my-function", "Condition": { "StringEquals": { "lambda:FunctionUrlAuthType": "NONE" } } } ] }
注記

コンソール経由または AWS Serverless Application Model (AWS SAM) を使用し、認証タイプ NONE の関数 URL を作成すると、Lambda は上記のリソースベースのポリシーステートメントを自動的に作成します。ポリシーがすでに存在する場合、またはアプリケーションを作成しているユーザーまたはロールに適切なアクセス権限がない場合、Lambda はポリシーを作成しません。AWS CLI、AWS CloudFormation、または Lambda API を直接使用している場合には、lambda:InvokeFunctionUrl のアクセス許可を手作業で追加する必要があります。これにより、関数はパブリックになります。

さらに、認証タイプ NONE で関数 URL を削除した場合、Lambda では、関連するリソースベースのポリシーが自動的に削除されません。このポリシーを削除する場合は、手動で削除する必要があります。

このステートメントでは、条件キー lambda:FunctionUrlAuthType の値は NONE です。このポリシーステートメントは、関数 URL の認証タイプも NONE である場合にのみアクセスを許可します。

関数のリソースベースのポリシーがアクセス許可 lambda:invokeFunctionUrl を付与していない場合、関数 URL の呼び出しを試みたユーザーは 403 Forbidden エラーコードを受け取ります。これは、関数 URL の認証タイプが NONE の場合も発生します。

ガバナンスとアクセスコントロール

関数 URL の呼び出しに関するアクセス許可に加えて、関数 URL の設定に使用するアクションによってもアクセス制御が可能です。Lambda では、関数 URL に対して次の IAM ポリシーアクションがサポートされます。

  • lambda:InvokeFunctionUrl – 関数 URL を使用して Lambda 関数を呼び出します。

  • lambda:CreateFunctionUrlConfig – 関数 URL を作成し、その AuthType を設定します。

  • lambda:UpdateFunctionUrlConfig – 関数 URL 設定とその AuthType を更新します。

  • lambda:GetFunctionUrlConfig – 関数 URL の詳細を表示します。

  • lambda:ListFunctionUrlConfigs – 関数 URL 設定内容を一覧表示します。

  • lambda:DeleteFunctionUrlConfig – 関数 URL を削除します。

注記

Lambda コンソールは、lambda:InvokeFunctionUrl に対するアクセス許可の追加のみをサポートしています。その他のすべてのアクションについては、アクセス許可の追加に Lambda API か AWS CLI を使用する必要があります。

他の AWS エンティティに対し、関数 URL によるアクセスを許可または拒否するには、IAM ポリシーにこれらのアクションを含めます。例えば、次のポリシーでは、AWS アカウント 444455556666 内にある example ロールに対し、アカウント 123456789012 にある関数 my-function の関数 URL を更新するためのアクセス許可を付与しています

例 クロスアカウント関数 URL のポリシー
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::444455556666:role/example" }, "Action": "lambda:UpdateFunctionUrlConfig", "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function" } ] }

条件キー

関数 URL に対しきめ細かなアクセス制御を行うには、条件キーを使用します。Lambda では、関数 URL に対して 1 つの追加的な条件キー FunctionUrlAuthType をサポートしています。FunctionUrlAuthType キーは、関数 URL が使用する認証タイプを記述するための列挙値を定義します。この値は AWS_IAM または NONE となります。

この条件キーは、関数に関連付けられたポリシーの中で使用できます。例えば、関数 URL の構成を変更できるユーザーを制限したい場合があります。URL 認証タイプに NONE を使用する任意の関数に対して、すべての UpdateFunctionUrlConfig リクエストを拒否するには、次のポリシーを定義します。

例 明示的な拒否を行う関数 URL ポリシー
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action":[ "lambda:UpdateFunctionUrlConfig" ], "Resource": "arn:aws:lambda:us-east-1:123456789012:function:*", "Condition": { "StringEquals": { "lambda:FunctionUrlAuthType": "NONE" } } } ] }

AWS アカウント 444455556666example ロールに、URL 認証タイプ AWS_IAM を使用する関数に対して CreateFunctionUrlConfig および UpdateFunctionUrlConfig リクエストを許可するには、次のポリシーを定義できます。

例 明示的な許可を行う関数 URL ポリシー
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::444455556666:role/example" }, "Action":[ "lambda:CreateFunctionUrlConfig", "lambda:UpdateFunctionUrlConfig" ], "Resource": "arn:aws:lambda:us-east-1:123456789012:function:*", "Condition": { "StringEquals": { "lambda:FunctionUrlAuthType": "AWS_IAM" } } } ] }

また、この条件キーをサービスコントロールポリシー (SCP) で使用することもできます。SCP は、AWS Organizations にある組織全体でアクセス許可を管理する際に使用します。例えば、認証タイプに AWS_IAM を使用していない関数 URL を作成または更新することを、ユーザーに対し拒否するには、次のサービスコントロールポリシーを使用します。

例 明示的な拒否を行う関数 URL SCP
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action":[ "lambda:CreateFunctionUrlConfig", "lambda:UpdateFunctionUrlConfig" ], "Resource": "arn:aws:lambda:*:123456789012:function:*", "Condition": { "StringNotEquals": { "lambda:FunctionUrlAuthType": "AWS_IAM" } } } ] }