故障排除 IAM 政策 - AWS Identity and Access Management

故障排除 IAM 政策

政策為 AWS 中的一個實體,可定義其所連接的身分或資源的許可。當像使用者這類的委託人提出請求時,AWS 會評估這些政策。政策中的許可決定是否允許或拒絕請求。政策以 JSON 文件形式存放在 AWS 中,並作為以身分為基礎的政策連接至委託人,或作為以資源為基礎的政策連接至資源。您可以連接以身分為基礎的政策到委託人 (或身分),例如 IAM 群組、使用者或角色。以身分為基礎的政策包括 AWS 受管政策、客戶受管政策以及內嵌政策。您可以在 AWS Management Console 中使用 Visual editor (視覺化編輯器)JSON 標籤來建立和編輯客戶受管政策。在 AWS Management Console 中檢閱政策時,您可以查看該政策授與的許可之摘要。您可以使用視覺化編輯器和政策摘要幫助診斷並修正在管理 IAM 政策時遇到的常見錯誤。

請記住,所有 IAM 政策是使用以 JavaScript Object Notation (JavaScript 物件註釋) (JSON) 規則開頭的語法所儲存的。您不需要了解該語法即可建立或管理您政策。您可以在 AWS Management Console 中使用視覺化編輯器來建立和編輯政策。若要進一步了解 IAM 中 JSON 語法的詳細資訊,請參閱 IAM JSON 政策語言的文法

針對 IAM 政策主題進行故障診斷

使用視覺化編輯器進行故障排除

在建立或編輯客戶受管政策時,您可以使用 Visual editor (視覺化編輯器) 標籤中的資訊來協助故障診斷您政策中的錯誤。若要檢視使用視覺化編輯器建立政策的範例,請參閱 控制對身分的存取

政策結構調整

在建立政策時,AWS 將在儲存之前驗證、處理和轉換該政策。當 AWS 傳回政策以回應使用者查詢或在主控台中顯示政策時,AWS 會將該政策轉換回可供人閱讀的格式,而不會變更由政策授與的許可。這可能會導致與政策視覺化編輯器或 JSON 標籤中顯示的內容有所不同:視覺化編輯器許可區塊可以新增、移除或重新排序,並且區塊中的內容可以進行最佳化。在 JSON 標籤中,可以移除較不重要的空格,並且可以將 JSON 映射中的元素重新排序。此外,您可以將委託人元素中的 AWS 帳戶 ID 取代為 AWS 帳戶 根使用者的 ARN。由於可能發生這些更改,不應以字串形式來比較 JSON 政策文件。

在 AWS Management Console 中建立客戶受管政策時,您可以選擇完全在 JSON 標籤中運作。如果從未在 Visual editor (視覺化編輯器) 標籤中進行任何變更並從 JSON 標籤中選擇 Review policy (檢閱政策),則不太可能會調整政策結構。不過,如果您建立一個政策並使用 Visual editor (視覺化編輯器) 標籤進行任何修改,或者從 Visual editor (視覺化編輯器) 標籤中選擇 Review policy (檢閱政策),則 IAM 可能會調整政策結構以在視覺化編輯器中最佳化其外觀。

此結構調整僅在您的編輯工作階段中進行,不會自動儲存。

如果您的政策在編輯工作階段中進行結構調整,則 IAM 會根據以下情況確定是否儲存結構調整:

在此標籤上 若您編輯政策 接著從此標籤中選擇 Review policy (檢閱政策) 當您選擇 Save changes (儲存變更)
Visual editor (視覺化編輯器) 已編輯 Visual editor (視覺化編輯器) 對政策進行結構調整
Visual editor (視覺化編輯器) 已編輯 JSON 對政策進行結構調整
Visual editor (視覺化編輯器) 未編輯 Visual editor (視覺化編輯器) 對政策進行結構調整
JSON 已編輯 Visual editor (視覺化編輯器) 對政策進行結構調整
JSON 已編輯 JSON 此政策結構未變更
JSON 未編輯 JSON 此政策結構未變更

