IAM 中的政策和許可 - AWS Identity and Access Management

IAM 中的政策和許可

您要依序透過建立政策,然後將其連接到 IAM 身分 (使用者、使用者群組或角色) 或 AWS 資源,管理 AWS 中的存取權。政策是 AWS 中的一個物件,當其和身分或資源建立關聯時,便可定義其許可。AWS 會在 IAM 委託人 (使用者或角色) 發出請求時評估這些政策。政策中的許可決定是否允許或拒絕請求。大多數的政策會以 JSON 文件形式儲存在 AWS 中。AWS 支援六種政策類型:以身分為基礎的政策、以資源為基礎的政策、許可界限、Organizations SCP、ACL 和工作階段政策。

IAM 政策定義該動作的許可,無論您使用何種方法來執行操作。例如,若政策允許 GetUser 動作,則具有該政策的使用者可以從 AWS Management Console、AWS CLI 或 AWS API 獲得使用者資訊。當您建立 IAM 使用者時,您可以選擇允許其主控台存取或程式化存取。如果允許主控台存取,則 IAM 使用者可以利用使用者名稱和密碼登入主控台。若在允許程式化存取情況下,使用者可以使用存取金鑰來操作 CLI 或 API。

政策類型

以下政策類型會以最常使用到較不常使用的順序列出,可以在 AWS 中使用。如需更多詳細資訊,請參閱以下各節中的每個政策類型。

  • 以身分為基礎的政策 – 將受管和內嵌政策連接到 IAM 身分 (使用者、使用者所屬的群組,以及角色)。以身分為基礎的政策可為身分授予許可。

  • 以資源為基礎的政策 – 將內嵌政策連接到資源。以資源為基礎的政策的最常見範例是 Amazon S3 儲存貯體政策和 IAM 角色信任政策。以資源為基礎的政策會將許可授予給政策中所指定的委託人。委託人可以位在與資源相同的帳戶,或位在其他的帳戶中。

  • 許可界限 – 使用受管政策作為 IAM 實體 (使用者或角色) 的許可界限。該政策會定義以身分為基礎的政策可為實體授予的最大許可,但並不會授予許可。許可界限不會定義以資源為基礎之政策可以授予給實體的最大許可。

  • Organizations SCP – 使用 AWS Organizations 服務控制政策 (SCP),定義組織或組織單位 (OU) 帳戶成員的最大許可。SCP 會限制以身分為基礎之政策或以資源為基礎之政策為帳戶中實體 (使用者或角色) 授予的許可,但不會授予許可。

  • 存取控制清單 (ACL) – 使用 ACL,可以控制其他帳戶中的哪些委託人可以存取其中已連接 ACL 的資源。ACL 類似以資源為基礎的政策,雖然是不使用 JSON 政策文件結構的唯一政策類型。ACL 是跨帳戶許可的政策,負責為指定的委託人授予許可。ACL 不可以為相同帳戶中的實體授予許可。

  • 工作階段政策 – 使用 AWS CLI 或 AWS API 來擔任角色或聯合身分使用者時,傳遞進階的工作階段政策。工作階段政策限制以角色或使用者身分類型政策授予給該工作階段的許可。工作階段政策會限制已建工作階段的許可,但不會限制授予許可。如需詳細資訊,請參閱工作階段政策

身分型政策

以身分為基礎政策是 JSON 許可政策文件,可控制身分 (使用者、使用者群組和角色) 會在何種條件下對哪些資源執行哪些動作。以身分為基礎的政策可進一步分類:

  • 受管政策:為獨立存在並以身分為基礎的政策,可連接到您的 AWS 帳戶中的多個使用者、群組和角色。受管政策有兩種:

    • AWS 受管政策:由 AWS 建立和管理的受管政策。

    • 客戶受管政策:您在 AWS 帳戶中建立和管理的受管政策。客戶受管政策提供比 AWS 受管政策更為精確的政策控制。

  • 內嵌政策 – 您直接新增至單一使用者、群組或角色的政策。內嵌政策可在政策與身分之間維持嚴格的一對一關聯性。當您刪除身分時,它們即會被刪除。

若要了解如何選擇受管政策和內嵌政策的相關資訊,請參閱 在受管政策與內嵌政策之間進行選擇

資源型政策

