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