IAM 可能會對複雜政策或具有允許多個服務、資源類型或條件金鑰的許可區塊或陳述式之政策進行結構調整。

在視覺化編輯器中選擇資源 ARN

在使用視覺化編輯器建立或編輯政策時,您必須先選擇一個服務,然後從該服務中選擇動作。如果選取的服務和動作支援選擇的特定資源,視覺化編輯器將列出支援的資源類型。然後您可以選擇 Add ARN (新增 ARN) 來提供關於資源的詳細資訊。您可以從以下選項中進行選擇以新增資源類型的 ARN。

  • 使用 ARN 產生器:根據資源類型,您可能會看到用於產生 ARN 的不同欄位。您也可以選擇 Any (任意) 來為指定設定的任何值提供許可。例如,若您選取了 Amazon EC2 Read (讀取) 存取等級群組,那麼您政策中的動作便支援 instance 資源類型。您必須提供 Region (區域)Account (帳戶)、以及資源的 InstanceId 值。如果提供您的帳戶 ID,但為區域和執行個體 ID 選擇 Any (任意),則政策會為您帳戶中的任何執行個體授與許可。

  • 輸入或貼上 ARN您可以根據資源的 Amazon 資源名稱 (ARN) 來指定資源。您也可以在 ARN 的任何欄位中包含萬用字元 (*) (在每組冒號之間)。如需詳細資訊,請參閱 IAM JSON 政策元素:Resource

在視覺化編輯器中拒絕許可

預設情況下,您使用視覺化編輯器建立的政策允許執行您選擇的動作。若要拒絕選擇的動作,請選擇 Switch to deny permissions (切換為拒絕許可)。由於請求係預設被拒絕,做為安全最佳實務,我們建議您僅允許使用者所需動作和資源的許可。只有在要覆蓋其他語句或政策單獨允許的許可時,才應建立陳述式來拒絕許可。我們建議您將拒絕許可數限制為最低,因為它們可能會增加解決許可問題的難度。如需 IAM 評估政策邏輯之方法的詳細資訊,請參閱 政策評估邏輯

注意

根據預設,只有 AWS 帳戶 根使用者擁有存取該帳戶中所有資源的權限 因此,如果未以根使用者登入,您必須具有政策授與的許可。

在視覺化編輯器中指定多個服務

在使用視覺化編輯器建構政策時,您每次只能選擇一個服務。這是一項最佳實務,因為視覺化編輯器允許您從該服務的動作中進行選擇。然後,您可以從該服務和選定的動作支援的資源中進行選擇。如此一來就可以更輕鬆地建立政策和進行故障排除。

如果您熟悉 JSON 語法,還可以使用萬用字元 (*) 手動指定多個服務。例如,輸入 Code*,以便為以 Code 開頭的所有服務 (如 CodeBuildCodeCommit) 提供許可。不過,您必須接著輸入動作和資源 ARN 以完成您的政策。此外,在儲存您的政策時,可能會進行結構調整,以在單獨的許可區塊中包含每個服務。

或者,若要在服務中使用 JSON 語法 (如萬用字元),請使用 JSON 標籤來建立、編輯和儲存政策。

在視覺化編輯器中縮減政策大小

在使用視覺化編輯器建立政策時,IAM 將建立一個 JSON 文件來存放您的政策。您可以切換到 JSON 標籤來檢視該文件。如果該 JSON 文件超過政策的大小限制,視覺化編輯器將顯示一條錯誤訊息,並禁止檢閱並儲存您的政策。若要查看 IAM 對於受管政策的大小限制,請參閱 IAM 和 STS 字元限制

若要在視覺化編輯器中縮減您的政策大小,請編輯您的政策或將許可區塊移到另一個政策。錯誤訊息包括政策文件中包含的字元數,您可以使用該資訊説明來縮減您的政策大小。

在視覺化編輯器中修正無法識別的服務、動作或資源類型

在視覺化編輯器中建立或編輯政策時,您可能會看到一條警告,指出您的政策包含無法識別的服務、動作或資源類型。

