

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Lambda Web 函數端點存取控制
<a name="web-functions-endpoint-access-control"></a>

您可以使用`AuthType`您在每個端點上設定的 來控制對 AWS Lambda Web 函數端點的存取。根據身分驗證類型，您也可以將資源型政策連接至 Web 函數，以控制誰可以叫用端點。

設定端點時，您可以指定下列其中一個`AuthType`選項：

`IamAuth`  
使用此身分驗證類型時，Lambda 會使用 AWS Identity and Access Management (IAM) 根據發起人的身分政策和 Web 函數的資源型政策來驗證和授權請求。發起人會直接使用 AWS Signature 第 4 版 (SigV4) 或 Signature 第 4a 版 (SigV4a) 為`MultiRegion`端點簽署請求，或者使用 Amazon CloudFront AWS 服務 等在端點前面代表他們簽署請求 （請參閱 [CloudFront 整合](#web-functions-endpoint-access-control-cloudfront))。如果您希望 Lambda 在端點上強制執行 IAM 型存取控制，請選擇此選項。

`ApplicationManaged`  
Lambda 不會驗證或授權請求。每個請求都會到達您的函數，而您的函數程式碼會負責任何身分驗證。針對公有端點或在您自己的程式碼中處理身分驗證時，選擇此選項。

叫用端點的 IAM 動作是 `lambda:InvokeWebFunctionEndpoint`。

您可以在建立端點 (`create-web-function-endpoint`) 時，使用 `--auth-type` 參數設定端點的身分驗證類型，之後可以使用 進行變更`update-web-function-endpoint`。如需建立命令，請參閱 [建立端點](web-functions-endpoints.md#web-functions-endpoint-create)。如需您可以變更的屬性，請參閱 [更新端點](web-functions-endpoints.md#web-functions-endpoint-update)。

## 使用`IamAuth`身分驗證類型
<a name="web-functions-endpoint-access-control-iam"></a>

如果您選擇`IamAuth`身分驗證類型，呼叫者必須使用 SigV4 (`MultiRegion`端點的 SigV4a) 簽署每個請求，並且必須允許 叫用端點。根據提出請求的人員，您可以使用 Web 函數上的資源型政策、發起人上的身分型政策或兩者來授予此許可。

如果呼叫者與 Web 函數 AWS 帳戶 位於相同位置，則可以`lambda:InvokeWebFunctionEndpoint`透過身分型政策或函數的資源型政策來授予呼叫者。如果發起人位於不同的 帳戶中，他們需要以身分為基礎的政策來授予 動作，以及在 函數上以資源為基礎的政策來允許他們。

以資源為基礎的政策會連接到 Web 函數，但每個陳述式都可以將 範圍`Resource`限定在特定端點 ARN。下列資源型政策允許 帳戶中`InvokeRole`的角色`222233334444`叫用 的`prod`端點`my-function`：

**Example 跨帳戶資源型政策**  

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::222233334444:role/InvokeRole"
            },
            "Action": "lambda:InvokeWebFunctionEndpoint",
            "Resource": "arn:aws:lambda:us-east-1:111122223333:web-function/my-function/endpoint/prod"
        }
    ]
}
```

若要連接以資源為基礎的政策，請使用 `put-resource-policy`搭配 函數 ARN （而非端點 ARN)：

```
aws lambda-web put-resource-policy \
    --resource-arn "arn:aws:lambda:us-east-1:111122223333:web-function/my-function" \
    --policy file://policy.json \
    --region us-east-1
