IBM Cloud Docs
使用通配符策略分配访问权

使用通配符策略分配访问权

当您分配对某些启用 IAM 的服务的访问权时,可以使用 策略用于向用户、服务标识和访问组授予帐户资源访问权的方法。 访问策略包含主体、目标和角色。 中的高级操作程序来授予对满足特定命名约定的资源的访问权。 通过使用通配符策略,可以减少管理对某些资源的访问权所需的策略数。

要分配访问权,您需要对资源具有管理员角色。 有关更多信息,请参阅 IAM 访问权

JSON 策略文档

大多数访问策略以 JSON 文档形式存储在 IBM Cloud® 中。 在策略中使用 stringEquals 运算符时,将在查询与目标字符串之间执行精确的字符串匹配。 使用 stringMatch 运算符时,将使用星号 (*),问号 (?) 或字面值在模式与目标字符串之间执行区分大小写的字符串匹配。 星号 (*) 表示字符串中零个或多个字符的任何序列,问号 (?) 表示任何单个字符。 请参阅以下示例:

  • *dev* 与包含 dev 的任何字符串匹配
  • dev* 与以 dev 开头的任何字符串匹配
  • *dev 与以 dev 结尾的任何字符串匹配

请参阅要为其分配访问权的特定服务的文档,以获取有关该服务的特定属性的受支持操作程序的详细信息。

使用星号 (*) 作为通配符

以下示例显示了如何创建策略以授予用户访问权来管理特定帐户中以 dev 开头的所有 Event Streams 主题。

{
    "type": "access",
    "subjects": [
        {
            "attributes": [
                {
                    "name": "iam_id",
                    "value": "IBMid-12345"
                }
            ]
        }
    ],
    "roles": [
        {
            "role_id": "crn:v1:bluemix:public:iam::::serviceRole:Manager"
        }
    ],
    "resources": [
        {
            "attributes": [
                {
                    "name": "accountId",
                    "value": "d727f71e99b14534b3267fab8cc9b09a"
                },
                {
                    "name": "serviceName",
                    "value": "messagehub"
                },
                {
                    "name": "resourceType",
                    "value": "topic"
                },
                {
                    "name": "resource",
                    "operator": "stringMatch",
                    "value": "dev*"
                }
            ]
        }
    ]
}

使用问号 (?) 作为通配符

以下示例显示了如何创建策略以授予用户编辑以特定模式结束的任何 Event Streams 主题的访问权。

在行 "value": "*??81" 上,* 指示零个或多个字符,并与以 ??81 结尾的任何字符串匹配。 ? 表示单个字符。 由于有两个 ??,因此生成的模式与以 81 结尾的四个或多个字符的字符串匹配。

{
    "type": "access",
    "subjects": [
        {
            "attributes": [
                {
                    "name": "iam_id",
                    "value": "IBMid-12345"
                }
            ]
        }
    ],
    "roles": [
        {
            "role_id": "crn:v1:bluemix:public:iam::::serviceRole:Writer"
        }
    ],
    "resources": [
        {
            "attributes": [
                {
                    "name": "accountId",
                    "value": "d727f71e99b14534b3267fab8cc9b09a"
                },
                {
                    "name": "serviceName",
                    "value": "messagehub"
                },
                {
                    "name": "resourceType",
                    "operator": "stringEquals"
                    "value": "topic",
                },
                {
                    "name": "resource",
                    "operator": "stringMatch",
                    "value": "*??81"
                }
            ]
        }
    ]
}

使用星号 (*) 和问号 (?) 作为文字字符

您可以表达星号(* ) 和问号 (? ) 作为文字字符,通过将每个字符括在两组花括号中来确保它们不会被解释为通配符 {{}}

以下示例显示了如何创建策略,使用户可以编辑Event Streams包含文字字符的主题 *?。 主题必须以模式 .?.log 结尾,表示句点 . 之间的任何单个字符后跟 log 字符串。

{
    "type": "access",
    "subjects": [
        {
            "attributes": [
                {
                    "name": "iam_id",
                    "value": "IBMid-12345"
                }
            ]
        }
    ],
    "roles": [
        {
            "role_id": "crn:v1:bluemix:public:iam::::serviceRole:Writer"
        }
    ],
    "resources": [
        {
            "attributes": [
                {
                    "name": "accountId",
                    "value": "d727f71e99b14534b3267fab8cc9b09a"
                },
                {
                    "name": "serviceName",
                    "value": "messagehub"
                },
                {
                    "name": "resourceType",
                    "operator": "stringEquals"
                    "value": "topic",
                },
                {
                    "name": "resource",
                    "operator": "stringMatch",
                    "value": "dev-topic-{{*}}-{{?}}.?.log"
                }
            ]
        }
    ]
}

"value": "dev-topic-{{*}}-{{?}}.?.log" 行上,{{*}} 指示字符 *{{?}} 指示字符 ?。 因此,dev-topic-*-?.1.log 之类的主题与此模式匹配。

以下两个示例表示执行 dev* 的区分大小写字符串比较的相同求值。

{
    "name": "resource",
    "operator": "stringMatch",
    "value": "dev{{*}}"
}
{
    "name": "resource",
    "operator": "stringEquals",
    "value": "dev*"
}

字符串比较

下表列出了可用于构建 /v2/policies 语法访问策略的字符串比较运算符。 如需了解各版本的更多信息,请参阅 比较 /v1/policies/v2/policies 语法。 例如,操作员的使用案例,请参阅 基于资源属性的条件

访问策略中可用于条件的字符串比较运算符。
运算符 描述
stringEquals 区分大小写的字符串比较。 在比较之前,布尔值或数字值会被转换为字符串。
stringMatch 在模式与目标字符串之间进行区分大小写的字符串匹配,可以使用星号( * )、问号( ? )、两者或两者都不使用(与字面值相同)。 星号( * )代表字符串中任意零个或多个字符的序列,问号( ? )代表任意单个字符。 您也可以将星号 * 和问号 ? 作为文字值,用两对大括号 {{}} 括起来。
stringExists 布尔值,其中 true 表示字符串必须存在,可以为空。false 表示字符串不能存在。
stringEqualsAnyOf 区分大小写的精确字符串匹配字符串数组中的任意字符串。 最多10个值。
stringMatchAnyOf 区分大小写的字符串匹配字符串数组中的任意字符串。 字符串值可以包含星号( * )、问号( ? )、两者或两者都不包含(与文本值相同)。 星号( * )代表字符串中任意零个或多个字符的序列,问号( ? )代表任意单个字符。 您也可以将星号 * 和问号 ? 作为文字值,用两对大括号 {{}} 括起来。 最多10个值。