資源型政策是連接到資源 (如 Amazon S3 儲存貯體) 的 JSON 政策文件。這些政策會授予指定的委託人許可,允許在該資源上執行特定的動作,並且定義資源所適用的條件。以資源為基礎的政策是內嵌政策。不存在受管的以資源為基礎的政策。

若要啟用跨帳戶存取,您可以指定在其他帳戶內的所有帳戶或 IAM 實體,做為資源型政策的委託人。新增跨帳戶委託人至資源型政策,只是建立信任關係的一半。當委託人和資源分屬個別的 AWS 帳戶時,您也必須使用以身分為基礎的政策,授予委託人對於資源的存取權。不過,如果資源型政策會為相同帳戶中的委託人授予存取,這時就不需要額外的身分型政策。如需授予跨服務存取許可的逐步指示,請參閱 IAM 教學課程:使用 IAM 角色將存取許可委派給不同 AWS 帳戶

IAM 服務支援一種稱為角色信任政策,且已連接到 IAM 角色的以資源為基礎的政策。IAM 角色既是一種身分,也是一項資源,可支援以資源為基礎的政策。因此,您必須同時將信任政策和身分類型政策連接到 IAM 角色。信任政策會定義哪些委託人實體 (帳戶、使用者、角色和聯合身分使用者) 可擔任該角色。若要了解 IAM 角色與其他以資源為基礎之政策之間的差別,請參閱 IAM 角色與基於資源的政策有何差異

若要查看哪些其他服務可以支援以資源為基礎的政策,請參閱可搭配 IAM 運作的AWS服務。若要進一步了解以資源為基礎的政策的詳細資訊,請參閱 以身分為基礎和以資源為基礎的政策。若要了解在您信任區域 (受信任組織或帳戶) 外帳戶中的委託人是否具有擔任您角色的許可,請參閱什麼是 IAM Access Analyzer?

IAM 許可界限

許可界限是一種進階功能,可供您設定以身分為基礎的政策可以授予 IAM 實體的最大許可。當您為實體設定許可界限時,實體只能執行由以身分為基礎的政策和其許可界限同時允許的動作。指定使用者或角色做為委託人的以資源為基礎的政策,不會受到許可界限的限制。所有這類政策中的明確拒絕都會覆寫該允許。如需有關許可界限的詳細資訊,請參閱 IAM 實體的許可界限

服務控制政策 (SCP)

AWS Organizations 是一項分組服務,可集中管理您的企業擁有的 AWS 帳戶。若您啟用組織中的所有功能,您可以將服務控制政策 (SCP) 套用到任何或所有帳戶。SCP 是一種 JSON 政策,負責指定組織或組織單位 (OU) 的最大許可。SCP 會限制成員帳戶中的實體許可,包括每個 AWS 帳戶 的根使用者。所有這類政策中的明確拒絕都會覆寫該允許。

如需有關 Organizations 和 SCP 的詳細資訊,請參閱《AWS Organizations 使用者指南》中的 SCP 運作方式

存取控制清單 (ACL)

存取控制清單 (ACL) 是一種服務政策,可讓您控制另一個帳戶中的哪些委託人可以存取資源。ACL 不能用於控制相同帳戶中委託人的存取。ACL 類似以資源為基礎的政策,雖然是不使用 JSON 政策文件格式的唯一政策類型。Amazon S3、AWS WAF 和 Amazon VPC 是支援 ACL 的服務範例。若要進一步了解 ACL,請參閱《Amazon Simple Storage Service 開發人員指南》中的存取控制清單 (ACL) 概觀

工作階段政策

工作階段政策是一種進階政策,且您會在以程式設計方式建立角色或聯合身分使用者的臨時工作階段時,以參數方式傳遞。工作階段的許可是用來建立工作階段及工作階段政策 IAM 實體 (使用者或角色) 之身分類型政策的交集。許可也可以來自資源型政策。所有這類政策中的明確拒絕都會覆寫該允許。

您可以建立角色工作階段,以及透過程式設計方式使用 AssumeRoleAssumeRoleWithSAMLAssumeRoleWithWebIdentity API 操作來傳遞工作階段政策。您可以使用 Policy 參數傳遞單一 JSON 內嵌工作階段政策文件。您可以使用 PolicyArns 參數,指定多達 10 個受管工作階段政策。如需有關建立角色工作階段的詳細資訊,請參閱 請求暫時性安全憑證