注意

IAM 對支援政策摘要的服務檢閱服務名稱、動作和資源類型。不過,您的政策摘要可能包含不存在資源值或條件。請一律使用政策模擬器來測試政策。

如果您的政策包含無法識別的服務、動作或資源類型,則存在以下錯誤之一:

  • 預覽服務:處於預覽狀態的服務不支援視覺化編輯器。如果您參與預覽,可以忽略該警告並繼續,但必須手動輸入動作和資源 ARN 以完成您的政策。或者,您可以選擇 JSON 標籤來輸入或貼上 JSON 政策文件。

  • 自訂服務:自訂服務不支援視覺化編輯器。如果您使用自訂服務,可以忽略該警告並繼續,但必須手動輸入動作和資源 ARN 以完成您的政策。或者,您可以選擇 JSON 標籤來輸入或貼上 JSON 政策文件。

  • 服務不支援視覺化編輯器:如果您的政策包含不支援視覺化編輯器的公開提供 (GA) 服務,您可以忽略該警告並繼續,但必須手動輸入動作和資源 ARN 以完成您的政策。或者,您可以選擇 JSON 標籤來輸入或貼上 JSON 政策文件。

    公開提供服務是公開發佈的服務,不是預覽或自訂服務。如果無法識別的服務是公開提供的,並且名稱拼寫正確,則該服務不支援視覺化編輯器。若要了解如何請求 GA 服務的視覺化編輯器或政策摘要支援,請參閱 服務不支援 IAM 政策摘要

  • 動作不支援視覺化編輯器:如果您政策包含的受支援服務具有不支援的動作,您可以忽略該警告並繼續,但必須手動輸入動作和資源 ARN 以完成您的政策。或者,您可以選擇 JSON 標籤來輸入或貼上 JSON 政策文件。

    如果您的政策包含的受支援服務具有不支援的動作,則該服務不完全支援視覺化編輯器。若要了解如何請求 GA 服務的視覺化編輯器或政策摘要支援,請參閱 服務不支援 IAM 政策摘要

  • 資源類型不支援視覺化編輯器:如果您的政策包含的受支援動作具有不支援的資源類型,您可以忽略該警告並繼續。不過,IAM 無法確認是否包含所有選定動作的資源,且您可能會看到額外的警告。

  • 拼寫錯誤:在視覺化編輯器中手動輸入服務、動作或資源時,您建立的政策可能會包含拼寫錯誤。做為最佳實務,請使用視覺化編輯器從服務和動作清單中進行選擇,然後根據提示完成資源部分。不過,如果服務不完全支援視覺化編輯器,您可能需要手動輸入某些政策部分。

    如果您確定自己的政策不包含上述任何錯誤,那麼您的政策可能包含拼寫錯誤。檢查服務、動作和資源類型名稱有無拼寫錯誤。例如,您可能誤用了 s2 而不是 s3,或誤用了 ListMyBuckets 而非 ListAllMyBuckets。另一個常見的動作拼寫錯誤是 ARN 中包含不必要的文字 (如 arn:aws:s3: : :*) 或動作中缺少冒號 (如 iam.CreateUser)。您可以選擇 Review policy (檢閱政策) 以檢閱政策摘要並確認政策是否提供所需的許可,對可能包含拼寫錯誤的政策進行評估。

使用政策摘要進行故障排除

您可以診斷並解決與政策摘要相關的問題。

缺少政策摘要

IAM 主控台中提供了政策摘要表,這些表總結政策中對每個服務允許或拒絕的存取級別、資源和條件。政策摘要列於三個表中:政策摘要服務摘要以及動作摘要政策摘要表包括由所選政策定義的服務清單和許可摘要。您可以在 Users (使用者) 頁面上查看連接到使用者的任何政策的政策摘要。您可以在 Policies (政策) 頁面上檢視受管政策的政策摘要。如果 AWS 無法呈現政策摘要,您將看到 JSON 政策文件而非摘要,還會收到以下錯誤:

A summary for this policy cannot be generated. (無法產生此政策的摘要。) You can still view or edit the JSON policy document. (您仍可以檢視或編輯 JSON 政策文件。)

如果您的政策不包含摘要,則已發生下列錯誤之一:

  • 不支援的政策元素:IAM 不支援為包含以下其中一項政策元素的政策產生政策摘要:

    • Principal

    • NotPrincipal

    • NotResource

  • 無政策許可:如果政策不提供任何有效許可,則無法產生政策摘要。例如,如果政策包含元素 "NotAction": "*" 的單一陳述式,則它將授與對於除「所有動作」(*) 之外的所有動作的存取權。這代表它未授與對任何內容的 DenyAllow 的存取權。

    注意

    請謹慎使用這些政策元素 (如 NotPrincipalNotActionNotResource)。如需使用政策元素的資訊,請參閱 IAM JSON 政策元素參考

    如果您提供不相符的服務和資源,則可能會產生一個不提供有效許可的政策。如果您指定一個服務中的動作和另一個服務中的資源,則可能會發生這種情況。在這種情況下,仍然會出現政策摘要。唯一顯示出有問題的跡象是摘要中的資源列可能包含來自不同服務的資源。如果此欄位包含不相符的資源,則您應該檢閱您的政策錯誤。若要更全面了解您的政策,請一律以政策模擬器來測試。

政策摘要包含無法識別的服務、動作或資源類型

在 IAM 主控台中,若政策摘要包含警告符號 ( ),則政策可能包含無法識別的服務、動作或資源類型。若要了解政策摘要中的警示,請參閱 政策摘要 (服務清單)

注意

IAM 會對支援政策摘要的服務檢閱服務名稱、動作和資源類型。不過,您的政策摘要可能包含不存在資源值或條件。請一律使用政策模擬器來測試政策。

如果您的政策包含無法識別的服務、動作或資源類型,則存在以下錯誤之一:

  • 預覽服務:處於預覽狀態的服務不支援政策摘要。

  • 自訂服務:自訂服務不支援政策摘要。

  • 服務不支援摘要:如果您的政策包括不支援政策摘要的公開提供 (GA) 服務,則該服務將包含在政策摘要表的 Unrecognized services (無法識別的服務) 部分。公開提供服務是公開發佈的服務,不是預覽或自訂服務。如果無法識別的服務是公開提供的,並且名稱拼寫正確,則該服務不支援 IAM 政策摘要。若要了解如何請求 GA 服務的政策摘要支援,請參閱 服務不支援 IAM 政策摘要

  • 動作不支援摘要:如果您的政策包含的受支援服務具有不受支援的動作,則該動作將包含在服務摘要表的 Unrecognized actions (無法識別的動作) 部分。若要了解服務摘要中的警示,請參閱 服務摘要 (動作清單)

  • 資源類型不支援摘要:如果您政策包含的受支援動作具有不受支援的資源類型,則該資源將包含在服務摘要表的 Unrecognized resource types (無法識別的資源類型) 部分。若要了解服務摘要中的警示,請參閱 服務摘要 (動作清單)

  • 拼寫錯誤:AWS 會檢查 JSON 在語法上是否正確,並檢查該策略不包含拼寫錯誤或其他錯誤,作為政策驗證的部分。作為最佳實務,我們建議您開啟現有政策並檢閱並解決任何政策驗證建議。

服務不支援 IAM 政策摘要

如果 IAM 政策摘要或視覺化編輯器無法辨識公開提供 (GA) 服務或動作,則該服務可能不支援這些功能。公開提供服務是公開發佈的服務而非預覽或自訂服務。如果無法識別的服務是公開提供的,並且名稱拼寫正確,則該服務不支援這些功能。如果您的政策包含的受支援服務具有不支援的動作,則該服務不完全支援 IAM 政策摘要。