```

您可以使用 `get-resource-policy`和 檢閱或移除政策`delete-resource-policy`。

Web 函數有一個以資源為基礎的政策，並予以`put-resource-policy`取代。若要新增陳述式，例如 中的 CloudFront 陳述式[CloudFront 整合](#web-functions-endpoint-access-control-cloudfront)、使用 取得目前的政策`get-resource-policy`、將陳述式新增至其`Statement`陣列，以及`revisionId`使用 傳遞傳回的 `--revision-id`。如果有人在您讀取政策後變更政策，請求會失敗，`ConflictException`而不會覆寫其變更。

若要允許叫用函數的所有端點，請在資源 ARN 中使用萬用字元：

```
"Resource": "arn:aws:lambda:{{us-east-1}}:{{111122223333}}:web-function/{{my-function}}/endpoint/*"
```

將區域、帳戶 ID 和函數名稱取代為您自己的值。在最後保留 `endpoint/*` 。

### 將調用許可授予委託人
<a name="web-functions-endpoint-access-control-iam-grant"></a>

呼叫者需要`lambda:InvokeWebFunctionEndpoint`叫用端點。對於與 Web 函數相同帳戶中的發起人，在發起人以身分為基礎的政策中授予此動作已足夠。不需要以資源為基礎的政策。對於不同帳戶中的發起人，除了允許它們的 函數上的資源型政策之外，還需要此身分型政策。

將下列政策連接至將叫用端點的 IAM 角色或使用者：

**Example 用於叫用端點的身分型政策**  

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeWebFunctionEndpoint",
            "Resource": "arn:aws:lambda:us-east-1:111122223333:web-function/my-function/endpoint/prod"
        }
    ]
}
```

### 簽署請求
<a name="web-functions-endpoint-access-control-signing"></a>

Lambda 不提供呼叫端點的專用 SDK。您可以使用服務名稱 傳送標準 HTTP 請求，並使用 SigV4 或 SigV4a 自行簽署`lambda`。注意下列事項：
+ 每個已簽署的請求都必須包含 `X-Amz-Content-SHA256`標頭，包括沒有內文的請求。Lambda 驗證簽章時不會讀取請求內文，因此使用此標頭值做為承載雜湊。沒有請求的請求會遭到 拒絕`403 Forbidden`。
+ 如果您未簽署內文 （例如，串流時），請使用 的常值`UNSIGNED-PAYLOAD``X-Amz-Content-SHA256`。Lambda 不支援區塊式內文簽署。
+ Lambda 不會針對 `X-Amz-Content-SHA256`值檢查請求內文。簽章涵蓋標頭值，而非內文內容。如果您需要 TLS 以外的身體完整性保護，請在應用程式中實作。
+ 區域端點 (`HomeRegion`、`PerRegion`) 使用 SigV4 搭配端點的區域。 `MultiRegion`端點使用 AWS Signature 第 4a 版 (SigV4a)，該版本會簽署一組區域而非一個區域。使用區域集 `*`。
+ 如果`IamAuth`請求傳回 `403 Forbidden`，請檢查請求是否使用 SigV4 （或 SigV4a) 簽署、包含 `X-Amz-Content-SHA256`標頭，並使用未過期的登入資料，以及您的政策是否允許`lambda:InvokeWebFunctionEndpoint`端點 ARN。

如需簽署請求的詳細資訊，請參閱[簽署 AWS API 請求](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html)。

在 Lambda 驗證 SigV4 或 SigV4a 簽章之後，它會先移除 `Authorization`標頭，再將請求轉送到您的函數。如果您希望函數在`IamAuth`端點上接收 `Authorization`標頭，請透過 CloudFront 傳送請求，該 CloudFront 會代表您簽署這些請求 （請參閱 [CloudFront 整合](#web-functions-endpoint-access-control-cloudfront))。

### CloudFront 整合
<a name="web-functions-endpoint-access-control-cloudfront"></a>

您可以使用 Amazon CloudFront 原始存取控制 (OAC)，將 CloudFront 分佈放在`IamAuth`端點前面。使用 OAC，CloudFront 會代表檢視器簽署每個原始伺服器請求，因此呼叫者不會自行簽署請求。CloudFront 不會使用 `Authorization`標頭來簽署原始伺服器請求，因此可以將`Authorization`標頭傳遞至 函數。

Lambda 會移除本身為 AWS 簽章的任何`Authorization`值 （以 開頭的值`AWS4-`)。這可讓您在 CloudFront 簽署每個原始伺服器請求時保留應用程式的身分驗證 （例如 JWT 或 Cookie)。若要執行此作業，請將 分佈設定為轉送 `Authorization`標頭。如需詳細資訊，請參閱[限制對 AWS 原始伺服器的存取](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-origin.html)。

端點網域仍可在網際網路上存取，Lambda 也接受來自政策允許之任何主體的直接簽署請求。

這需要端點的身分驗證類型為 `IamAuth`。使用原始伺服器類型 `lambda`和簽署行為 建立原始伺服器存取控制`always-amz-auth`。CloudFront 拒絕 Web 函數原始伺服器的其他簽署行為。

**注意**  
Lambda 不會驗證對`ApplicationManaged`端點的請求，也不會評估 Web 函數的資源型政策。即使在 CloudFront 後方，這類端點仍可在自己的網域上公開連線。

若要允許 CloudFront 叫用端點，請將資源型政策連接至 Web 函數，以授予 CloudFront 服務主體 (`cloudfront.amazonaws.com`) 該`lambda:InvokeWebFunctionEndpoint`動作。使用 `aws:SourceArn`條件只允許您的特定分佈：

**Example CloudFront OAC 的資源型政策**  

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowCloudFrontOACAccess",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudfront.amazonaws.com"
            },
            "Action": "lambda:InvokeWebFunctionEndpoint",
            "Resource": "arn:aws:lambda:us-east-1:111122223333:web-function/my-function/endpoint/prod",
            "Condition": {
                "StringEquals": {
                    "aws:SourceArn": "arn:aws:cloudfront::111122223333:distribution/<distribution-id>"
                }
            }
        }
    ]
}
```

## 使用`ApplicationManaged`身分驗證類型
<a name="web-functions-endpoint-access-control-appmanaged"></a>

當端點的身分驗證類型為 時`ApplicationManaged`，具有端點網域的任何人都可以叫用您的 函數。Lambda 不會執行身分驗證或授權。

選擇您希望端點可公開連線`ApplicationManaged`的時間，例如，直接從 Web 瀏覽器提供請求。您也可以在自己的程式碼中處理身分驗證時加以選擇，例如 OAuth 2.0、OpenID Connect 或自訂權杖配置。

使用此身分驗證類型：
+ Lambda 允許所有呼叫者叫用端點。它不會評估這些請求的資源型政策。
+ Lambda 會將發起人的`Authorization`標頭轉送到您的函數，以便您的程式碼可以驗證它。如果 標頭包含 AWS Signature 第 4 版 (SigV4) 簽章，Lambda 會將其與任何 `X-Amz-Security-Token` 標頭一起移除，以便 AWS 登入資料不會傳遞到您的函數程式碼。
+ 您的函數負責所有身分驗證和授權。

**注意**  
對於`ApplicationManaged`端點，Lambda 不會評估 Web 函數的資源型政策來叫用請求。您無法使用資源型政策來限制誰叫用`ApplicationManaged`端點。若要限制調用，請`IamAuth`改用 。以資源為基礎的政策仍然適用於管理動作。例如，它可以授予另一個帳戶更新端點的許可。如需詳細資訊，請參閱[資源型政策](web-functions-permissions.md#web-functions-permissions-resource-policy)。

## 控管和存取權控制
<a name="web-functions-endpoint-access-control-governance"></a>

您可以控制誰可以設定端點。

Lambda 支援下列 IAM 動作來管理端點：
+ `lambda:CreateWebFunction` – 建立 Web 函數並設定其初始端點，包括其 `AuthType`。
+ `lambda:CreateWebFunctionEndpoint` – 建立端點並設定其 `AuthType`。
+ `lambda:UpdateWebFunctionEndpoint` – 更新端點，包括其 `AuthType`。
+ `lambda:GetWebFunctionEndpoint` – 檢視端點的組態。
+ `lambda:ListWebFunctionEndpoints` – 列出 Web 函數的端點。
+ `lambda:DeleteWebFunctionEndpoint` – 刪除端點。

若要根據身分驗證類型允許或拒絕動作，請使用 條件金鑰。 `lambda:Request/WebFunctionAuthType`適用於 `CreateWebFunction`、 `CreateWebFunctionEndpoint`和 `UpdateWebFunctionEndpoint`。 `lambda:Resource/WebFunctionAuthType` 適用於 `InvokeWebFunctionEndpoint`(`IamAuth`端點）`UpdateWebFunctionEndpoint`、、 `GetWebFunctionEndpoint`和 `DeleteWebFunctionEndpoint`。如需詳細資訊，請參閱[條件索引鍵](#web-functions-endpoint-access-control-condition-keys)。

### 限制組織中的公有端點
<a name="web-functions-endpoint-access-control-scp"></a>

如果您管理 AWS 組織，並想要防止開發人員建立公有端點，請使用服務控制政策 (SCP)，拒絕使用`ApplicationManaged`身分驗證類型建立或更新端點。使用 `lambda:Request/WebFunctionAuthType`條件索引鍵，反映請求中的身分驗證類型：

**Example SCP 拒絕公有端點**  

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "lambda:CreateWebFunction",
                "lambda:CreateWebFunctionEndpoint",
                "lambda:UpdateWebFunctionEndpoint"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "lambda:Request/WebFunctionAuthType": "ApplicationManaged"
                }
            }
        }
    ]
}
```

政策包含 ，`lambda:CreateWebFunction`因為該操作會從請求的 建立初始端點`endpointConfig`。制定此政策後，除非開發人員新增 ，否則 `aws lambda-web deploy`會失敗並出現存取遭拒錯誤`--auth-type IamAuth`。根據預設， 命令會建立`ApplicationManaged`端點。

### 條件索引鍵
<a name="web-functions-endpoint-access-control-condition-keys"></a>

對於精細存取控制，Lambda 支援下列條件內容索引鍵：
+ `lambda:Request/WebFunctionAuthType` – 請求中指定的身分驗證類型。在 `CreateWebFunction`、 `CreateWebFunctionEndpoint`和 期間可用`UpdateWebFunctionEndpoint`。使用它來控制可以設定的身分驗證類型。
+ `lambda:Resource/WebFunctionAuthType` – 目前在端點上設定的身分驗證類型，其值為 `IamAuth`和 `ApplicationManaged`。在 `InvokeWebFunctionEndpoint`、`DeleteWebFunctionEndpoint`、 `UpdateWebFunctionEndpoint`和 期間可用`GetWebFunctionEndpoint`。對於 `InvokeWebFunctionEndpoint`，Lambda 只會在`IamAuth`端點上評估金鑰，因為對`ApplicationManaged`端點的請求未獲得 IAM 的授權。
+ `aws:ResourceTag/${TagKey}` – 依 Web 函數上的標籤篩選存取權。端點和修訂會繼承父函數的標籤，因此您可以使用 ABAC 控制調用存取。

**Example 僅允許在已標記函數的端點上叫用**  

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeWebFunctionEndpoint",
            "Resource": "arn:aws:lambda:us-east-1:111122223333:web-function/*/endpoint/prod",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/Environment": "Production"
                }
            }
        }
    ]
}
```