建立聯合身分使用者工作階段時,您要使用 IAM 使用者存取金鑰,以程式設計的方式來呼叫 GetFederationToken API 操作。您也必須通過工作階段政策。所產生工作階段的許可會是 IAM 使用者的身分類型政策和工作階段政策的交集。如需有關建立聯合身分使用者工作階段的詳細資訊,請參閱 GetFederationToken—透過自訂身分經紀人聯合

資源類型政策可以指定使用者或角色 ARN 作為委託人。在該情況下,在工作階段建立之前,依據資源類型政策的許可會新增到該角色或使用者的身分類型政策。工作階段政策限制由資源類型政策、身分類型政策所授予的總許可數。產生的工作階段的許可是工作階段政策與資源類型政策的交集,加上工作階段政策與身分類型政策的交集。


          評估的工作階段政策與資源類型政策使用指定實體 ARN

資源類型政策可以指定工作階段 ARN 作為委託人。在該情況下,會在建立工作階段後,從資源類型政策新增許可。資源類型政策許可不會受到工作階段政策的限制。產生的工作階段擁有資源類型政策的所有許可,加上身分類型政策與工作階段政策的交集。


          評估的工作階段政策與資源類型政策使用指定工作階段 ARN

許可界限可以為使用者或角色設定建立工作階段的許可上限。在該情況下,產生的工作階段的許可是工作階段政策、許可界限與身分類型政策的交集。不過,許可界限不會限制由資源類型政策所授予的許可,指定產生工作階段的 ARN。


          搭配許可界限的工作階段政策評估

政策和根使用者

AWS 帳戶 根使用者不受政策類型影響,但有一些政策類型例外。您無法將以身分為基礎的政策連接到根使用者,而且您無法為根使用者設定許可界限。不過,您可以將根使用者指定為以資源為基礎的政策委託人或 ACL。根使用者仍是帳戶的成員。如果該帳戶是 AWS Organizations 中組織的成員,根使用者會受到該帳戶的任何 SCP 的影響。

JSON 政策概觀

大部分政策以 JSON 文件形式存放在 AWS 中。以身分為基礎的政策以及用於設定許可界限的政策,都是您連接到使用者或角色的 JSON 政策文件。資源型政策是連接到資源的 JSON 政策文件。SCP 是 JSON 政策文件,其具備您連接到 AWS Organizations 組織單位 (OU) 的受限語法。ACL 也會連接到資源,但您必須使用不同的語法。工作階段政策是您在擔任角色或聯合身分使用者工作階段時所需要提供的 JSON 政策。

您不需要了解 JSON 語法。您可以在 AWS Management Console 中使用視覺化編輯器來建立和編輯客戶受管政策,從不需使用 JSON。不過,如果將內嵌政策用於群組或複雜政策,您仍然必須在 JSON 編輯器中利用主控台建立和編輯這些政策。如需有關使用視覺化編輯器的詳細資訊,請參閱 建立 IAM 政策編輯 IAM 政策

當您建立或編輯 JSON 政策時,IAM 可以執行政策驗證以協助您建立有效的政策。IAM 會識別 JSON 語法錯誤,而 IAM Access Analyzer 會提供額外的政策檢查及建議,協助您進一步改良政策。若要進一步了解政策驗證的資訊,請參閱 驗證 IAM 政策。若要進一步了解 IAM Access Analyzer 政策檢查和可動作的建議,請參閱 IAM Access Analyzer 政策驗證

JSON 政策文件結構

如下圖所示,JSON 政策文件包含這些元素:

  • 在文件最上方選用的整體政策資訊

  • 一或多個個別的陳述式

每個陳述式包含關於單一許可的資訊。如果政策包含多個陳述式,AWS 會在進行評估時套用具邏輯性的 OR 至所有陳述式。如果多個政策套用到請求,AWS 便會在進行評估時套用具邏輯性的 OR 至所有的政策。


          JSON 政策文件結構

