通过本文您可以了解资源栈策略的定义,以及设置、更新和修改资源栈策略的方法。

背景信息

在创建资源栈时,允许对所有资源执行所有更新操作。默认情况下,具有资源栈更新权限的任何人均可更新资源栈中的所有资源。在更新期间,一些资源可能需要中断。使用资源栈策略可以防止资源栈资源在资源栈更新过程中被意外更新或删除。资源栈策略是一个JSON/YAML文档,该文档定义可对指定资源执行的更新操作。

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

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

主题

示例资源栈策略

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

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

当您设置资源栈策略时,将默认保护所有资源。为了允许对所有资源进行更新,我们添加了一个Allow语句来允许对所有资源执行的所有操作。虽然Allow语句指定所有资源,但显式Deny语句将为具有WebServers逻辑 ID的资源覆盖前者。此Deny语句阻止对WebServers资源进行的所有更新操作。

需要Principal元素,但仅支持星号(*),这意味着语句适用于所有委托人(用户或服务等)。

说明 在资源栈更新期间,ROS自动更新依赖其他更新的资源。例如:ROS自动更新引用更新的资源。但如果这些资源与资源栈策略关联,您必须具有权限才能更新。

定义资源栈策略

定义资源栈策略在创建资源栈时,未设置资源栈策略,因此允许对所有资源执行所有更新操作。要阻止对资源栈资源执行更新操作,可定义一个资源栈策略,然后对资源栈设置该策略。资源栈策略是一个JSON/YAML文档,它定义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 语句始终覆盖允许操作。

    您可以对资源类型使用星号(*)。例如,您可以使用通配符拒绝所有ALIYUN ECS资源(如实例、安全组和子网)的更新权限,如以下示例所示:

    "Condition" : {
      "StringLike" : {
        "ResourceType" : ["ALIYUN::ECS::*"]
      }
    }

    使用通配符时,必须使用StringLike条件。

设置资源栈策略

您可以使用控制台或ALIYUN ROS CLI在创建资源栈时应用资源栈策略。您也可以使用ALIYUN ROS CLI将资源栈策略应用于现有资源栈。应用资源栈策略后,无法将其从资源栈中删除,但您可以使用ALIUN ROS CLI修改该策略。

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

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

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

    aliyun ros CreateStack命令与--StackPolicyBody选项结合使用可键入修改的策略,或将此命令与--StackPolicyURL选项结合使用可指定包含策略的文件。

    aliyun ros CreateChangeSet命令与--StackPolicyBody选项结合使用可键入修改的策略,或将此命令与--StackPolicyURL选项结合使用可指定包含策略的文件。

  • 在现有资源栈上设置资源栈策略(仅限CLI)
    aliyun ros SetStackPolicy命令与--StackPolicyBody 选项结合使用可键入修改的策略,或将此命令与--StackPolicyURL选项结合使用可指定包含策略的文件。
    说明 要将策略添加到现有资源栈中,您必须有权执行ROS SetStackPolicy 操作。

更新受保护资源

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

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

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

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

      {
        "Statement" : [
          {
            "Effect" : "Allow",
            "Action" : "Update:*",
            "Principal": "*",
            "Resource" : "*"
          }  
        ]
      }
      说明 ROS仅在此更新期间应用覆盖策略。覆盖策略不会永久更改资源栈策略。如果您需要修改资源栈策略,请参见修改资源栈策略
    6. 按照编辑资源栈向导提示继续配置,完成资源栈更新。
  • 更新受保护资源(CLI)

    aliyun ros UpdateStack命令与--StackPolicyDuringUpdateBody选项结合使用可键入修改的策略,或将此命令与 --StackPolicyDuringUpdateURL 选项结合使用可指定包含策略的文件。

    aliyun ros CreateChangeSet命令与--StackPolicyDuringUpdateBody选项结合使用可键入修改的策略,或将此命令与--StackPolicyDuringUpdateURL选项结合使用可指定包含策略的文件。

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

修改资源栈策略

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

  • 修改资源栈策略(控制台)
    1. 登录资源编排控制台
    2. 在左侧导航栏选择资源栈
    3. 资源栈列表中,单击需要修改的资源栈ID
    4. 资源栈信息页面的资源栈策略区域,单击编辑
    5. 修改资源栈策略页面,输入资源栈策略。修改资源栈策略
    6. 单击确认
  • 修改资源栈策略(CLI)

    aliyun ros SetStackPolicy命令与--StackPolicyBody选项结合使用可键入修改的策略,或将此命令与 --StackPolicyURL 选项结合使用可指定包含策略的文件。

    您无法删除资源栈策略。要从所有资源删除全部保护,您可修改策略以明确允许对所有资源执行全部操作。以下策略允许对所有资源进行全部更新:

    {
      "Statement" : [
        {
          "Effect" : "Allow",
          "Action" : "Update:*",
          "Principal": "*",
          "Resource" : "*"
        }
      ]
    }
  • 在更新资源栈时修改资源栈策略(CLI)

    aliyun ros UpdateStack命令与--StackPolicyBody选项结合使用可键入修改的策略,或将此命令与--StackPolicyURL选项结合使用可指定包含策略的文件。

    aliyun ros CreateChangeSet命令与--StackPolicyBody选项结合使用可键入修改的策略,或将此命令与--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" : "*"
        }
      ]
    }