在 Lambda 中使用基於屬性的存取控制 - AWS Lambda

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

在 Lambda 中使用基於屬性的存取控制

搭配屬性型存取控制 (ABAC),您可以使用標籤來控制對 Lambda 函數的存取。您可以將標籤附加到 Lambda 函數,在特定 API 請求中傳遞標籤,或將它們附加到發出請求的 AWS Identity and Access Management (IAM) 主體。有關如何 AWS 授予以屬性為基礎的存取權的詳細資訊,請參閱 IAM 使用者指南中的使用標籤控制 AWS 資源的存取。

您可以使用 ABAC 來授予最低權限,無需在 IAM 政策中指定 Amazon Resource Name (ARN) 或 ARN 模式。可以在 IAM 政策 的條件元素中指定標籤,來控制存取。由於您無需在建立新函數時更新 IAM 政策,因此使用 ABAC 可以更輕鬆地擴展。可以將標籤新增至新函數來控制存取。

在 Lambda 中,標籤會在函數層級上工作。層、程式碼簽署組態或事件來源映射不支援標籤。在您標記函數時,這些標籤會套用至與該函數相關聯的所有版本和別名。如需有關如何標記函數的詳細資訊,請參閱在 Lambda 函數上使用標籤

您可以使用以下條件索引鍵來控制函數動作:

如需支援 ABAC 的 Lambda 動作完整清單,請參閱 支援的函數動作,並檢查資料表中的 Condition (條件) 欄位。

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

必要條件

請確定您擁有 Lambda 執行角色。您將會在授予 IAM 許可以及建立 Lambda 函數時使用此角色。

步驟 1:要求新函數具有標籤

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

建立與以下範例類似的 IAM 政策。此政策使用 aws: RequestTag /tag-keyaws: ResourceTag /tag-keyaws: TagKeys 條件金鑰來要求新函數和建立函數的 IAM 主體都有標籤。projectForAllValues 修飾詞會確保 project 是唯一受允許的標籤。如果您不納入 ForAllValues 修飾詞,則只要使用者也傳遞 project,其便也可新增其他標籤至函數。

範例 – 要求新函數具有標籤
{ "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 主體的標籤來允許動作

使用 aws: ResourceTag /tag-key 條件鍵建立第二個 IAM 政策,以要求主體的標籤與附加到函數的標籤相符。以下範例政策會允許具有 project 標籤的主體呼叫具有 project 標籤的函數。如果函數有任何其他標籤,則會該動作將遭拒。

範例 – 要求函數和 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 許可

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

範例 – 授予 Lambda 和 IAM 的 List 許可
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllResourcesLambdaNoTags", "Effect": "Allow", "Action": [ "lambda:GetAccountSettings", "lambda:ListFunctions", "iam:ListRoles" ], "Resource": "*" } ] }

步驟 4:授予 IAM 許可

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

注意

請勿將政策中的 ResourceTag 條件金鑰與 iam:PassRole 動作搭配使用。您不能使用該 IAM 角色的標籤來控制可傳遞該角色的人員。如需將角色傳遞至服務所需權限的詳細資訊,請參閱授與使用者將角色傳遞至 AWS 服務的權限

範例 – 授予傳遞執行角色的許可
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": "arn:aws:iam::111122223333:role/lambda-ex" } ] }

步驟 5:建立 IAM 角色

最佳實務為使用角色來委派許可建立名為 abac-project-role 的 IAM 角色

  • 步驟 1:選取可信任實體時:選擇 AWS account ( 帳戶),然後選擇 This account (此帳戶)。

  • 步驟 2:新增許可時:連接您於前一步中建立的四個 IAM 政策。

  • 步驟 3:命名、檢閱和建立時:選擇 Add tag (新增標籤)。在 Key (索引鍵) 欄位,輸入 project。請勿輸入

步驟 6:建立 IAM 使用者

建立名為 abac-test-user 的 IAM 使用者。在 Set permissions (設定許可) 區段中,選擇 Attach existing policies directly (直接連接現有政策),接著選擇 Create policy (建立政策)。輸入以下政策定義。以您的 AWS 帳戶 ID 來取代 111122223333。此政策允許 abac-test-user 擔任 abac-project-role

範例 – 允許 IAM 使用者擔任 ABAC 角色
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::111122223333:role/abac-project-role" } }

步驟 7:測試許可

  1. 登入 AWS 主控台的身分abac-test-user。如需詳細資訊,請參閱以 IAM 使用者身分登入

  2. 切換到 abac-project-role 角色。如需詳細資訊,請參閱切換到角色 (主控台)

  3. 建立 Lambda 函數

    • Permissions (許可) 下,選擇 Change default execution role (變更預設執行角色),然後在 Execution role (執行角色) 中選擇 Use an existing role (使用現有角色)。選擇與您在 步驟 4:授予 IAM 許可 中使用的相同執行角色。

    • Advanced settings (進階設定)下,選擇 Enable tags (啟用標籤),然後選擇 Add new tag (新增標籤)。在 Key (索引鍵) 欄位,輸入 project。請勿輸入

  4. 測試函數

  5. 建立第二個 Lambda 函數,並新增一個不同的標籤,例如 environment。此操作應會失敗,因為您在 步驟 1:要求新函數具有標籤 中建立的 ABAC 政策僅允許主體建立具有 project 標籤的函數。

  6. 建立無標籤的第三個函數。此操作應會失敗,因為您在 步驟 1:要求新函數具有標籤 中建立的 ABAC 政策不允許主體建立無標籤的函數。

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

步驟 8:清理資源

刪除 IAM 角色
  1. 開啟 IAM 主控台中的 角色頁面

  2. 選取您在步驟 5 中建立的角色。

  3. 選擇刪除

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

  5. 選擇刪除

若要刪除 IAM 使用者
  1. 開啟 IAM 主控台的「使用者」頁面

  2. 選取您在步驟 6 中建立的 IAM 使用者。

  3. 選擇刪除

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

  5. 選擇刪除使用者

若要刪除 Lambda 函數
  1. 開啟 Lambda 主控台中的 函數頁面

  2. 選擇您建立的函數。

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

  4. 在文字輸入欄位中輸入 delete,然後選擇 刪除