陳述式中的資訊包含在一系列的元素內。

  • Version – 指定您要使用的政策語言版本。根據最佳實務,使用最新的 2012-10-17 版本。

  • Statement – 使用此主要政策元素作為以下元素的容器。您可以在政策中包含多個陳述式。

  • Sid (選用) – 包含選用的陳述式 ID 來區分您的陳述式。

  • Effect – 使用 AllowDeny 來表示政策是否允許或拒絕存取。

  • Principal (僅在某些情況下需要) – 如果您建立以資源為基礎政策,則必須指示您想要允許或拒絕存取的帳戶、使用者、角色或聯合身分使用者。如果您要建立 IAM 許可政策來連接到使用者或角色,您不能包含此元素。委託人意味著該使用者或角色。

  • Action – 包含政策允許或拒絕的動作清單。

  • Resource (僅在某些情況下需要) – 如果您建立 IAM 許可政策,則必須指示要套用動作的資源清單。如果您建立以資源為基礎的政策,此元素是選用的。如果您未包含此元素,則此動作適用的資源是連接此政策的資源。

  • Condition (選用) – 指定政策授予許可的條件。

若要了解這些內容及其他更進階的政策元素,請參閱IAM JSON 政策元素參考

多項陳述式和多個政策

如果您想要定義一個以上的實體 (使用者或角色) 許可,您可以在單一政策使用多個陳述式。您也可以連接多個政策。如果您嘗試在單一陳述式定義多個許可,您的政策可能不會授予您預期的存取權。根據最佳實務,透過資源類型將政策分類。

由於政策的大小限制,可能需要針對更複雜的許可採用多重政策。在不同的客戶受管政策中建立許可的功能群組,也是不錯的想法。例如,建立一個政策給 IAM 使用者管理、一個給自我管理,另一個給 S3 儲存貯體管理。無論如何組合多個陳述式和多個政策,AWS 會以相同方式評估您的政策。

例如,以下政策具有三個陳述式,每一個定義單一帳戶內不同組的許可。陳述式定義下列動作:

  • 第一種陳述式具有 SidFirstStatement (陳述式 ID),可讓具有連接政策的使用者變更自己的密碼。此陳述式的 Resource 元素是「*」(其表示「所有資源」)。但事實上 ChangePasswordAPI 操作 (或同等 change-password CLI 命令) 只對提出請求的使用者的密碼有影響。

  • 第二個陳述式可讓使用者在其 AWS 帳戶列出所有的 Amazon S3 儲存貯體。此陳述式的 Resource 元素是 "*" (其表示「所有資源」)。但是,因為政策不授予其他帳戶的資源存取權,使用者只能列出自己的 AWS 帳戶中的儲存貯體。

  • 第三個陳述式可讓使用者列出並擷取儲存貯體中的任何物件,名為 confidential-data,但前提是使用者必須是以 多重要素驗證 (MFA) 驗證。政策中的 Condition 元素強制執行 MFA 身分驗證。

    當政策陳述式包含 Condition 元素,陳述式僅於 Condition 元素評估為 true 是生效。在這種情況下,當使用者經過 MFA 身分驗證,Condition 評估為 true。如果使用者未經過 MFA 身分驗證,這項 Condition 評估設為 false。在這種情況下,此政策的第三個陳述式將不適用,而且使用者無法存取 confidential-data 儲存貯體。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "FirstStatement", "Effect": "Allow", "Action": ["iam:ChangePassword"], "Resource": "*" }, { "Sid": "SecondStatement", "Effect": "Allow", "Action": "s3:ListAllMyBuckets", "Resource": "*" }, { "Sid": "ThirdStatement", "Effect": "Allow", "Action": [ "s3:List*", "s3:Get*" ], "Resource": [ "arn:aws:s3:::confidential-data", "arn:aws:s3:::confidential-data/*" ], "Condition": {"Bool": {"aws:MultiFactorAuthPresent": "true"}} } ] }

JSON 政策語法的範例

以下以身分為基礎的政策允許暗示的委託人列出單一 Amazon S3 儲存貯體,其名稱是 example_bucket

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::example_bucket" } }

以下以資源為基礎的政策可以連接到 Amazon S3 儲存貯體。此政策可讓特定 AWS 帳戶的成員在名為 mybucket 的儲存貯體中執行任何 Amazon S3 動作。它允許可在儲存貯體或其中的物件上執行的任何動作。(由於政策僅對帳戶授予信任,帳戶中的個別使用者仍必須被授予特定 Amazon S3 動作的許可)。

{ "Version": "2012-10-17", "Statement": [{ "Sid": "1", "Effect": "Allow", "Principal": {"AWS": ["arn:aws:iam::account-id:root"]}, "Action": "s3:*", "Resource": [ "arn:aws:s3:::mybucket", "arn:aws:s3:::mybucket/*" ] }] }

若要檢視常見案例的範例政策,請參閱以身分為基礎的 IAM 政策範例