スタックポリシーを使用すると、スタックの更新中にスタックリソースが誤って更新または削除されるのを防ぐことができます。このトピックでは、スタックポリシーを定義、構成、および更新する方法について説明します。
背景情報
スタックポリシーは、指定されたリソースに対して実行できる更新アクションを定義する JSON または YAML ファイルです。スタック更新権限を持つユーザーは、スタックの作成後にスタック内のすべてのリソースを更新できます。特定のリソースでは、更新中に中断が必要になる場合があります。スタックポリシーが構成されると、Resource Orchestration Service (ROS) はスタック内のすべてのリソースを保護します。特定のリソースの更新を許可するには、スタックポリシーでリソースに対して /* 許可 */ ステートメントを指定します。
各スタックに対して定義できるスタックポリシーは 1 つだけです。1 つのスタックポリシーで複数のリソースを保護できます。
スタックの更新中、ROS は他の更新されたリソースに依存するリソースを自動的に更新します。たとえば、ROS は更新されたリソースを参照するリソースを自動的に更新します。ただし、スタックポリシーに関連付けられている自動的に更新されるリソースを更新する権限が必要です。
スタックポリシーは、スタックの更新中にのみ有効になります。RAM ポリシーとは異なり、スタックポリシーはアクセス制御をサポートしていません。スタックポリシーは、特定のスタックリソースへの意図しない更新を防ぐフェイルセーフメカニズムとしてのみ機能します。
スタックポリシーの定義
スタックの作成時にスタックポリシーを構成しない場合、スタック内のすべてのリソースを更新できます。スタック内のリソースの更新を防ぐには、スタックポリシーを定義し、スタックのポリシーを構成します。スタックを作成するときは、スタックポリシーの内容を入力するか、スタックポリシーを含むテキストファイルを指定して、スタックポリシーを構成できます。スタックポリシーを構成するときに更新を明示的に許可しない場合、更新は拒否されます。
スタックポリシーは、次の要素で構成されます。/* 効果 */、/* アクション */、/* プリンシパル */、/* リソース */、および /* 条件 */。
Statement:
- Effect: Deny_or_Allow # 拒否または許可
Action: update_actions # 更新アクション
Principal: '*'
Resource: LogicalResourceId/resource_logical_ID # リソース論理 ID
Condition:
StringEquals_or_StringLike:
ResourceType:
- resource_type
- ...
次のセクションでは、ポリシーの要素について説明します。
/* 効果 */リソースに対するアクションを拒否するか許可するかを指定します。有効な値:
/* 拒否 */および/* 許可 */。サンプルコード:Effect: Deny # 拒否説明スタックポリシーに許可ステートメントと拒否ステートメントの両方が含まれている場合、
/* 拒否 */ステートメントは/* 許可 */ステートメントよりも優先されます。リソースを更新から保護する場合は、/* 拒否 */ステートメントを使用します。/* アクション */拒否または許可される更新アクション。有効な値:
/* 更新:変更 */リソースへの変更が適用されているときに、リソースが中断されないか、特定の中断が発生する更新アクション。
/* 更新:削除 */リソースが削除される更新アクション。このアクションは、スタックテンプレートからリソースを完全に削除する更新に指定する必要があります。
/* 更新:* */すべての更新アクション。ワイルドカード文字 (*) は、すべての更新アクションを指定します。
説明/* 更新:置換 */は、リソースが置換される更新アクションを指定します。 更新:置換アクションは予約機能であり、サポートされていません。次のサンプルコードでは、更新:削除および更新:変更アクションが指定されています。
Action: - Update:Modify # 変更 - Update:Delete # 削除特定の更新アクションを除くすべての更新アクションを許可する場合は、
/* NotAction */を使用します。たとえば、/* NotAction */を/* 更新:削除 */に設定して、更新:削除アクションを除くすべての更新アクションを許可できます。Statement: - Effect: Allow NotAction: Update:Delete # 削除 Principal: '*' Resource: '*'/* プリンシパル */ポリシーが適用されるプリンシパル。値をワイルドカード文字 (*) に設定します。ワイルドカード文字 (*) は、ポリシーがすべてのプリンシパルに適用されることを示します。
/* リソース */ポリシーが適用されるリソースの論理 ID。リソースタイプを指定する場合は、
/* 条件 */要素を使用します。リソースを指定する場合は、リソースの論理 ID を使用します。サンプルコード:
Resource: - LogicalResourceId/myECS論理 ID には、ワイルドカード文字 (*) を含めることができます。たとえば、同じプレフィックスを持つすべての論理 ID を照合する場合は、プレフィックスの後にワイルドカード文字 (*) を指定します。
Resource: - LogicalResourceId/Prefix*/* Not */プレフィックスを Resource 要素に追加できます。たとえば、特定のリソースを除くすべてのリソースの更新を許可する場合は、/* NotResource */要素を使用して、リソースが更新されないように保護します。Statement: - Effect: Allow Action: Update:* Principal: '*' NotResource: LogicalResourceId/WebServersスタックポリシーを構成するときに特定のリソースの更新を明示的に許可しない場合、そのリソースの更新は拒否されます。
/* WebServers */リソースを除くすべてのリソースの更新を許可する場合、/* WebServers */リソースの更新は拒否されます。/* 条件 */ポリシーが適用されるリソースタイプ。リソースの論理 ID を指定する場合は、
/* リソース */要素を使用します。たとえば、ALIYUN::ECS::Instance および ALIYUN::RDS::DBInstance リソースタイプを使用して、すべての Elastic Compute Service (ECS) および ApsaraDB RDS インスタンスを指定できます。
Statement: - Effect: Deny Principal: '*' Action: Update:* Resource: '*' Condition: StringEquals: ResourceType: - ALIYUN::ECS::Instance - ALIYUN::RDS::DBInstance - Effect: Allow Principal: '*' Action: Update:* Resource: '*'上記のサンプルコードでは、
/* 許可 */ステートメントはすべてのリソースの更新を許可します。/* 拒否 */ステートメントは、ECS および ApsaraDB RDS インスタンスの更新を拒否します。/* 拒否 */ステートメントは /* 許可 */ ステートメントよりも優先されます。リソースタイプには、ワイルドカード文字 (*) を含めることができます。たとえば、ワイルドカード文字 (*) を使用して、ECS インスタンス、セキュリティグループ、サブネットなど、すべての ECS リソースの更新を拒否できます。
Condition: StringLike: ResourceType: - ALIYUN::ECS::*説明ワイルドカード文字 (*) を使用する場合は、StringLike 条件を指定する必要があります。
スタックポリシーの構成
スタックを作成するときに、ROS コンソールまたは Alibaba Cloud CLI を使用して、スタックにスタックポリシーを適用できます。また、Alibaba Cloud CLI を使用して、既存のスタックにスタックポリシーを適用することもできます。スタックにスタックポリシーを適用した後、スタックからポリシーを削除することはできません。Alibaba Cloud CLI を使用してポリシーを更新できます。
ROS コンソールを使用して、スタックの作成時にスタックポリシーを構成する
ROS コンソール にログオンします。
左側のナビゲーションペインで、[スタック] をクリックします。
上部のナビゲーションバーで、リージョンドロップダウンリストからスタックを作成するリージョンを選択します。この例では、中国 (杭州) が選択されています。
[スタック] ページで、[スタックの作成] をクリックし、ドロップダウンリストから [ROS を使用する] を選択します。
[スタックの作成] ウィザードの [テンプレートの選択] ステップで、ビジネス要件に基づいてテンプレートを指定し、[次へ] をクリックします。
[スタックの作成] ウィザードの [パラメータの構成] ステップで、画面の指示に従って [スタック名] パラメータと [テンプレートパラメータの構成] セクションのパラメータを構成します。
[スタック設定の構成] セクションで、[スタックポリシー] パラメータを [スタックポリシーの入力] に設定します。
次のいずれかの方法を使用してスタックポリシーを構成し、[次へ] をクリックします。
入力スタックポリシー: スタックポリシーを入力します。
[ファイルのアップロード]: スタックポリシーを含む JSON または YAML ファイルをアップロードします。
[コンプライアンス事前チェック] ステップで、コンプライアンス事前チェックを完了し、[次へ] をクリックします。
説明特定のリソースのみがコンプライアンス事前チェック機能をサポートしています。詳細については、「Compliance precheck」をご参照ください。
[ルールの評価] セクションで、コンプライアンスルールを追加します。
ROS テンプレート内のクラウド リソースに基づいて、コンプライアンスルールを追加できます。
[評価] をクリックします。
無効なリソースを修復するために提供される提案に基づいて、テンプレートの内容を変更できます。これにより、リソースのコンプライアンスが確保されます。
画面の指示に従って、スタックの作成を完了します。
Alibaba Cloud CLIを使用してスタックポリシーを作成時に構成する
スタックポリシーを構成するには、次のいずれかの方法を使用できます。
CreateStackオペレーションを呼び出します。
aliyun ros CreateStackコマンドと--StackPolicyBodyオプションを使用して、更新を許可するスタックポリシーを構成するか、aliyun ros CreateStackコマンドと--StackPolicyURLオプションを使用して、スタックポリシーを含むファイルを指定します。CreateChangeSetオペレーションを呼び出します。
aliyun ros CreateChangeSetコマンドと--StackPolicyBodyオプションを使用して、更新を許可するスタックポリシーを構成するか、aliyun ros CreateChangeSetコマンドと--StackPolicyURLオプションを使用して、スタックポリシーを含むファイルを指定します。
Alibaba Cloud CLI を使用して、既存のスタックのスタックポリシーを設定します(Alibaba Cloud CLI のみサポートされています)。
aliyun ros SetStackPolicyコマンドと--StackPolicyBodyオプションを使用して、更新を許可するスタックポリシーを設定するか、aliyun ros SetStackPolicyコマンドと--StackPolicyURLオプションを使用して、スタックポリシーを含むファイルを指定します。説明既存のスタックのスタックポリシーを設定するには、
SetStackPolicyオペレーションを呼び出す権限が必要です。
保護されたリソースの更新
スタック内の保護されたリソースを更新する場合、既存のスタックポリシーをオーバーライドし、リソースの更新を許可する一時ポリシーを作成できます。一時スタックポリシーは、スタックポリシーを永続的にオーバーライドしません。
保護されたリソースを更新するには、SetStackPolicy オペレーションを呼び出す権限が必要です。 ROS で権限を設定する方法の詳細については、「RAM を使用してリソースへのアクセスを制御する」をご参照ください。
ROS コンソールを使用して保護されたリソースを更新する
ROS コンソール にログインします。
左側のナビゲーションペインで、[スタック] をクリックします。
上部のナビゲーションバーで、リージョン ドロップダウンリストから目的のスタックのリージョンを選択します。この例では、中国 (杭州) が選択されています。
[スタック] ページで、スタックを見つけ、[アクション] 列の [更新] をクリックします。
[スタック設定の構成] セクションで、画面の指示に従って [スタックポリシーの入力] を選択します。
一時スタックポリシーを設定します。
設定する一時スタックポリシーは、この更新に対してのみ有効です。一時ポリシーでは、更新する保護されたリソースに対して
Allowステートメントを指定する必要があります。たとえば、すべての保護されたリソースを更新する場合、リソースへのすべての更新を許可する一時ポリシーを指定する必要があります。Statement: - Effect: Allow Action: Update:* Principal: '*' Resource: '*' // 一時ポリシーでは、更新する保護されたリソースに対して Allow ステートメントを指定する必要があります。画面の指示に従って、スタックの更新を完了します。
Alibaba Cloud CLI を使用して保護されたリソースを更新する
保護されたリソースを更新するには、次のいずれかの方法を使用できます。
UpdateStack オペレーションを呼び出します。
aliyun ros UpdateStackコマンドと--StackPolicyDuringUpdateBodyオプションを使用して、更新を許可する一時スタックポリシーを設定するか、aliyun ros UpdateStackコマンドと--StackPolicyDuringUpdateURLオプションを使用して、一時スタックポリシーを含むファイルを指定します。CreateChangeSet オペレーションを呼び出します。
aliyun ros CreateChangeSetコマンドと--StackPolicyDuringUpdateBodyオプションを使用して、更新を許可する一時スタックポリシーを設定するか、aliyun ros CreateChangeSetコマンドと--StackPolicyDuringUpdateURLオプションを使用して、一時スタックポリシーを含むファイルを指定します。
説明ROS は、この更新中にのみ一時ポリシーを適用します。一時スタックポリシーは、スタックポリシーを永続的にオーバーライドしません。
スタックポリシーの更新
スタックポリシーを使用して新しいリソースを保護する場合、または既存のリソースの保護を停止する場合は、スタックポリシーを更新できます。たとえば、保護するデータベースをスタックに追加する場合は、データベースの Deny ステートメントをスタックポリシーに追加します。スタックポリシーを更新するには、SetStackPolicy オペレーションを呼び出す権限が必要です。
ROSコンソールを使用してスタックポリシーを更新する
ROSコンソール にログインします。
左側のナビゲーションペインで、[スタック] をクリックします。
上部のナビゲーションバーで、リージョン ドロップダウンリストから目的のスタックのリージョンを選択します。この例では、中国 (杭州) が選択されています。
[スタック] ページで、目的のスタックを見つけ、[スタック名] 列のスタック ID をクリックします。
[スタック情報] タブの [スタックポリシー] セクションで、[編集] をクリックします。
[リソーススタックポリシーの変更] ダイアログボックスで、新しいスタックポリシーの内容を入力します。
[OK] をクリックします。
Alibaba Cloud CLI を使用してスタックポリシーを更新する
aliyun ros SetStackPolicyコマンドと--StackPolicyBodyオプションを使用して、更新を許可するスタックポリシーを設定するか、aliyun ros SetStackPolicyコマンドと--StackPolicyURLオプションを使用して、スタックポリシーを含むファイルを指定します。次のポリシーは、すべてのリソースに対するすべての更新を許可します。
Statement: - Effect: Allow Action: Update:* Principal: '*' Resource: '*'スタックを更新するときに Alibaba Cloud 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) の更新を防止する例 1:
Denyステートメントを使用して、WebServersリソースの更新を防止します。Statement: - Effect: Allow Action: Update:* Principal: '*' Resource: '*' - Effect: Deny Action: Update:* Principal: '*' Resource: LogicalResourceId/WebServers次のセクションでは、ポリシーの要素について説明します。
Allow: すべてのリソースの更新を許可します。Deny: 論理 ID がWebServersであるリソースの更新を拒否します。Principal: ポリシーが適用されるプリンシパル。ワイルドカード文字 (*) のみがサポートされています。ワイルドカード文字 (*) は、ポリシーがすべてのプリンシパルに適用されることを示します。
例 2:
Allowステートメントを使用して、WebServersリソースを除くすべてのリソースの更新を許可します。Statement: - Effect: Allow Action: Update:* Principal: '*' NotResource: LogicalResourceId/WebServers説明スタックポリシーを構成するときに、特定のリソースの更新を明示的に許可しない場合、そのリソースの更新は拒否されます。
デフォルトの拒否ポリシーを実装すると、リスクが発生する可能性があります。ポリシーに別の
Allowステートメント(ワイルドカード文字 (*) を含むAllowステートメントなど)が存在する場合、特定のリソースの更新権限が意図せずに付与される可能性があります。明示的な Deny ステートメントは、すべての Allow ステートメントよりも優先されます。Denyステートメントを使用して、リソースが確実に保護されるようにすることができます。
リソースタイプのすべてのインスタンスの更新を防止する
次のポリシーは、ApsaraDB RDS インスタンスに対するすべての更新アクションを拒否します。
Allowステートメントを使用して、ALIYUN::RDS::DBInstance タイプのリソースを除くすべてのスタックリソースに対するすべての更新アクションを許可できます。Allowステートメントは、Denyステートメントが Allow ステートメントよりも優先されるため、ApsaraDB RDS インスタンスには適用されません。Statement: - Effect: Deny Action: Update:* Principal: '*' Resource: '*' Condition: StringEquals: ResourceType: - ALIYUN::RDS::DBInstance - Effect: Allow Action: Update:* Principal: '*' Resource: '*'ネストされたスタックの更新を防止する
次のポリシーは、ROS ネストされたスタックに対するすべての更新アクションを拒否します。
Allowステートメントを使用して、ALIYUN::ROS::Stack タイプのリソースを除くすべてのスタックリソースに対するすべての更新アクションを許可できます。Allowステートメントは、DenyステートメントがAllowステートメントよりも優先されるため、ROS スタックリソースには適用されません。Statement: - Effect: Deny Action: Update:* Principal: '*' Resource: '*' Condition: StringEquals: ResourceType: - ALIYUN::ROS::Stack - Effect: Allow Action: Update:* Principal: '*' Resource: '*'