

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

# 依標籤保護您的函數
<a name="attribute-based-access-control-example"></a>

以下步驟會示範使用 ABAC 設定函數許可的一種方法。在此範例案例中，您將會建立四個 IAM 許可政策。然後，您會將這些政策連接至新的 IAM 角色。最後，您將建立 IAM 使用者，並授予該使用者擔任新角色的許可。

**Topics**
+ [

## 先決條件
](#abac-prerequisites)
+ [

## 步驟 1：要求新函數具有標籤
](#require-tag-on-create)
+ [

## 步驟 2：依據連接至 Lambda 函數和 IAM 主體的標籤來允許動作
](#restrict-actions-function-tags)
+ [

## 步驟 3：授予 List 許可
](#abac-list-permissions)
+ [

## 步驟 4：授予 IAM 許可
](#abac-iam-permissions)
+ [

## 步驟 5：建立 IAM 角色
](#abac-create-role)
+ [

## 步驟 6：建立 IAM 使用者
](#abac-create-user)
+ [

## 步驟 7：測試許可
](#abac-test)
+ [

## 步驟 8：清理資源
](#abac-clean-up)

## 先決條件
<a name="abac-prerequisites"></a>

請確定您擁有 [Lambda 執行角色](lambda-intro-execution-role.md)。您將會在授予 IAM 許可以及建立 Lambda 函數時使用此角色。

## 步驟 1：要求新函數具有標籤
<a name="require-tag-on-create"></a>

在搭配使用 ABAC 和 Lambda 時，最佳實務是要求所有函數都具有標籤。這有助於確保您的 ABAC 許可政策如預期般運作。

[建立與以下範例類似的 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html#access_policies_create-json-editor)。此政策會使用 [aws:RequestTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag)、[aws:ResourceTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) 與 [aws:TagKeys](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys) 條件金鑰，要求新建立的函式以及建立這些函式的 IAM 主體都必須具有 `project` 標籤。`ForAllValues` 修飾詞會確保 `project` 是唯一受允許的標籤。如果您不納入 `ForAllValues` 修飾詞，則只要使用者也傳遞 `project`，其便也可新增其他標籤至函數。

**Example – 要求新函數具有標籤**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
      "Effect": "Allow",
      "Action": [
        "lambda:CreateFunction",
        "lambda:TagResource"
      ],
      "Resource": "arn:aws:lambda:*:*:function:*",
      "Condition": {
        "StringEquals": {
          "aws:RequestTag/project": "${aws:PrincipalTag/project}",
          "aws:ResourceTag/project": "${aws:PrincipalTag/project}"
        },
        "ForAllValues:StringEquals": {
          "aws:TagKeys": "project"
        }
      }
    }
  }
```

## 步驟 2：依據連接至 Lambda 函數和 IAM 主體的標籤來允許動作
<a name="restrict-actions-function-tags"></a>

使用 [aws:ResourceTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) 條件索引鍵來建立第二個 IAM 政策，以要求主體的標籤與連接至函數的標籤相符。以下範例政策會允許具有 `project` 標籤的主體呼叫具有 `project` 標籤的函數。如果函數有任何其他標籤，則會該動作將遭拒。

**Example – 要求函數和 IAM 主體的標籤相符**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "lambda:InvokeFunction",
          "lambda:GetFunction"
        ],
        "Resource": "arn:aws:lambda:*:*:function:*",
        "Condition": {
          "StringEquals": {
            "aws:ResourceTag/project": "${aws:PrincipalTag/project}"
          }
        }
      }
    ]
  }
```

## 步驟 3：授予 List 許可
<a name="abac-list-permissions"></a>

建立允許主體列出 Lambda 函數和 IAM 角色的政策。此政策會允許主體在主控台以及呼叫 API 動作時查看所有 Lambda 函數和 IAM 角色。

**Example – 授予 Lambda 和 IAM 的 List 許可**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Sid": "AllResourcesLambdaNoTags",
        "Effect": "Allow",
        "Action": [
          "lambda:GetAccountSettings",
          "lambda:ListFunctions",
          "iam:ListRoles"
        ],
        "Resource": "*"
      }
    ]
  }
```

## 步驟 4：授予 IAM 許可
<a name="abac-iam-permissions"></a>

建立允許 **iam:PassRole** 的政策。在您將執行角色指派給函數時，便會需要此許可。在以下範例政策中，用您 Lambda 執行角色的 ARN 來取代範例 ARN。

**注意**  
請勿將政策中的 `ResourceTag` 條件金鑰與 `iam:PassRole` 動作搭配使用。您不能使用該 IAM 角色的標籤來控制可傳遞該角色的人員。如需將角色傳遞至服務所需的許可的詳細資訊，請參閱[授予使用者將角色傳遞至 AWS 服務的許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html)。

**Example – 授予傳遞執行角色的許可**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": [
          "iam:PassRole"
        ],
        "Resource": "arn:aws:iam::111122223333:role/lambda-ex"
      }
    ]
  }
```

## 步驟 5：建立 IAM 角色
<a name="abac-create-role"></a>

最佳實務為[使用角色來委派許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#delegate-using-roles)。[建立名為 `abac-project-role` 的 IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html#roles-creatingrole-user-console)：
+ 在**步驟 1：選取可信任實體**時：選擇 **AWS account** ( 帳戶)，然後選擇 **This account** (此帳戶)。
+ 在**步驟 2：新增許可**時：連接您於前一步中建立的四個 IAM 政策。
+ 在**步驟 3：命名、檢閱和建立**時：選擇 **Add tag** (新增標籤)。在 **Key** (索引鍵) 欄位，輸入 `project`。請勿輸入**值**。

## 步驟 6：建立 IAM 使用者
<a name="abac-create-user"></a>

[建立名為 `abac-test-user` 的 IAM 使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console)。在 **Set permissions** (設定許可) 區段中，選擇 **Attach existing policies directly** (直接連接現有政策)，接著選擇 **Create policy** (建立政策)。輸入以下政策定義。以您的 [AWS 帳戶 ID](https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html#FindingYourAccountIdentifiers) 來取代 *111122223333*。此政策允許 `abac-test-user` 擔任 `abac-project-role`。

**Example – 允許 IAM 使用者擔任 ABAC 角色**  

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::111122223333:role/abac-project-role"
    }
  }
```

------

## 步驟 7：測試許可
<a name="abac-test"></a>

1. 以 身分登入 AWS 主控台`abac-test-user`。如需詳細資訊，請參閱[以 IAM 使用者身分登入](https://docs.aws.amazon.com/IAM/latest/UserGuide/console.html#user-sign-in-page)。

1. 切換到 `abac-project-role` 角色。如需詳細資訊，請參閱[切換到角色 (主控台)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-console.html)。

1. [建立 Lambda 函數](configuration-tags.md#using-tags-with-the-console)。
   + 在 **Permissions** (許可) 下，選擇 **Change default execution role** (變更預設執行角色)，然後在 **Execution role** (執行角色) 中選擇 **Use an existing role** (使用現有角色)。選擇與您在 [步驟 4：授予 IAM 許可](#abac-iam-permissions) 中使用的相同執行角色。
   + 在 **Advanced settings** (進階設定)下，選擇 **Enable tags** (啟用標籤)，然後選擇 **Add new tag** (新增標籤)。在 **Key** (索引鍵) 欄位，輸入 `project`。請勿輸入**值**。

1. [測試函數](testing-functions.md)。

1. 建立第二個 Lambda 函數，並新增一個不同的標籤，例如 `environment`。此操作應會失敗，因為您在 [步驟 1：要求新函數具有標籤](#require-tag-on-create) 中建立的 ABAC 政策僅允許主體建立具有 `project` 標籤的函數。

1. 建立無標籤的第三個函數。此操作應會失敗，因為您在 [步驟 1：要求新函數具有標籤](#require-tag-on-create) 中建立的 ABAC 政策不允許主體建立無標籤的函數。

此授權策略允許您控制存取，且無需為每個新使用者建立新政策。若要將授予新使用者存取權限，只需要向其授予擔任與其受指派專案相對應角色的許可。

## 步驟 8：清理資源
<a name="abac-clean-up"></a>

**刪除 IAM 角色**

1. 開啟 IAM 主控台中的[角色頁面](https://console.aws.amazon.com/iam/home#/roles)。

1. 選取您在[步驟 5](#abac-create-role) 中建立的角色。

1. 選擇 **刪除**。

1. 若要確認刪除，請在文字輸入欄位中輸入角色名稱。

1. 選擇 **刪除**。

**若要刪除 IAM 使用者**

1. 開啟 IAM 主控台的[使用者頁面](https://console.aws.amazon.com/iam/home#/users)。

1. 選取您在[步驟 6](#abac-create-user) 中建立的 IAM 使用者。

1. 選擇 **刪除**。

1. 若要確認刪除，請在文字輸入欄位中輸入使用者名稱。

1. 選擇**刪除使用者**。

**若要刪除 Lambda 函數**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇您建立的函數。

1. 選擇 **Actions** (動作)、**Delete** (刪除)。

1. 在文字輸入欄位中輸入 **confirm**，然後選擇 **刪除** 。