本文为您介绍资源栈策略的定义,以及设置、更新和修改资源栈策略的方法。

背景信息

创建资源栈时,允许对所有资源执行更新操作,具有资源栈更新权限的用户可以更新资源栈中的所有资源。更新时,一些资源可能需要中断。使用资源栈策略可以防止资源栈资源在资源栈更新过程中被意外更新或删除。

资源栈策略是一个JSON/YAML文档,该文档定义可对指定资源执行的更新操作。

设置资源栈策略后,ROS将保护资源栈中的所有资源。您可在资源栈策略中为资源指定明确的Allow语句,允许对特定资源进行更新。您只能为每个资源栈定义一个资源栈策略,但一个策略可以保护多个资源。资源栈策略适用于所有尝试更新资源栈的ROS用户。

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

示例资源栈策略

如下示例表示资源栈策略阻止更新WebServers资源:

{
  "Statement" : [
    {
      "Effect" : "Allow",
      "Action" : "Update:*",
      "Principal": "*",
      "Resource" : "*"
    },
    {
      "Effect" : "Deny",
      "Action" : "Update:*",
      "Principal": "*",
      "Resource" : "LogicalResourceId/WebServers"
    }
  ]
}

各元素说明如下:

  • Allow:允许对所有资源执行的操作。
  • Deny:为具有WebServers逻辑ID的资源阻止执行的操作。
  • Principal:策略应用的实体。仅支持星号(*),表示策略应用于所有主体。
说明 在资源栈更新期间,ROS自动更新依赖其他更新的资源。例如:ROS自动更新引用更新的资源。但如果这些资源与资源栈策略关联,您必须具有权限才能进行更新。

定义资源栈策略

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

您可定义一个带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进行修改。

资源栈策略适用于所有尝试更新资源栈的ROS用户。您不能将不同的资源栈策略与不同的用户关联。

有关如何编写资源栈策略的信息,请参见定义资源栈策略

  • 在创建资源栈时设置资源栈策略(控制台)
    1. 登录资源编排控制台
    2. 在左侧导航栏单击资源栈
    3. 资源栈列表页面,单击创建资源栈
    4. 创建资源栈向导的选择模板页面,根据所需选择模板,单击下一步
    5. 创建资源栈向导的配置模板参数页面,根据控制台提示,配置资源栈名称参数录入,单击下一步
    6. 创建资源栈向导的配置资源栈页面,选择资源栈策略输入资源栈策略资源栈策略
    7. 配置资源栈策略。
      • 在控制台中直接编写策略,请选择输入资源栈策略,直接输入资源栈策略。
      • 在单独文件中定义策略,请选择上传文件,上传包含资源栈策略的文件。
    8. 按照创建资源栈向导提示继续配置,完成资源栈创建。
  • 在创建资源栈时设置资源栈策略(CLI)

    使用aliyun ros CreateStack--StackPolicyBody设置可修改的策略,或使用aliyun ros CreateStack--StackPolicyURL指定包含策略的文件。

    使用aliyun ros CreateChangeSet--StackPolicyBody设置可修改的策略,或使用aliyun ros CreateChangeSet--StackPolicyURL指定包含策略的文件。

  • 在现有资源栈上设置资源栈策略(仅限CLI)
    使用aliyun ros SetStackPolicy--StackPolicyBody 设置可修改的策略,或使用aliyun ros SetStackPolicy--StackPolicyURL指定包含策略的文件。
    说明 要将策略添加到现有资源栈中,您必须具有SetStackPolicy操作权限。

更新受保护资源

要更新受保护的资源时,可创建一个覆盖资源栈策略并允许对这些资源进行更新的临时策略。覆盖策略不会永久更改资源栈策略。

要更新保护的资源,您必须具有SetStackPolicy操作权限。设置ROS权限的操作方法,请参见使用RAM控制资源访问

说明 在资源栈更新期间,ROS自动更新依赖其他更新的资源。例如:ROS自动更新引用更新的资源。如果这些资源与资源栈策略关联,则您必须具有权限才能进行更新。
  • 更新受保护的资源(控制台)
    1. 登录资源编排控制台
    2. 在左侧导航栏单击资源栈
    3. 资源栈列表页面,找到需要更新的资源栈,单击右侧操作列中的更新
    4. 编辑资源栈向导的配置模板参数页面,根据控制台提示,选择输入临时资源栈策略更新资源栈策略
    5. 配置临时资源栈策略。

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

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

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

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

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

修改资源栈策略

要保护其他资源或从资源中删除保护,请修改资源栈策略。例如:当您将要保护的数据库添加到资源栈时,会将该数据库的Deny语句添加到资源栈策略。要修改策略,您具有SetStackPolicy的使用权限。

  • 修改资源栈策略(控制台)
    1. 登录资源编排控制台
    2. 在左侧导航栏单击资源栈
    3. 资源栈列表页面,找到需要修改的资源栈,单击资源栈名称列的资源栈ID。
    4. 单击资源栈信息页签,在资源栈策略区域单击编辑
    5. 在弹出的修改资源栈策略对话框,输入资源栈策略。修改资源栈策略
    6. 单击确认
  • 修改资源栈策略(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" : "*"
        }
      ]
    }
  • 阻止对单个资源的更新。
    {
      "Statement" : [
        {
          "Effect" : "Deny",
          "Action" : "Update:*",
          "Principal": "*",
          "Resource" : "LogicalResourceId/WebServers"
        },
        {
          "Effect" : "Allow",
          "Action" : "Update:*",
          "Principal": "*",
          "Resource" : "*"
        }
      ]
    }

    您可以使用默认拒绝来获得与上一示例相同的结果。设置资源栈策略时,ROS会拒绝未显式允许的任何更新。以下策略允许对除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" : "*"
        }
      ]
    }