使用资源栈策略可以防止资源栈资源在资源栈更新过程中被意外更新或删除。本文为您介绍资源栈策略的定义,以及如何设置和更新资源栈策略。

背景信息

资源栈策略是一个JSON或YAML类型的文档,该文档定义可对指定资源执行的更新操作。创建资源栈时,允许对所有资源执行更新操作,具有资源栈更新权限的用户可以更新资源栈中的所有资源。更新时,一些资源可能需要中断。设置资源栈策略后,ROS将保护资源栈中的所有资源。您可以在资源栈策略中为资源指定明确的Allow语句,允许对特定资源进行更新。

说明
  • 您只能为每个资源栈定义一个资源栈策略,但一个策略可以保护多个资源。
  • 在资源栈更新期间,ROS自动更新依赖其他更新的资源。例如:ROS自动更新引用更新的资源。但如果这些资源与资源栈策略关联,您必须具有权限才能进行更新。

资源栈策略仅在资源栈更新过程中适用。与RAM策略不同,它不提供访问控制,仅将资源栈策略用作故障保护功能来防止意外更新特定资源栈资源。

定义资源栈策略

创建资源栈时,如果未设置资源栈策略,则允许对所有资源执行更新操作。要阻止对资源栈资源执行更新操作,可定义一个资源栈策略,然后对资源栈设置该策略。在创建资源栈时,您可以指定一个包含资源栈策略的文本文件或输入该策略来设置资源栈策略。在资源栈上设置资源栈策略时,默认情况下会拒绝未显式允许的任何更新。

您可定义一个带5个元素的资源栈策略:EffectActionPrincipalResourceCondition

{
  "Statement" : [
    {
      "Effect" : "Deny_or_Allow",
      "Action" : "update_actions",
      "Principal" : "*",
      "Resource" : "LogicalResourceId/resource_logical_ID",
      "Condition" : {
        "StringEquals_or_StringLike" : {
          "ResourceType" : [resource_type, ...]
        }
      }
    }  
  ]
}

各元素说明如下:

  • Effect

    确定是拒绝还是允许对指定资源执行指定的操作。您只能指定DenyAllow,例如:

    "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. 登录资源编排控制台
    2. 在左侧导航栏单击资源栈
    3. 在页面左上角的地域下拉列表,选择资源栈的所在地域。
    4. 资源栈列表页面,单击创建资源栈,然后在下拉列表中选择使用新资源(标准)
    5. 创建资源栈向导的选择模板页面,根据所需选择模板,然后单击下一步
    6. 创建资源栈向导的配置模板参数页面,根据控制台提示,配置资源栈名称参数录入,然后单击下一步
    7. 创建资源栈向导的配置资源栈页面,选择资源栈策略输入资源栈策略资源栈策略
    8. 配置资源栈策略。
      • 输入资源栈策略:直接输入资源栈策略。
      • 上传文件:上传包含资源栈策略的JSON或YAML格式的文件。
    9. 按照控制台提示继续配置,完成资源栈创建。
  • 在创建资源栈时设置资源栈策略(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. 登录资源编排控制台
    2. 在左侧导航栏单击资源栈
    3. 在页面左上角的地域下拉列表,选择资源栈的所在地域。
    4. 资源栈列表页面,单击目标资源栈右侧操作列的更新
    5. 配置模板参数页面,单击下一步
    6. 配置资源栈页面,根据控制台提示,选择输入临时资源栈策略更新资源栈策略
    7. 配置临时资源栈策略。

      指定临时的资源栈策略,仅本次更新生效。覆盖策略必须为您要更新的受保护资源指定Allow语句。例如:要更新所有受保护资源,可以指定允许所有更新的临时覆盖策略。

      {
        "Statement" : [
          {
            "Effect" : "Allow",
            "Action" : "Update:*",
            "Principal": "*",
            "Resource" : "*"
          }  
        ]
      }
    8. 按照控制台提示继续配置,完成资源栈更新。
  • 更新受保护资源(CLI)

    您可以通过以下两种方式更新受保护资源:

    • 调用UpdateStack接口更新

      使用aliyun ros UpdateStack--StackPolicyDuringUpdateBody设置可更新的策略,或使用aliyun ros UpdateStack--StackPolicyDuringUpdateURL 指定包含策略的文件。

    • 调用CreateChangeSet接口更新

      使用aliyun ros CreateChangeSet--StackPolicyDuringUpdateBody设置可更新的策略,或使用aliyun ros CreateChangeSet--StackPolicyDuringUpdateURL指定包含策略的文件。

    说明 ROS仅在此更新期间应用覆盖策略。覆盖策略不会永久更改资源栈策略。

更新资源栈策略

当您需要保护其他资源或从资源中删除保护时,可以更新资源栈策略。例如:当您将要保护的数据库添加到资源栈时,会将该数据库的Deny语句添加到资源栈策略。如果需要更新策略,您必须具有SetStackPolicy的使用权限。

  • 更新资源栈策略(控制台)
    1. 登录资源编排控制台
    2. 在左侧导航栏单击资源栈
    3. 在页面左上角的地域下拉列表,选择资源栈的所在地域。
    4. 资源栈列表页面,单击目标资源栈资源栈名称列的资源栈ID。
    5. 资源栈信息页签的资源栈策略区域,单击编辑
    6. 修改资源栈策略对话框,输入资源栈策略。
    7. 单击确定
  • 更新资源栈策略(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" : "*"
        }
      ]
    }