使用资源栈策略可以防止资源栈资源在资源栈更新过程中被意外更新或删除。本文为您介绍资源栈策略的定义,以及如何设置和更新资源栈策略。
背景信息
资源栈策略是一个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格式的文件。 
 
- 在合规预检页面,完成合规检测,然后单击下一步。 说明- 目前合规预检功能仅支持为部分资源提供合规预检功能。更多信息,请参见资源编排支持合规预检。 - 在检测规则区域,添加检测规则。 - 您可以根据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: '*'