消息队列 RocketMQ 版的权限管理是通过阿里云的访问控制 RAM(Resource Access Management)产品实现的。使用 RAM 可以让您避免与其他用户共享云账号密钥,即 AccessKey(包含 AccessKeyId 和 AccessKeySecret),按需为用户分配最小权限。本文介绍消息队列 RocketMQ 版在 RAM 中的权限策略和示例。

背景信息

在 RAM 中,权限策略是用权限策略语法和结构描述的一组权限的集合,可以精确地描述被授权的 Resource(资源集)、Action(操作集)以及授权条件。详情请参见权限策略语法和结构

消息队列 RocketMQ 版有以下两类 RAM 的权限策略:

系统策略

消息队列 RocketMQ 版目前提供以下 4 种系统默认的权限策略。

权限策略名称 说明
AliyunMQFullAccess 管理消息队列 RocketMQ 版的权限,等同于主账号的权限,被授予该权限的 RAM 用户具有所有消息收发权限且有控制台所有功能操作权限。
AliyunMQPubOnlyAccess 消息队列 RocketMQ 版的发布权限,被授予该权限的 RAM 用户具有使用主账号所有资源通过 SDK 发送消息的权限。
AliyunMQSubOnlyAccess 消息队列 RocketMQ 版的订阅权限,被授予该权限的 RAM 用户具有使用主账号所有资源通过 SDK 订阅消息的权限。
AliyunMQReadOnlyAccess 消息队列 RocketMQ 版的只读权限,被授予该权限的 RAM 用户仅有通过访问控制台或调用管控 API 读取资源信息的权限。

自定义策略

自定义权限策略(Policy)可以满足您更细粒度的授权需求。

消息队列 RocketMQ 版中,实例、Topic 和 Group 各为一种 Resource,对这些 Resource 授予的权限即为 Action。Topic 和 Group 的 Resource 命名格式因实例是否有命名空间而异。您可在消息队列 RocketMQ 版控制台的实例详情页面查看实例是否有命名空间。

消息队列 RocketMQ 版的 Resource 和 Action 的可选值和对应规则如下。

说明 {instanceId}{topic}{groupId} 均需替换为您实际的资源信息。例如,{groupId} 替换为 GID_xxx。
Resource 命名格式 Action 备注
有命名空间 无命名空间 Action 名称 说明
实例 acs:mq:*:*:{instanceId}

示例:acs:mq:*:*:MQ_INST_138015630679****_BcZwWZ9k

acs:mq:*:*:{instanceId}

示例:acs:mq:*:*:MQ_INST_138015630679****_BcZwWZ9k

mq:OnsInstanceBaseInfo 查询实例基本信息 授予某 RAM 用户 Topic 和 Group 的相关权限前,需授予该用户 Topic 和 Group 所在实例的 mq:OnsInstanceBaseInfo 权限。
mq:OnsIntanceUpdate 更新实例
mq:OnsInstanceCreate 创建实例
mq:OnsIntanceDelete 删除实例(慎用)
Topic acs:mq:*:*:{instanceId}%{topic}

示例:acs:mq:*:*:MQ_INST_138015630679****_BcZwWZ9k%Topic-test

acs:mq:*:*:{topic}

示例:acs:mq:*:*:Topic-test

mq:PUB 消息发布 授予某 RAM 用户 Topic 的相关权限前,需授予该用户 Topic 所在实例的 mq:OnsInstanceBaseInfo 权限。
mq:SUB 消息订阅
mq:OnsTopicCreate 创建 Topic
mq:OnsTopicDelete 删除 Topic
mq:OnsTopicUpdateInfo 更新 Topic 备注
Group acs:mq:*:*:{instanceId}%{groupId}

示例:acs:mq:*:*:MQ_INST_138015630679****_BcZwWZ9k%GID_test

acs:mq:*:*:{groupId}

示例:acs:mq:*:*:GID_test

mq:SUB 消息订阅 授予某 RAM 用户 Group 的相关权限前,需授予该用户 Group 所在实例的 mq:OnsInstanceBaseInfo 权限。

权限策略示例

如需直接复制示例代码,使用时请删除注释内容,即 “//” 及以后的文字说明。示例中的 {instanceId}{topic}{groupId} 均需替换为您实际的资源信息。例如,{groupId} 替换为 GID_xxx。

  • 示例一:授予实例中某 Topic 和 Group 的权限
    • 适用于有命名空间的实例
          {
              "Version":"1",
              "Statement":[
                  {    // 授予实例的权限,授予 Topic 和 Group 的权限前请先授予相应实例的权限(适用于有命名空间的实例)。
                      "Effect":"Allow",
                      "Action":[
                          "mq:OnsInstanceBaseInfo"
                      ],
                      "Resource":[
                          "acs:mq:*:*:{instanceId}"
                      ]
                  },
                  {    // 授予 Topic 的消息发布和订阅权限。
                      "Effect":"Allow",
                      "Action":[
                          "mq:PUB",    
                          "mq:SUB"
                      ],
                      "Resource":[
                          "acs:mq:*:*:{instanceId}%{topic}"
                      ]
                  },
                  {    // 授予 Group 的权限。
                      "Effect":"Allow",
                      "Action":[
                          "mq:SUB"
                      ],
                      "Resource":[
                          "acs:mq:*:*:{instanceId}%{groupId}"
                      ]
                  }
              ]
          }                    
    • 适用于无命名空间的实例
      {
          "Version":"1",
          "Statement":[
              {    // 授予实例的权限,授予 Topic 和 Group 的权限前请先授予相应实例的权限(适用于无命名空间的实例)。
                  "Effect":"Allow",
                  "Action":[
                      "mq:OnsInstanceBaseInfo"
                  ],
                  "Resource":[
                      "acs:mq:*:*:{instanceId}"
                  ]
              },
              {    // 授予 Topic 的消息发布和订阅权限。
                  "Effect":"Allow",
                  "Action":[
                      "mq:PUB",    
                      "mq:SUB"
                  ],
                  "Resource":[
                      "acs:mq:*:*:{topic}"
                  ]
              },
              {    // 授予 Group 的权限。
                  "Effect":"Allow",
                  "Action":[
                      "mq:SUB"
                  ],
                  "Resource":[
                      "acs:mq:*:*:{groupId}"
                  ]
              }
          ]
      }                    
  • 示例二:授权整个实例的权限(只适用于有命名空间的实例)

    若要授予整个实例的权限,即该实例中所有资源的所有操作权限,请按以下示例设置。

    {   // 仅适用于有命名空间的实例。
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "mq:*"
                ],
                "Resource": [
                    "acs:mq:*:*:{instanceId}*" //授予该实例的权限,{instanceId} 用实例 ID 代替。
                ]
            }
        ]
    }          

后续步骤