請求服務新增 IAM 政策摘要或視覺化編輯器支援

  1. 登入 AWS Management Console,並開啟位於 https://console.aws.amazon.com/iam/ 的 IAM 主控台。

  2. 找到包含不受支援服務的政策:

    • 若政策為受管政策,請在導覽窗格中選擇 Policies (政策)。在政策清單中,選擇您要檢視的政策名稱。

    • 如果該政策是連接到使用者的內嵌政策,請在導覽窗格中選擇 Users (使用者)。在使用者清單中,選擇要檢視其政策的使用者的名稱。在使用者的政策表中,展開您要查看政策摘要的標題。

  3. 在 AWS Management Console 頁尾左側,選擇 Feedback (意見反應)。在 Tell us about your experience: (告訴我們您的體驗:) 方塊中,輸入 I request that the <ServiceName> service add support for IAM policy summaries and the visual editor。若您希望一個以上的服務支援摘要,請輸入 I request that the <ServiceName1>, <ServiceName2>, and <ServiceName3> services add support for IAM policy summaries and the visual editor

請求服務新增對缺漏動作的 IAM 政策摘要支援

  1. 登入 AWS Management Console,並開啟位於 https://console.aws.amazon.com/iam/ 的 IAM 主控台。

  2. 找到包含不受支援服務的政策:

    • 若政策為受管政策,請在導覽窗格中選擇 Policies (政策)。在政策清單中,選擇您要檢視的政策名稱。

    • 如果該政策是連接到使用者的內嵌政策,請在導覽窗格中選擇 Users (使用者)。在使用者清單中,選擇要檢視其政策的使用者的名稱。在使用者的政策表中,選擇您要檢視的政策名稱來展開政策摘要。

  3. 在政策摘要中,選擇包含不支援動作的服務的名稱。

  4. 在 AWS Management Console 頁尾左側,選擇 Feedback (意見反應)。在 Tell us about your experience: (告訴我們您的體驗:) 方塊中,輸入 I request that the <ServiceName> service add IAM policy summary and the visual editor support for the <ActionName> action。若您希望報告超過一個未受支援的動作,請輸入 I request that the <ServiceName> service add IAM policy summary and the visual editor support for the <ActionName1>, <ActionName2>, and <ActionName3> actions

若要請求包含缺少之動作的不同服務,請重複最後三個步驟。

我的政策未授與預期的許可

若要指派許可給使用者、群組、角色或資源,您必須建立一個政策,其為一個定義許可的文件。政策文件包含下列元素:

  • 效果:政策是否允許或拒絕存取

  • 動作:政策允許或拒絕的動作清單

  • 資源:動作可在其中發生的資源清單

  • 條件:(選擇性) 政策授與許可的條件

若要了解這些內容與其他政策元素,請參閱 IAM JSON 政策元素參考

若要授與存取,您的政策必須定義含有支援的資源之動作。如果您的政策也包含條件,則該條件必須包含一個全域條件鍵或者必須套用到動作。若要了解受動作支援的資源,請參閱您服務的 AWS 文件。若要了解動作支援哪些條件,請參閱適用於 AWS 服務的動作、資源和條件金鑰

若要了解您的政策是否定義不授與許可的動作、資源或條件,您可以使用位於https://console.aws.amazon.com/iam/ 的 IAM 主控台檢閱政策的政策摘要。您可以使用政策摘要來辨識並修正政策中的問題。

對於元素不依照 IAM 政策中的定義授與許可的情況,原因可能有:

若要檢視包含警告的政策摘要的範例,請參閱 政策摘要 (服務清單)

定義了動作,但是沒有適用的資源

下方的政策定義了所有 ec2:Describe* 動作和一個特定資源。這些動作都不支援資源級許可,因而未授與任何 ec2:Describe 動作。資源級許可表示動作使用政策的 Resource 元素中的 ARN 來支援資源。如果動作不支援資源層級許可,則政策中的陳述式必須在 Resource 元素中使用萬用字元 (*)。若要了解哪些服務支援資源層級的許可,請參閱 可搭配 IAM 運作的 AWS 服務

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "ec2:Describe*", "Resource": "arn:aws:ec2:us-east-2:ACCOUNT-ID:instance/*" }] }

