使用資源棧策略可以防止資源棧資源在資源棧更新過程中被意外更新或刪除。本文為您介紹資源棧策略的定義,以及如何設定和更新資源棧策略。
背景資訊
資源棧策略是一個JSON或YAML類型的文檔,該文檔定義可對指定資源執行的更新操作。建立資源棧時,允許對所有資源執行更新操作,具有資源棧更新許可權的使用者可以更新資源棧中的所有資源。更新時,一些資源可能需要中斷。設定資源棧策略後,ROS將保護資源棧中的所有資源。您可以在資源棧策略中為資源指定明確的Allow
語句,允許對特定資源進行更新。
您只能為每個資源棧定義一個資源棧策略,但一個策略可以保護多個資源。
在資源棧更新期間,ROS自動更新依賴其他更新的資源。例如:ROS自動更新引用更新的資源。但如果這些資源與資源棧策略關聯,您必須具有許可權才能進行更新。
資源棧策略僅在資源棧更新過程中適用。與RAM策略不同,它不提供存取控制,僅將資源棧策略用作故障保護功能來防止意外更新特定資源棧資源。
定義資源棧策略
建立資源棧時,如果未設定資源棧策略,則允許對所有資源執行更新操作。要阻止對資源棧資源執行更新操作,可定義一個資源棧策略,然後對資源棧設定該策略。在建立資源棧時,您可以指定一個包含資源棧策略的文字檔或輸入該策略來設定資源棧策略。在資源棧上設定資源棧策略時,預設情況下會拒絕未顯式允許的任何更新。
您可定義一個帶5個元素的資源棧策略:Effect
、Action
、Principal
、Resource
和Condition
。
Statement:
- Effect: Deny_or_Allow
Action: update_actions
Principal: '*'
Resource: LogicalResourceId/resource_logical_ID
Condition:
StringEquals_or_StringLike:
ResourceType:
- resource_type
- ...
各元素說明如下:
Effect
確定是拒絕還是允許對指定資源執行指定的操作。您只能指定
Deny
或Allow
,例如:Effect: Deny
說明如果資源棧策略包含重疊語句(同時允許和拒絕對資源進行更新),則
Deny
語句始終將覆蓋Allow
語句。要確保某一資源受到保護,請對該資源使用Deny
語句。Action
拒絕或允許的更新操作:
Update:Modify
在對資源應用更改期間不會中斷或有某些中斷的更新操作。
Update:Delete
刪除資源的更新操作。從資源棧模板中完全刪除資源的更新都需要此操作。
Update:*
所有更新操作。星號(*)是萬用字元,代表所有更新操作。
說明Action
還可以指定Update:Replace
作為保留功能。目前暫不支援替換功能。以下樣本說明如何只指定更新和刪除操作:
Action: - Update:Modify - Update:Delete
要允許除某個更新操作之外的所有更新操作,請使用
NotAction
。例如:要允許除Update:Delete
之外的所有更新操作,請使用NotAction
。Statement: - Effect: Allow NotAction: Update:Delete Principal: '*' Resource: '*'
Principal
策略應用的實體。僅支援星號(*),表示策略應用於所有主體。
Resource
應用策略的資源的邏輯ID。要指定資源類型,請使用
Condition
元素。要指定一個資源,請使用其邏輯ID。例如:
Resource: - LogicalResourceId/myECS
您可以對邏輯ID使用星號(*)。例如:如果您對所有相關資源使用一個通用邏輯ID首碼,則可使用星號(*)指定所有資源。
Resource: - LogicalResourceId/Prefix*
您還可以對資源使用
Not
元素。例如:要允許對所有資源執行除某個更新之外的所有更新,請使用NotResource
元素保護該資源。Statement: - Effect: Allow Action: Update:* Principal: '*' NotResource: LogicalResourceId/WebServers
設定資源棧策略時,會拒絕未顯式允許的任何更新。通過允許更新
WebServers
資源之外的所有資源,會拒絕更新WebServers
資源。Condition
應用策略的資源類型。要指定特定資源的邏輯ID,請使用
Resource
元素。您可以指定資源類型(例如:所有ECS和RDS資料庫執行個體)。
Statement: - Effect: Deny Principal: '*' Action: Update:* Resource: '*' Condition: StringEquals: ResourceType: - ALIYUN::ECS::Instance - ALIYUN::RDS::DBInstance - Effect: Allow Principal: '*' Action: Update:* Resource: '*'
Allow
語句授予對所有資源的更新許可權,而Deny
語句拒絕對ECS和RDS資料庫執行個體的更新。Deny
語句始終覆蓋允許操作。您可以對資源類型使用星號(*)。例如:您可以使用星號(*)拒絕所有ECS資源(例如:執行個體、安全性群組和子網)的更新許可權。
Condition: StringLike: ResourceType: - ALIYUN::ECS::*
說明使用星號(*)時,必須使用StringLike條件。
設定資源棧策略
您可以使用控制台或ALIYUN CLI在建立資源棧時應用資源棧策略。您也可以使用ALIYUN CLI將資源棧策略應用於現有資源棧。應用資源棧策略後,無法將其從資源棧中刪除,但可以使用ALIUN CLI進行更新。
在建立資源棧時設定資源棧策略(控制台)
在左側導覽列單擊資源棧。
在頂部功能表列的地區下拉式清單,選擇資源棧的所在地區,例如:華東1(杭州)。
在資源棧列表頁面,單擊建立資源棧,然後在下拉式清單中選擇使用ROS。
在建立資源棧嚮導的選擇模板頁面,根據所需選擇模板,然後單擊下一步。
在建立資源棧嚮導的配置參數頁面,根據控制台提示,配置資源棧名稱和配置模板參數。
在配置資源棧區塊,選擇資源棧策略為輸入資源棧策略。
配置資源棧策略,然後單擊下一步。
輸入資源棧策略:直接輸入資源棧策略。
上傳檔案:上傳包含資源棧策略的JSON或YAML格式的檔案。
在合規預檢頁面,完成合規檢測,然後單擊下一步。
說明目前合規預檢功能僅支援為部分資源提供合規預檢功能。更多資訊,請參見Resource Orchestration Service支援合規預檢。
在檢測規則地區,添加檢測規則。
您可以根據ROS模板中的雲資源選擇需要檢測的規則。
單擊開始檢測。
您可以根據不合規或不適用資源的修正方案修改模板內容,從而保證資源的合規性。
按照控制台提示繼續配置,完成資源棧建立。
在建立資源棧時設定資源棧策略(CLI)
您可以使用以下兩種方式設定資源棧策略:
調用CreateStack介面設定
使用
aliyun ros CreateStack
和--StackPolicyBody
設定可更新的策略,或使用aliyun ros CreateStack
和--StackPolicyURL
指定包含策略的檔案。調用CreateChangeSet介面設定
使用
aliyun ros CreateChangeSet
和--StackPolicyBody
設定可更新的策略,或使用aliyun ros CreateChangeSet
和--StackPolicyURL
指定包含策略的檔案。
在現有資源棧上設定資源棧策略(僅限CLI)
使用
aliyun ros SetStackPolicy
和--StackPolicyBody
設定可更新的策略,或使用aliyun ros SetStackPolicy
和--StackPolicyURL
指定包含策略的檔案。說明要將策略添加到現有資源棧中,您必須具有
SetStackPolicy
操作許可權。
更新受保護資源
當您需要更新受保護資源時,可以建立一個覆蓋資源棧策略並允許對這些資源進行更新的臨時策略。覆蓋策略不會永久更改資源棧策略。
要更新保護的資源,您必須具有SetStackPolicy
操作許可權。關於如何設定ROS許可權,請參見使用RAM控制資源訪問。
更新受保護的資源(控制台)
在左側導覽列單擊資源棧。
在頂部功能表列的地區下拉式清單,選擇資源棧的所在地區,例如:華東1(杭州)。
在資源棧列表頁面,單擊目標資源棧右側操作列的更新。
在配置資源棧區塊,根據控制台提示,選擇輸入資源棧策略。
配置臨時資源棧策略。
指定臨時的資源棧策略,僅本次更新生效。覆蓋策略必須為您要更新的受保護資源指定
Allow
語句。例如:要更新所有受保護資源,可以指定允許所有更新的臨時覆蓋策略。Statement: - Effect: Allow Action: Update:* Principal: '*' Resource: '*'
按照控制台提示繼續配置,完成資源棧更新。
更新受保護資源(CLI)
您可以通過以下兩種方式更新受保護資源:
調用UpdateStack介面更新
使用
aliyun ros UpdateStack
和--StackPolicyDuringUpdateBody
設定可更新的策略,或使用aliyun ros UpdateStack
和--StackPolicyDuringUpdateURL
指定包含策略的檔案。調用CreateChangeSet介面更新
使用
aliyun ros CreateChangeSet
和--StackPolicyDuringUpdateBody
設定可更新的策略,或使用aliyun ros CreateChangeSet
和--StackPolicyDuringUpdateURL
指定包含策略的檔案。
說明ROS僅在此更新期間應用覆蓋策略。覆蓋策略不會永久更改資源棧策略。
更新資源棧策略
當您需要保護其他資源或從資源中刪除保護時,可以更新資源棧策略。例如:當您將要保護的資料庫添加到資源棧時,會將該資料庫的Deny
語句添加到資源棧策略。如果需要更新策略,您必須具有SetStackPolicy
的使用許可權。
更新資源棧策略(控制台)
在左側導覽列單擊資源棧。
在頂部功能表列的地區下拉式清單,選擇資源棧的所在地區,例如:華東1(杭州)。
在資源棧列表頁面,單擊目標資源棧名稱列的資源棧ID。
在資源棧資訊頁簽的資源棧策略地區,單擊編輯。
在修改資源棧策略對話方塊,輸入資源棧策略。
單擊確定。
更新資源棧策略(CLI)
使用
aliyun ros SetStackPolicy
和--StackPolicyBody
設定更新的策略,或使用aliyun ros SetStackPolicy
和--StackPolicyURL
指定包含策略的檔案。以下策略允許對所有資源進行全部更新:
Statement: - Effect: Allow Action: Update:* Principal: '*' Resource: '*'
在更新資源棧時更新資源棧策略(CLI)
使用
aliyun ros UpdateStack
和--StackPolicyBody
設定可更新的策略,或使用aliyun ros UpdateStack
和--StackPolicyURL
指定包含策略的檔案。使用
aliyun ros CreateChangeSet
和--StackPolicyBody
設定可更新的策略,或使用aliyun ros CreateChangeSet
和--StackPolicyURL
指定包含策略的檔案。
資源棧策略樣本
以下樣本策略說明如何阻止對所有資源棧資源和特定資源進行更新,並阻止特定類型的更新。
阻止對所有資源棧資源的更新
要阻止對所有資源棧資源的更新,以下策略為所有資源的所有更新操作指定
Deny
語句。Statement: - Effect: Deny Action: Update:* Principal: '*' Resource: '*'
阻止對單個資源(
WebServers
)的更新樣本一:使用
Deny
語句阻止對WebServers
資源的更新。Statement: - Effect: Allow Action: Update:* Principal: '*' Resource: '*' - Effect: Deny Action: Update:* Principal: '*' Resource: LogicalResourceId/WebServers
各元素說明如下:
Allow
:允許對所有資源執行的操作。Deny
:為具有WebServers
邏輯ID的資源阻止執行的操作。Principal
:策略應用的實體。僅支援星號(*),表示策略應用於所有實體。
樣本二:使用
Allow
語句允許對WebServers
之外的所有資源進行更新。Statement: - Effect: Allow Action: Update:* Principal: '*' NotResource: LogicalResourceId/WebServers
說明設定資源棧策略時,如果對某個資源沒有寫明是否支援更新,則預設不支援更新該資源。
使用預設拒絕存在風險。如果您策略中的其他位置具有
Allow
語句 (例如:使用萬用字元的Allow
語句),則可能意外授予對資源的更新許可權。由於顯示拒絕將覆蓋任何允許操作,因此可以使用Deny
語句確保保護資源。
阻止對資源類型的所有執行個體進行更新
以下策略拒絕針對RDS資料庫執行個體資源類型的所有更新操作。使用
Allow
語句允許對所有其他資源棧資源進行全部更新操作。Allow
語句不應用於RDS資料庫執行個體資源,因為Deny
語句始終覆蓋允許操作。Statement: - Effect: Deny Action: Update:* Principal: '*' Resource: '*' Condition: StringEquals: ResourceType: - ALIYUN::RDS::DBInstance - Effect: Allow Action: Update:* Principal: '*' Resource: '*'
阻止對嵌套資源棧進行更新
以下策略拒絕針對ROS資源棧資源類型(嵌套資源棧)的所有更新操作。使用
Allow
語句允許對所有其他資源棧資源進行全部更新操作。Allow
語句不會應用於ROS資源棧資源,因為Deny
語句始終覆蓋Allow
操作。Statement: - Effect: Deny Action: Update:* Principal: '*' Resource: '*' Condition: StringEquals: ResourceType: - ALIYUN::ROS::Stack - Effect: Allow Action: Update:* Principal: '*' Resource: '*'