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

在 RAM 中,权限策略是用语法结构描述的一组权限的集合,可以精确地描述被授权的 Resource(资源集)、Action(操作集)以及授权条件。微消息队列 MQTT 有以下两类 RAM 的权限策略:

  • 系统策略:统一由阿里云创建,您只能使用不能修改,策略的版本更新由阿里云维护。
  • 自定义策略:您可以自主创建、更新和删除,策略的版本更新由您自己维护。

系统策略

微消息队列 MQTT 目前提供三种系统默认的权限策略。

注意 微消息队列 MQTT 目前不支持独立的系统权限策略。您在为 RAM 用户授予以下系统权限策略时,除了对微消息队列 MQTT 生效外,还会对消息队列 MQ 生效。
权限策略名称 说明
AliyunMQFullAccess 管理微消息队列 MQTT 的权限,等同于主账号的权限,被授予该权限的 RAM 用户具有所有消息收发权限且有控制台所有功能操作权限。
AliyunMQPubOnlyAccess 微消息队列 MQTT 的发布权限,被授予该权限的 RAM 用户具有使用主账号所有资源通过 SDK 发送消息的权限。
AliyunMQSubOnlyAccess 微消息队列 MQTT 的订阅权限,被授予该权限的 RAM 用户具有使用主账号所有资源通过 SDK 订阅消息的权限。

自定义策略

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

微消息队列 MQTT 的 Resource 与 Action 的对应规则

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

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

Resource 命名格式(有命名空间) 命名格式(无命名空间) Action 名称 Action 说明 备注
实例 acs:mq:*:*:{mqttInstanceId} acs:mq:*:*:{mqttInstanceId} mq:OnsMqttInstanceBaseInfo 查询指定实例的基本信息 授予某 RAM 用户 Topic 和 Group 的相关权限前,需授予该用户 Topic 和 Group 所在实例的“mq:OnsMqttInstanceBaseInfo” 权限。
mq:OnsMqttInstanceDelete 删除实例
mq:OnsMqttInstanceUpdate 变更实例的信息
mq:OnsMqttInstanceBind 绑定实例 如果业务需要绑定实例,需要具备操作指定的微消息队列 MQTT 实例以及绑定的持久化实例的权限,持久化实例的权限设置,请参见对应产品的权限控制策略。
mq:OnsMqttInstanceList 获取实例列表
mq:OnsMqttInstanceUpdateWarn 更新指定实例的报警信息
Topic acs:mq:*:*:{storeInstanceId}%{topic} acs:mq:*:*:{topic} mq:OnsMqttQueryClientByTopic 根据 Topic 查询订阅的客户端信息 授予某 RAM 用户 Topic 和 Group 的相关权限前,需授予该用户 Topic 和 Group 所在实例的 “mq:OnsMqttInstanceBaseInfo” 权限。
注意
  • 此处如果是有独立命名空间的实例,则 Topic 需要拼接持久化实例 ID 作为前缀。
  • 此处的 storeInstanceid 指您为微消息队列 MQTT 实例绑定的持久化实例的 ID。您可在微消息队列 MQTT 控制台的实例详情页面获取绑定的持久化实例的 ID。
mq:OnsMqttQueryMsgTransTrend 根据 Topic 查询消息的收发报表
mq:OnsMqttMessageSend 控制台发消息测试
Group ID acs:mq:*:*:{mqttInstanceId}%{groupId} acs:mq:*:*:{groupId} mq:OnsMqttGroupIdCreate 创建 Group ID 授予某 RAM 用户 Topic 和 Group 的相关权限前,需授予该用户 Topic 和 Group 所在实例的 “mq:OnsMqttInstanceBaseInfo” 权限。
注意 此处如果是有独立命名空间的实例,则 Group ID 需要拼接微消息队列 MQTT 实例 ID 作为前缀。
mq:OnsMqttGroupIdList 获取 Group ID 列表
mq:OnsMqttQueryClientByClientId 根据 Client ID 查询设备信息
mq:OnsMqttQueryClientByGroupId 根据 Group ID 查询设备信息
mq:OnsMqttQueryHistoryOnline 根据 Group ID 查询历史在线设备信息
mq:OnsMqttGroupIdDelete 删除 Group ID
mq:OnsMqttDeviceTrace 查询设备轨迹
mq:OnsMqttQueryClientTrace 查询设备的相关消息

常用策略示例

如需直接复制示例代码,使用时请删除注释内容,即 “//” 及以后的文字说明。

  • 示例一:授予特定实例中根据特定 Topic 查询消息报表以及根据 GroupId 查询历史在线连接 的权限
    • 适用于有命名空间的实例
      {
          "Version":"1",
          "Statement":[
              {    // 授予实例的授权,授予 Topic 和 Group 的权限前请先授予相应实例的权限(适用于有命名空间的实例)
                  "Effect":"Allow",
                  "Action":[
                      "mq:OnsMqttInstanceBaseInfo"
                  ],
                  "Resource":[
                      "acs:mq:*:*:{mqttInstanceId}"
                  ]
              },
              {    // 授予 根据 topic 查询资源报表的权限
                  "Effect":"Allow",
                  "Action":[
                      "mq:OnsMqttQueryMsgTransTrend"
                  ],
                  "Resource":[
                      "acs:mq:*:*:{storeInstanceId}%{topic}"
                  ]
              },
              {    // 授予 Group 的权限
                  "Effect":"Allow",
                  "Action":[
                      "mq:OnsMqttQueryHistoryOnline"
                  ],
                  "Resource":[
                      "acs:mq:*:*:{mqttInstanceId}%{groupId}"
                  ]
              }
          ]
       }
    • 适用于无命名空间的实例
      {
          "Version": "1", 
          "Statement": [
              {    //授予实例的授权,授予 Topic 和 Group 的权限前请先授予相应实例的权限(适用于无命名空间的实例)
                  "Effect": "Allow", 
                  "Action": [
                      "mq:OnsMqttInstanceBaseInfo"
                  ], 
                  "Resource": [
                      "acs:mq:*:*:{mqttInstanceId}"
                  ]
              }, 
              {    // 授予 根据 topic 查询资源报表的权限
                  "Effect": "Allow", 
                  "Action": [
                      "mq:OnsMqttQueryMsgTransTrend"
                  ], 
                  "Resource": [
                      "acs:mq:*:*:{topic}"
                  ]
              }, 
              {    // 授予 Group 的权限
                  "Effect": "Allow", 
                  "Action": [
                      "mq:OnsMqttQueryHistoryOnline"
                  ], 
                  "Resource": [
                      "acs:mq:*:*:{groupId}"
                  ]
              }
          ]
      }
  • 示例二:授权整个实例的权限(只适用于有命名空间的实例)

    若要授予整个实例的权限,即该实例中所有资源的所有操作权限,请按以下示例设置。
    {   // 仅适用于有命名空间的实例
        "Version": "1", 
        "Statement": [
            {
                "Effect": "Allow", 
                "Action": [
                    "mq:*"
                ], 
                "Resource": [
                    "acs:mq:*:*:{mqttInstanceId}*" //授予该实例的权限,{mqttInstanceId} 用实例 ID 代替
                ]
            }
        ]
    }

后续步骤

更多信息