此政策不提供任何許可,而政策摘要包含下列錯誤:

This policy does not grant any permissions. To grant access, policies must have an action that has an applicable resource or condition.

若要修正此政策,您必須使用 Resource 元素中的 *

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "ec2:Describe*", "Resource": "*" }] }

定義了資源,但是沒有適用的動作

下面的政策定義了 Amazon S3 儲存貯體資源,但不包含可在該資源上執行的 S3 動作。此政策也會授與完整存取權限給所有 Amazon CloudFront 動作。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "cloudfront:*", "Resource": [ "arn:aws:cloudfront:*", "arn:aws:s3:::examplebucket" ] }] }

此政策為所有 CloudFront 動作提供許可。但是,因為政策定義 S3 examplebucket 資源卻未定義任何 S3 動作,政策摘要包含下列警告:

This policy defines some actions, resources, or conditions that do not provide permissions. To grant access, policies must have an action that has an applicable resource or condition.

若要修正此政策以提供 S3 儲存貯體許可,您必須定義可在儲存貯體資源上執行的 S3 動作。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "cloudfront:*", "s3:CreateBucket", "s3:ListBucket*", "s3:PutBucket*", "s3:GetBucket*" ], "Resource": [ "arn:aws:cloudfront:*", "arn:aws:s3:::examplebucket" ] }] }

或者,若要修正此政策僅提供 CloudFront 許可,請移除 S3 資源。

定義了條件,但是沒有適用的動作

如果 S3 字首等同於 custom 而版本 ID 等同於 1234,下列政策會為所有 S3 資源定義兩項 Amazon S3 動作。但是,s3:VersionId 條件金鑰用於物件版本標記,不受所定義的儲存貯體動作的支援。若要了解動作支援哪些條件,請參閱適用於 AWS 服務的動作、資源和條件金鑰,並遵循服務文件的連結以取得條件金鑰。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucketVersions", "s3:ListBucket" ], "Resource": "*", "Condition": { "StringEquals": { "s3:prefix": [ "custom" ], "s3:VersionId": [ "1234" ] } } } ] }

如果儲存貯體名稱包含 s3:ListBucketVersions 字首,此政策為 s3:ListBucket 動作和 custom 動作提供許可。但是,由於 s3:VersionId 條件不受任何定義的動作支援,政策摘要包含下列錯誤:

This policy does not grant any permissions. To grant access, policies must have an action that has an applicable resource or condition.

若要修正此政策來使用 S3 物件版本標記,您必須定義支援 s3:VersionId 條件金鑰的 S3 動作。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucketVersions", "s3:ListBucket", "s3:GetObjectVersion" ], "Resource": "*", "Condition": { "StringEquals": { "s3:prefix": [ "custom" ], "s3:VersionId": [ "1234" ] } } } ] }

此政策為政策中的每個動作和條件提供許可。但由於不存在單一動作符合兩個條件的情況,政策仍不提供任何許可。為解決這一問題,您必須建立兩個單獨的陳述式,每個陳述式只包含具有套用條件的動作。

若要修正此政策,請建立兩個陳述式。第一個陳述式包含支援 s3:prefix 條件的動作,第二個陳述式包含支援 s3:VersionId 條件的動作。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucketVersions", "s3:ListBucket" ], "Resource": "*", "Condition": { "StringEquals": { "s3:prefix": "custom" } } }, { "Effect": "Allow", "Action": "s3:GetObjectVersion", "Resource": "*", "Condition": { "StringEquals": { "s3:VersionId": "1234" } } } ] }

故障排除政策管理

您可以診斷並解決與政策管理相關的問題。

在 IAM 帳戶中連接或分開政策

有些 AWS 受管政策連結到服務。這些政策僅用於該服務的某個服務連結角色。在 IAM 主控台中,當您查看政策的 Summary (摘要) 頁面時,該頁面包含一個橫幅,顯示該政策已與服務建立關聯。您不可將此政策連接到 IAM 中的使用者、群組或角色。當您為服務建立與服務相關的角色時,該政策會自動連接到您的新角色。由於政策是必要的您無法將政策與服務相關角色分開。

