权限策略¶
消息队列 RocketMQ 的权限管理是通过阿里云的访问控制 RAM(Resource Access Management)产品实现的。使用 RAM 可以让您避免与其他用户共享云账号密钥,即 AccessKey(包含 AccessKeyId 和 AccessKeySecret),按需为用户分配最小权限。本文介绍消息队列 RocketMQ 在 RAM 中的权限策略。
在 RAM 中,权限策略是用语法结构描述的一组权限的集合,可以精确地描述被授权的 Resource(资源集)、Action(操作集)以及授权条件。消息队列 RocketMQ 有以下两类 RAM 的权限策略:
系统策略:统一由阿里云创建,您只能使用不能修改,策略的版本更新由阿里云维护。
自定义策略:您可以自主创建、更新和删除,策略的版本更新由您自己维护。
系统策略¶
消息队列 RocketMQ 目前提供三种系统默认的权限策略。
权限策略名称|说明 AliyunMQFullAccess|管理消息队列 RocketMQ 的权限,等同于主账号的权限,被授予该权限的 RAM 用户具有所有消息收发权限且有控制台所有功能操作权限。 AliyunMQPubOnlyAccess|消息队列 RocketMQ 的发布权限,被授予该权限的 RAM 用户具有使用主账号所有资源通过 SDK 发送消息的权限。 AliyunMQSubOnlyAccess|消息队列 RocketMQ 的订阅权限,被授予该权限的 RAM 用户具有使用主账号所有资源通过 SDK 订阅消息的权限。
自定义策略¶
自定义权限策略(Policy)可以满足您更细粒度的授权需求。
消息队列 RocketMQ 的 Resource 与 Action 的对应规则 在消息队列 RocketMQ 中,实例、Topic 和 Group 各为一种 Resource,对这些 Resource 授予的权限即为 Action。Topic 和 Group 的 Resource 命名格式因实例是否有命名空间而异。您可在消息队列 RocketMQ 控制台的实例管理页面查看实例是否有命名空间。
消息队列 RocketMQ 的 Resource 和 Action 的可选值和对应规则如下。
Resource |
命名格式 |
Action |
备注 |
||
---|---|---|---|---|---|
有命名空间 |
无命名空间 |
Action 名称 |
说明 |
||
实例 |
acs:mq:::{instanceId} |
acs:mq:::{instanceId} |
mq:OnsInstanceBaseInfo |
查询实例基本信息 |
授予某 RAM 用户 Topic 和 Group 的相关权限前,需授予该用户 Topic 和 Group 所在实例的 “mq:OnsInstanceBaseInfo” 权限。 |
mq:OnsIntanceUpdate |
更新实例 |
无 |
|||
mq:OnsInstanceCreate |
创建实例 |
无 |
|||
mq:OnsIntanceDelete |
删除实例(慎用) |
无 |
|||
Topic |
acs:mq:::{instanceId}%{topic} |
acs:mq:::{topic} |
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:::{groupId} |
mq:SUB |
消息订阅 |
授予某 RAM 用户 Group 的相关权限前,需授予该用户 Group 所在实例的 “mq:OnsInstanceBaseInfo” 权限。 |
mq:OnsGroupCreate |
创建 Group |
||||
mq:OnsGroupDelete |
删除 Group |
常用策略示例 如需直接复制示例代码,使用时请删除注释内容,即 “//” 及以后的文字说明。
示例一:授予实例中某 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 代替
]
}
]
}