本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
疑難排解IAM策
策略是中的實體 AWS 當附加至身分識別或資源時,會定義其權限。 AWS 當主參與者 (例如使用者) 提出要求時,評估這些原則。政策中的許可決定是否允許或拒絕請求。原則儲存於 AWS 做為以識別為基礎的原則附加至主參與者的JSON文件,或作為以資源為基礎的原則附加至資源。您可以將以識別為基礎的原則附加至主參與者 (或身分識別),例如IAM群組、使用者或角色。以身分為基礎的原則包括 AWS 受管政策、客戶管理政策和內嵌政策。您可以在中建立和編輯客戶管理的政策 AWS Management Console 同時使用可視化和JSON編輯器選項。當您檢視中的政策時 AWS Management Console,您可以看到該原則所授與的權限摘要。您可以使用視覺化編輯器和原則摘要來協助您診斷及修正管理原IAM則時遇到的常見錯誤。
請記住,所有IAM原則都是使用以「JavaScript 物件標
針對 IAM 政策主題進行故障診斷
使用視覺化編輯器進行故障排除
在建立或編輯客戶管理政策時,您可以使用視覺化編輯器中的資訊,來協助您針對政策中的錯誤進行故障排除。若要檢視使用視覺化編輯器建立政策的範例,請參閱 控制對身分的存取。
政策結構調整
當您建立策略時, AWS 在儲存原則之前,先驗證、處理和轉換原則。擷取策略時, AWS 在不變更權限的情況下,將其轉換回人類可讀的格式。這可能會導致您在原則視覺化編輯器或JSON索引標籤中看到的內容有所差異。
-
您可以新增、移除或重新排序視覺化編輯器權限區塊,並可最佳化區塊內的內容。
-
在JSON選項卡中,可以刪除微不足道的空白,並且可以重新排序JSON地圖中的元素。此外, AWS 帳戶 IDs內的主要元素可以由 Amazon 資源名稱(ARN)替換 AWS 帳戶根使用者.
由於這些可能的變更,您不應該將JSON原則文件做為字串進行比較。
當您在中建立客戶管理政策時 AWS Management Console,您可以選擇完全在JSON編輯器中工作。如果您從未變更 Visual 編輯器中的原則,並從編輯器中選擇 [下一步],則不太可能重新架構原則。JSON當您使用 Visual 編輯器時,IAM可能會重新架構原則以最佳化其外觀。此結構調整僅在您的編輯工作階段中進行,不會自動儲存。
如果您的原則已在編輯工作階段中重新架構,請根據下列情況IAM決定是否要儲存重新架構:
使用此編輯器選項 | 若您編輯政策 | 然後從該索引標籤選擇下一步 | 當您選擇 Save changes (儲存變更) 時 |
---|---|---|---|
視覺化 | 已編輯 | 視覺化 | 對政策進行結構調整 |
視覺化 | 已編輯 | JSON | 對政策進行結構調整 |
視覺化 | 未編輯 | 視覺化 | 對政策進行結構調整 |
JSON | 已編輯 | 視覺化 | 對政策進行結構調整 |
JSON | 已編輯 | JSON | 此政策結構未變更 |
JSON | 未編輯 | JSON | 此政策結構未變更 |
IAM可能會重新架構複雜的原則或原則,這些原則或具有允許多個服務、資源類型或條件索引鍵的權限區塊或陳述式。
在可視化編輯器ARN中選擇資源
在使用視覺化編輯器建立或編輯政策時,您必須先選擇一個服務,然後從該服務中選擇動作。如果選取的服務和動作支援選擇的特定資源,視覺化編輯器將列出支援的資源類型。然後,您可以選擇 [新增] ARN 以提供有關資源的詳細資訊。您可以從下列選項中選擇新增ARN資源類型的選項。
-
使用ARN生成器-您可能會看到不同的字段來構建ARN基於資源類型。您也可以選擇 Any (任意) 來為指定設定的任何值提供許可。例如,如果您選取 Amazon EC2 讀取存取層級群組,則政策中的動作支援資
instance
源類型。提供資源的「區域」、「帳戶」和InstanceId值。如果您提供帳戶 ID 並為區域和執行個體 ID 選擇「任何」,則政策將授予您帳戶中任何執行個體的權限。 -
鍵入或貼上 ARN — 您可以按照資源的 Amazon 資源名稱 (ARN) 指定資源。您可以在 (每對冒號之間
*
) 的任何欄位中包含萬用字元 ARN ()。如需詳細資訊,請參閱IAMJSON政策元素:Resource。
在視覺化編輯器中拒絕許可
預設情況下,您使用視覺化編輯器建立的政策允許執行您選擇的動作。若要拒絕選擇的動作,請選擇 Switch to deny permissions (切換為拒絕許可)。由於預設會拒絕要求,因此建議您僅允許使用者所需動作和資源的權限。只有當您想要個別覆寫另一個陳述式或原則所允許的權限時,才應建立拒絕陳述式。我們建議您將拒絕許可數限制為最低,因為它們可能會增加解決許可問題的難度。如需有關如何IAM評估原則邏輯的詳細資訊,請參閱政策評估邏輯。
注意
默認情況下,只有 AWS 帳戶根使用者 可以存取該帳戶中的所有資源。因此,如果未以根使用者登入,您必須具有政策授與的許可。
在視覺化編輯器中指定多個服務
在使用視覺化編輯器建構政策時,您每次只能選擇一個服務。這是一項最佳實務,因為視覺化編輯器允許您從該服務的動作中進行選擇。然後,您可以從該服務和選定的動作支援的資源中進行選擇。如此一來就可以更輕鬆地建立政策和進行故障排除。
您也可以使用萬用字元 (*) 手動指定多個服務。例如,輸入 Code*
,以便為以 Code
開頭的所有服務 (如 CodeBuild
與 CodeCommit
) 提供許可。不過,您必須輸入動作和資源,ARNs才能完成原則。此外,在儲存您的政策時,可能會進行結構調整,以在單獨的許可區塊中包含每個服務。
或者,若要針對服務使用JSON語法 (例如萬用字元),請使用編輯JSON器選項建立、編輯及儲存原則。
在視覺化編輯器中縮減政策大小
當您使用視覺化編輯器建立原則時,IAM會建立JSON文件來儲存您的原則。您可以切換至JSON編輯器選項來檢視此文件。如果此JSON文件超過原則的大小限制,視覺化編輯器會顯示錯誤訊息。您將無法檢閱和儲存策略。若要檢視受管理策略的大小IAM限制,請參閱IAM 和 STS 字元限制。
若要在視覺化編輯器中縮減您的政策大小,請編輯您的政策或將許可區塊移到另一個政策。錯誤訊息包含您的政策文件所包含的字元數。您可以使用此資訊來協助您減少原則的大小。
在視覺化編輯器中修正無法識別的服務、動作或資源類型
您可能會在視覺化編輯器中看到警告,指出您的原則包含無法辨識的服務、動作或資源類型。
注意
IAM檢閱支援政策摘要之服務的服務名稱、動作和資源類型。不過,您的政策摘要可能包含不存在資源值或條件。請一律使用政策模擬器來測試政策。
如果您的政策包含無法識別的服務、動作或資源類型,則存在以下錯誤之一:
-
預覽服務:處於預覽狀態的服務不支援視覺化編輯器。如果您ARNs要參與預覽,則必須手動輸入動作和資源,才能完成原則。您可以忽略任何警告並繼續。或者,您也可以選擇編JSON輯器選項來輸入或貼上JSON原則文件。
-
自訂服務:自訂服務不支援視覺化編輯器。如果您使用的是自訂服務,則必須手動輸入動作和資源,ARNs才能完成原則。您可以忽略任何警告並繼續。或者,您也可以選擇編JSON輯器選項來輸入或貼上JSON原則文件。
-
服務不支援視覺化編輯器 — 如果您的原則包含不支援視覺化編輯器的一般可用 (GA) 服務,您必須手動輸入動作和資源,ARNs才能完成原則。您可以忽略任何警告並繼續。或者,您也可以選擇編JSON輯器選項來輸入或貼上JSON原則文件。
公開提供服務是公開發佈的服務,不是預覽或自訂服務。如果無法識別的服務是公開提供的,並且名稱拼寫正確,則該服務不支援視覺化編輯器。若要了解如何請求 GA 服務的視覺化編輯器或政策摘要支援,請參閱 服務不支援IAM政策摘要。
-
動作不支援視覺化編輯器 — 如果您的原則包含支援的服務且具有不支援的動作,您必須手動輸入動作和資源ARNs才能完成原則。您可以忽略任何警告並繼續。或者,您也可以選擇編JSON輯器選項來輸入或貼上JSON原則文件。
如果您的政策包含的受支援服務具有不支援的動作,則該服務不完全支援視覺化編輯器。若要了解如何請求 GA 服務的視覺化編輯器或政策摘要支援,請參閱 服務不支援IAM政策摘要。
-
資源類型不支援視覺化編輯器:如果您的政策包含的受支援動作具有不支援的資源類型,您可以忽略該警告並繼續。不過,IAM無法確認您是否已包含所有選取動作的資源,而且您可能會看到其他警告。
-
拼寫錯誤:在視覺化編輯器中手動輸入服務、動作或資源時,您建立的政策可能會包含拼寫錯誤。我們建議您從服務和動作清單中選取,以使用視覺化編輯器。然後,根據提示完成資源部分。如果服務不完全支援視覺化編輯器,您可能必須手動輸入原則的一部分。
如果您確定自己的政策不包含上述任何錯誤,那麼您的政策可能包含拼寫錯誤。檢查是否有下列問題:
-
拼錯的服務、動作和資源類型名稱,例如
s2
代替s3
或ListMyBuckets
代替ListAllMyBuckets
-
中不必要的文字ARNs,例如
arn:aws:s3: : :*
-
動作中缺少冒號,例如
iam.CreateUser
您可以選擇 [下一步] 檢閱原則摘要,以評估可能包含錯別字的策略。然後,確認策略是否提供您想要的權限。
-
使用原則摘要疑難排解
您可以診斷並解決與政策摘要相關的問題。
缺少政策摘要
主IAM控台包含政策摘要表格,說明政策中每個服務允許或拒絕的存取層級、資源和條件。政策摘要列於三個表中:政策摘要、服務摘要以及動作摘要。政策摘要表包括由所選政策定義的服務清單和許可摘要。您可以在該政策的政策詳細資訊頁面上,檢視連接至實體之任何政策的政策摘要。您可以在 Policies (政策) 頁面上檢視受管政策的政策摘要。If AWS 無法呈現策略的摘要,您將會看到JSON政策文件和下列錯誤:
A summary for this policy cannot be generated. (無法產生此政策的摘要。) 您仍然可以檢視或編輯JSON政策文件。
如果您的政策不包含摘要,則已發生下列錯誤之一:
-
不支援的策略元素 — IAM 不支援為包含下列其中一個策略元素的策略產生策略摘要:
-
Principal
-
NotPrincipal
-
NotResource
-
-
無政策許可:如果政策不提供任何有效許可,則無法產生政策摘要。例如,如果政策包含元素
"NotAction": "*"
的單一陳述式,則它將授與對於除「所有動作」(*) 之外的所有動作的存取權。這代表它未授與對任何內容的Deny
或Allow
的存取權。注意
使用這些原則元素時請務必小心
NotPrincipal
,例如NotAction
、和NotResource
。如需使用政策元素的資訊,請參閱 IAMJSON策略元素參考。如果您提供不相符的服務和資源,您可以建立不提供有效權限的策略。當您在一個服務中指定動作和來自另一個服務的資源時,就會發生這種情況 在這種情況下,仍然會出現政策摘要。唯一顯示出有問題的跡象是摘要中的資源列可能包含來自不同服務的資源。如果此欄位包含不相符的資源,則您應該檢閱您的政策錯誤。使用政策模擬器測試您的策略,以更好地了解政策。
政策摘要包含無法識別的服務、動作或資源類型
在IAM主控台中,如果策略摘要包含警告符號 ( ),則該策略可能包含無法辨識的服務、動作或資源類型。若要了解政策摘要中的警示,請參閱 政策摘要 (服務清單)。
注意
IAM檢閱支援政策摘要之服務的服務名稱、動作和資源類型。不過,您的政策摘要可能包含不存在資源值或條件。請一律使用政策模擬器來測試政策。
如果您的政策包含無法識別的服務、動作或資源類型,則存在以下錯誤之一:
-
預覽服務:處於預覽狀態的服務不支援政策摘要。
-
自訂服務:自訂服務不支援政策摘要。
-
服務不支援摘要:如果您的政策包括不支援政策摘要的公開提供 (GA) 服務,則該服務將包含在政策摘要表的 Unrecognized services (無法識別的服務) 部分。公開提供服務是公開發佈的服務,不是預覽或自訂服務。如果無法辨識的服務正常可用,而且名稱拼寫正確,則服務不支援IAM原則摘要。若要了解如何請求 GA 服務的政策摘要支援,請參閱 服務不支援IAM政策摘要。
-
動作不支援摘要:如果您的政策包含的受支援服務具有不受支援的動作,則該動作將包含在服務摘要表的 Unrecognized actions (無法識別的動作) 部分。若要了解服務摘要中的警示,請參閱 服務摘要 (動作清單)。
-
資源類型不支援摘要:如果您政策包含的受支援動作具有不受支援的資源類型,則該資源將包含在服務摘要表的 Unrecognized resource types (無法識別的資源類型) 部分。若要了解服務摘要中的警示,請參閱 服務摘要 (動作清單)。
注意
最佳做法是,建議您使用 IAM Access Analyzer 驗證您的IAM原則,以確保安全且正常運作的權限。我們建議您開啟現有政策並檢閱並解決任何政策驗證建議。
服務不支援IAM政策摘要
IAM原則摘要或視覺化編輯器可能不支援一般可用的 (GA) 服務或動作。公開提供服務是公開發佈的服務而非預覽或自訂服務。如果無法識別的服務是公開提供的,並且名稱拼寫正確,則該服務不支援這些功能。如果您的政策包含支援的服務且不受支援的動作,則該服務不會完全支援IAM原則摘要。
要求服務新增IAM原則摘要或視覺化編輯器支援
登入 AWS Management Console 然後在開啟IAM主控台https://console.aws.amazon.com/iam/
。 -
找到包含不受支援服務的政策:
-
若政策為受管政策,請在導覽窗格中選擇 Policies (政策)。在政策清單中,選擇您要檢視的政策名稱。
-
如果該政策是連接到使用者的內嵌政策,請在導覽窗格中選擇 Users (使用者)。在使用者清單中,選擇要檢視其政策的使用者的名稱。在使用者的政策表中,展開您要查看政策摘要的標題。
-
-
在左側的 AWS Management Console 頁尾,選擇意見反應。在 [回饋對象 IAM] 方塊中,輸入
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原則摘要支援
登入 AWS Management Console 然後在開啟IAM主控台https://console.aws.amazon.com/iam/
。 -
找到包含不受支援服務的政策:
-
若政策為受管政策,請在導覽窗格中選擇 Policies (政策)。在政策清單中,選擇您要檢視的政策名稱。
-
如果該政策是連接到使用者的內嵌政策,請在導覽窗格中選擇 Users (使用者)。在使用者清單中,選擇要檢視其政策的使用者的名稱。在使用者的政策表中,選擇您要檢視的政策名稱來展開政策摘要。
-
-
在政策摘要中,選擇包含不支援動作的服務的名稱。
-
在左側的 AWS Management Console 頁尾,選擇意見反應。在 [回饋對象 IAM] 方塊中,輸入
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
。
若要請求包含缺少之動作的不同服務,請重複最後三個步驟。
我的政策未授與預期的許可
若要指派許可給使用者、群組、角色或資源,您必須建立一個政策,其為一個定義許可的文件。政策文件包含下列元素:
-
效果:政策是否允許或拒絕存取
-
動作:政策允許或拒絕的動作清單
-
資源:動作可在其中發生的資源清單
-
條件:(選擇性) 政策授與許可的條件
若要了解這些內容與其他政策元素,請參閱 IAMJSON策略元素參考。
若要授與存取,您的政策必須定義含有支援的資源之動作。如果您的政策也包含條件,則該條件必須包含一個全域條件鍵或者必須套用到動作。若要瞭解動作支援哪些資源,請參閱 AWS 您的服務文件。若要瞭解動作支援哪些條件,請參閱的動作、資源和條件索引鍵 AWS 服務。
檢查您的政策是否定義了未授與權限的動作、資源或條件。使用IAM主控台檢視原則的政策摘要,位於https://console.aws.amazon.com/iam/
儘管在IAM策略中定義了元素,但有幾個原因可能無法授予權限:
若要檢視包含警告的政策摘要的範例,請參閱 政策摘要 (服務清單)。
已定義動作,但是沒有適用的資源
下方的政策定義了所有 ec2:Describe*
動作和一個特定資源。這些動作都不支援資源級許可,因而未授與任何 ec2:Describe
動作。資源層級權限表示動作支援策略元素ARNs中使用的Resource資源。如果動作不支援資源層級許可,則政策中的陳述式必須在 Resource
元素中使用萬用字元 (*
)。若要了解哪些服務支援資源層級的許可,請參閱 AWS 使用 的 服務 IAM。
{
"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:::amzn-s3-demo-bucket
"
]
}]
}
此原則提供所有 CloudFront 動作的權限。但是,因為政策定義 S3 amzn-s3-demo-bucket
資源卻未定義任何 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:::amzn-s3-demo-bucket"
]
}]
}
或者,若要修正此政策以僅提供 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主控台中,當您檢視 [原則詳細資料] 頁面時,頁面會包含一個橫幅,指出原則已連結至服務。您無法將此原則附加至中的使用者、群組或角色IAM。當您為服務建立與服務相關的角色時,該政策會自動連接到您的新角色。由於政策是必要的您無法將政策與服務相關角色分開。
根據IAM身分活動變更身分的政策
您可以根據IAM身分識別 (使用者、群組和角色) 的活動更新原則。要做到這一點,請在 CloudTrail 事件歷史記錄中查看您帳戶的事件。 CloudTrail 事件記錄檔包含詳細的事件資訊,您可以用來變更策略的權限。
- 使用者或角色嘗試執行中的動作 AWS 並且該請求被拒絕。
-
考慮使用者或角色是否應具有執行動作的權限。如果是這樣,您可以新增動作,甚至是他們嘗試存取其策略ARN的資源。
- 使用者或角色具有他們未使用的權限。
-
請考慮從其原則中移除這些權限。請確定您的政策僅授與執行必要動作所需的最低權限。
如需有關使用的詳細資訊 CloudTrail,請參閱在 CloudTrail主控台中檢視 CloudTrail 事件 AWS CloudTrail 用戶指南。
疑難排解JSON原則文
您可以診斷和解決與JSON原則文件相關的問題。
驗證您的政策
當您建立或編輯JSON原則時,IAM可以執行原則驗證以協助您建立有效的原則。IAM識別JSON語法錯誤,而 IAM Access Analyzer 則提供額外的原則檢查以及建議,以協助您進一步調整原則。若要進一步了解政策驗證的資訊,請參閱 IAM政策驗證。若要深入了解IAM存取分析器原則檢查和可採取動作的建議,請參閱IAM存取分析器原則驗證
我在JSON編輯器中沒有政策驗證的權限
在 AWS Management Console,如果您沒有檢視IAM存取分析程式原則驗證結果的權限,您可能會收到下列錯誤:
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策略只能包含一對最外層的 {} 大括號。下列範例不正確,因為它包含兩個位於頂層的物件 (呼叫於) red
):
{
"Version": "2012-10-17",
"Statement":
{
"Effect":"Allow",
"Action":"ec2:Describe*",
"Resource":"*"
}
}
{
"Statement": {
"Effect": "Allow",
"Action": "s3:*",
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
}
}
不過,您可以使用正確的政策語法來達成上面範例的意圖。可以將兩個區塊合併到單個 Statement
元素中,而非包含兩個各自擁有 Statement
元素的完整政策物件。Statement
元素將有兩個物件的陣列做為其值,如以下範例所示 (以粗體標示):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:Describe*", "Resource":" *" }, { "Effect": "Allow", "Action": "s3:*", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*" } ] }
多個JSON陳述式元素
此錯誤乍看可能會像是前一章節中錯誤的變形。但是,它在語法上是不同類型的錯誤。在以下範例中,頂層只有一個政策物件,由單一 { } 括弧對表示。但是,該物件包含兩個 Statement
元素。
IAM策略必須只包含一個Statement
元素,其中包含出現在冒號左側的名稱 (Statement
),後跟右邊的值。Statement
元素的值必須是物件,以 { } 括弧表示,其中包含一個 Effect
元素、一個 Action
元素和一個 Resource
元素。下列範例不正確,因為它包含原則物件中的兩個Statement
元素 (呼叫於 red
):
{
"Version": "2012-10-17",
"Statement
": {
"Effect": "Allow",
"Action": "ec2:Describe*",
"Resource": "*"
},
"Statement
": {
"Effect": "Allow",
"Action": "s3:*",
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
}
}
值物件可以是多個值物件組成的陣列。若要解決此問題,可使用物件陣列將兩個 Statement
元素合併為一個元素,如以下範例所示 (以粗體標示):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:Describe*", "Resource":"*" }, { "Effect": "Allow", "Action": "s3:*", "Resource": "arn:aws:s3:::amzn-s3-demo-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": { "Effect": "Deny", "Action": "ec2:* ", "Resource": "*" } }
但是,如果重複元素是 Action
或 Resource
,則解決方法可能會更加複雜。您可能需要提供多個動作允許 (或拒絕) 許可,或者需要控制對多個資源的存取。例如,下列範例不正確,因為它具有多個Resource
元素 (呼叫 in) red
):
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "s3:*",
"Resource
": "arn:aws:s3:::amzn-s3-demo-bucket",
"Resource
": "arn:aws:s3:::amzn-s3-demo-bucket/*"
}
}
Statement
元素的值物件中的每個必要元素都只能出現一次。解決方案是將每個值置於陣列中。以下範例運用將兩個單獨資源元素合併為一個以陣列為值物件的 Resource
元素,來對此進行說明 (以粗體標示):
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket", "arn:aws:s3:::amzn-s3-demo-bucket/*" ] } }
缺少JSON版本元素
Version
政策元素與政策版本不同。Version
政策元素是在政策內使用,並定義政策語言的版本。相較之下,當您在中變更客戶管理的政策時,就會建立政策版本IAM。變更的政策不會覆寫現有的政策。而是IAM建立受管理策略的新版本。若要進一步了解 Version
政策元素,請參閱 IAMJSON政策元素:Version。若要進一步了解政策版本,請參閱 版本控制IAM政策。
作為 AWS 功能不斷發展,新功能被添加到IAM策略中以支持這些功能。有時,政策語法更新包括新版本編號。如果您在政策中使用政策語法的較新功能,則必須告知政策分析引擎所使用的版本。預設政策版本是「2008-10-17」。如果要使用之後推出的任何政策功能,則必須指定支援所需功能的版本編號。我們建議您一律包含最新的政策語法版本編號 (目前為 "Version": "2012-10-17"
)。例如,下列策略不正確,因為它${...}
在中ARN針對資源使用政策變數。但是無法指定支援原則變數的原則語法版本 (呼叫於 red
):
{
"Statement":
{
"Action": "iam:*AccessKey*",
"Effect": "Allow",
"Resource": "arn:aws:iam::123456789012:user/${aws:username}
"
}
}
在原則頂端新增具有值2012-10-17
的Version
元素 (支援原則變數的第一個IAMAPI版本) 可解決這個問題 (以粗體顯示):
{ "Version": "2012-10-17", "Statement": { "Action": "iam:*AccessKey*", "Effect": "Allow", "Resource": "arn:aws:iam::123456789012:user/${aws:username}" } }