根據 IAM 身份的活動來變更其政策

您可以為您的 IAM 身分 (使用者、群組和角色) 根據其活動更新政策。若要這麼做,請在 CloudTrail 中檢視您帳戶的事件事件歷史記錄 (Event istory)。CloudTrail 事件日誌包含可供您用來變更政策之許可的詳細事件資訊。您可能會發現使用者或角色嘗試在 AWS 中執行動作且該請求遭到拒絕。在這種情況下,您可以考量使用者或角色是否應該有執行該動作的許可。若是如此,您可以在其政策中新增動作,甚至其所嘗試存取資源的 ARN。或者,如果使用者或角色具備其未使用的許可,則您可以考慮從其政策中移除這類許可。請確定您的政策僅授與執行必要動作所需的最低權限。如需使用 CloudTrail 的詳細資訊,請參閱 AWS CloudTrail 使用者指南中的在 CloudTrail 主控台中檢閱 CloudTrail 事件

JSON 政策文件故障排除

您可以診斷並解決與 JSON 政策文件相關的問題。

驗證您的政策

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

我在 JSON 編輯器中沒有政策驗證的許可

在 AWS Management Console 中,如果您沒有檢視 IAM Access Analyzer 政策驗證結果的許可,可能會收到下列錯誤:

You need permissions. You do not have the permissions required to perform this operation. Ask your administrator to add permissions.

若要修正此錯誤,請要求管理員為您新增 access-analyzer:ValidatePolicy 許可。

多個 JSON 政策物件

一個 IAM 政策必須包含一個且只能包含一個 JSON 物件。可在兩旁放置 { } 括弧來表示物件。雖然您可以在外側括弧對中嵌入額外的 { } 括弧以在 JSON 物件中巢套其他物件,但是一個政策只能包含一個最外層的 { } 括弧對。以下範例不正確,因為它在最上層包含兩個物件 (以紅色標示):

{ "Version": "2012-10-17", "Statement": { "Effect":"Allow", "Action":"ec2:Describe*", "Resource":"*" } } { "Statement": { "Effect": "Allow", "Action": "s3:*", "Resource": "arn:aws:s3:::my-bucket/*" } }

不過,您可以使用正確的政策語法來達成上面範例的意圖。可以將兩個區塊合併到單個 Statement 元素中,而非包含兩個各自擁有 Statement 元素的完整政策物件。Statement 元素將有兩個物件的陣列做為其值,如以下範例所示 (以粗體標示):

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:Describe*", "Resource":" *" }, { "Effect": "Allow", "Action": "s3:*", "Resource": "arn:aws:s3:::my-bucket/*" } ] }

多個 JSON 陳述式元素

此錯誤乍看可能會像是前一章節中錯誤的變形。但是,它在語法上是不同類型的錯誤。在以下範例中,頂層只有一個政策物件,由單一 { } 括弧對表示。但是,該物件包含兩個 Statement 元素。

一個 IAM 政策只能包含一個 Statement 元素,包含在冒號左側的名稱 (Statement) 和跟隨其後在冒號右側的值。Statement 元素的值必須是物件,以 { } 括弧表示,其中包含一個 Effect 元素、一個 Action 元素和一個 Resource 元素。以下範例不正確,因為它在政策物件中包含兩個 Statement 元素 (以紅色標示):

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "ec2:Describe*", "Resource": "*" }, "Statement": { "Effect": "Allow", "Action": "s3:*", "Resource": "arn:aws:s3:::my-bucket/*" } }

值物件可以是多個值物件組成的陣列。若要解決此問題,可使用物件陣列將兩個 Statement 元素合併為一個元素,如以下範例所示 (以粗體標示):

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:Describe*", "Resource":"*" }, { "Effect": "Allow", "Action": "s3:*", "Resource": "arn:aws:s3:::my-bucket/*" } ] }

Statement 元素的值是一種物件陣列。此示例中的陣列包含兩個物件,每個物件本身是 Statement 元素的正確值。陣列中的每個物件之間用逗號隔開。

在 JSON 陳述式元素中具有多個效果、動作或資源元素

Statement 名稱/值對的值側,物件只能包含一個 Effect 元素、一個 Action 元素和一個 Resource 元素。以下政策不正確,因為在 Effect 的值物件中有兩個 Statement 元素:

{ "Version": "2012-10-17", "Statement": { "Effect": "Deny", "Effect": "Allow", "Action": "ec2:* ", "Resource": "*" } }
注意

政策引擎不允許新的或再編輯的政策中出現此類錯誤。但是,政策引擎會繼續允許在引擎更新之前儲存的政策。現有包含錯誤的政策之行為如下所示:

  • 多個 Effect 元素:僅遵循最後一個 Effect 元素。忽略其他元素。

  • 多個 Action 元素:所有 Action 元素進行內部合併,被視為單一列表。

  • 多個 Resource 元素:所有 Resource 元素進行內部合併,被視為單一列表。

政策引擎不允許您儲存任何有語法錯誤的政策。您必須先更正政策中的錯誤,然後才能儲存。我們建議您檢閱並修正所有政策驗證對您的政策做出的建議。

在每種情況下,解決方案都是刪除不正確的多餘元素。針對 Effect 元素,這十分簡單:若您希望先前的範例拒絕針對 Amazon EC2 執行個體的許可,您必須從政策移除 "Effect": "Allow", 一行,如下所示:

{ "Version": "2012-10-17", "Statement": { "Efect": "Deny", "Action": "ec2:* ", "Resource": "*" } }

但是,如果重複元素是 ActionResource,則解決方法可能會更加複雜。您可能需要提供多個動作允許 (或拒絕) 許可,或者需要控制對多個資源的存取。例如,以下範例不正確,因為它有多個 Resource 元素 (以紅色標示):

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "s3:*", "Resource": "arn:aws:s3:::my-bucket", "Resource": "arn:aws:s3:::my-bucket/*" } }

Statement 元素的值物件中的每個必要元素都只能出現一次。解決方案是將每個值置於陣列中。以下範例運用將兩個單獨資源元素合併為一個以陣列為值物件的 Resource 元素,來對此進行說明 (以粗體標示):

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws:s3:::my-bucket", "arn:aws:s3:::my-bucket/*" ] } }

缺少 JSON 版本元素

Version 政策元素與政策版本不同。Version 政策元素是在政策內使用,並定義政策語言的版本。另一方面,政策版本會在您在 IAM 中變更客戶受管政策時建立。變更的政策不會覆寫現有的政策。IAM 反而會建立新版本的受管政策。若要進一步了解 Version 政策元素,請參閱 IAM JSON 政策元素:Version。若要進一步了解政策版本,請參閱 版本控制 IAM 政策

隨著 AWS 功能的演進,為支援這些功能,IAM 政策新增了新的功能。有時,政策語法更新包括新版本編號。如果您在政策中使用政策語法的較新功能,則必須告知政策分析引擎所使用的版本。預設政策版本是「2008-10-17」。如果要使用之後推出的任何政策功能,則必須指定支援所需功能的版本編號。我們建議您一律包含最新的政策語法版本編號 (目前為 "Version": "2012-10-17")。例如,以下政策不正確,因為它在資源 ARN 中使用政策變數 ${...}。但是,它沒有指定支援政策變數的政策語法版本 (以紅色標示):

{ "Statement": { "Action": "iam:*AccessKey*", "Effect": "Allow", "Resource": "arn:aws:iam::123456789012:user/${aws:username}" } }

透過在政策頂層新增值 2012-10-17 (支援政策變數的第一個 IAM API 版本) 的 Version 元素,可解決此問題 (以粗體標示):

{ "Version": "2012-10-17", "Statement": { "Action": "iam:*AccessKey*", "Effect": "Allow", "Resource": "arn:aws:iam::123456789012:user/${aws:username}" } }