如果系统权限策略不能满足您的要求,您可以创建自定义权限策略实现最小授权。使用自定义权限策略有助于实现权限的精细化管控,是提升资源访问安全的有效手段。本文介绍云消息队列 RocketMQ 版使用自定义权限策略的场景和策略示例。
什么是自定义权限策略
在基于RAM的访问控制体系中,自定义权限策略是指在系统权限策略之外,您可以自主创建、更新和删除的权限策略。自定义权限策略的版本更新需由您来维护。
创建自定义权限策略后,需为RAM用户、用户组或RAM角色绑定权限策略,这些RAM身份才能获得权限策略中指定的访问权限。
已创建的权限策略支持删除,但删除前需确保该策略未被引用。如果该权限策略已被引用,您需要在该权限策略的引用记录中移除授权。
自定义权限策略支持版本控制,您可以按照RAM规定的版本管理机制来管理您创建的自定义权限策略版本。
操作文档
自定义权限授权示例
如需直接复制示例代码,请替换如下内容:
{regionId}:替换为实例所属的地域ID。具体内容,请参见服务接入点。
{accountId}:替换为您的阿里云账号ID。
{InstanceId}:替换为云消息队列 RocketMQ 版的实例ID。
{ConsumerGroupId}:替换为Group ID。
{TopicName}:替换为Topic名称。
示例一:授予RAM用户对于某个实例的所有操作权限
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"rocketmq:ListInstances"
],
"Resource": [
"acs:rocketmq:{regionId}:{accountId}:instance/*"
]
},
{
"Effect": "Allow",
"Action": [
"rocketmq:*"
],
"Resource": [
"acs:rocketmq:{regionId}:{accountId}:instance/{InstanceId}*"
]
},
{
"Effect": "Allow",
"Action": [
"rocketmq:ListAnalyticsQuery"
],
"Resource": [
"acs:rocketmq:*:{#accountId}:*/*"
]
}
]
}示例二:授予RAM用户创建实例的权限
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"rocketmq:CreateInstance"
],
"Resource": [
"acs:rocketmq:{regionId}:{accountId}:instance/*"
]
}
]
} 示例三:授予RAM用户删除某个指定Topic的权限
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"rocketmq:DeleteTopic"
],
"Resource": [
"acs:rocketmq:{regionId}:{accountId}:instance/{InstanceId}/topic/{TopicName}"
]
}
]
} 示例四:授予RAM用户所有实例诊断功能的操作权限
{
"Version":"1",
"Statement":[
{
"Effect":"Allow",
"Action":[
"rocketmq:GetAnalyticsQuery",
"rocketmq:SubmitAnalyticsQuery",
"rocketmq:ListAnalyticsQuery"
],
"Resource":[
"acs:rocketmq:*:{#accountId}:*/*"
]
}
]
}示例五:授予 RAM 用户查看实例列表及操作指定实例的权限
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"rocketmq:ListInstances",
"rocketmq:GetUserTags"
],
"Resource": [
"acs:rocketmq:*:*:instance/*"
]
},
{
"Effect": "Allow",
"Action": [
"rocketmq:*"
],
"Resource": [
"acs:rocketmq:{regionId}:{accountId}:instance/{InstanceId}*"
]
}
]
}List 类操作(如 ListInstances、GetUserTags)查询的是账号下所有实例,其 Resource 必须配置为通配符格式(acs:rocketmq:*:*:instance/*),不可限制为具体实例 ARN。对指定实例的读写操作(rocketmq:*)可限制为具体实例 ARN(acs:rocketmq:{regionId}:{accountId}:instance/{InstanceId}*)。若仅授权特定实例资源而未包含 List 权限,RAM 用户将无法在控制台查看实例列表,API 调用时会报 NoPermission 错误。
授权信息参考
使用自定义权限策略,您需要了解业务的权限管控需求,并了解云消息队列 RocketMQ 版的授权信息。详细内容请参见授权信息。
常见问题
为什么 HTTP 协议访问 RocketMQ 时报错 valid resource owner failed 或 AccessDenied (OwnerId forbidden)?
原因分析:该报错通常由以下原因导致:
签名构造错误:HTTP 请求的签名未严格遵循 HMAC-SHA256 和 V4 签名规范,例如 Canonical String 构造不符合规范,或 Header 格式不正确。
Resource 配置不匹配:RAM 策略中 Resource 字段未精确匹配目标 Topic 或实例。注意 Topic 名称大小写敏感,需与实际创建的 Topic 名称完全一致。例如,RAM 策略中 Resource 格式应为
acs:mq:*:*:instance/{InstanceId}/topic/{TopicName}。凭证权限不足:使用的 AK/STS 凭证未包含
mq:PUB等对应权限。
解决方法
检查代码中的签名算法是否严格遵循 HMAC-SHA256 和 V4 签名规范。
确认 RAM 策略中 Resource 格式为
acs:mq:*:*:instance/{InstanceId}/topic/{TopicName},并与实际资源完全一致(注意 Topic 名称大小写)。验证使用的 AK/STS 凭证是否具备
mq:PUB等对应权限。
建议:优先使用阿里云提供的 SDK 进行消息收发,SDK 已封装完整的签名和鉴权逻辑,可有效避免手动构造 HTTP 请求带来的鉴权问题。
能否通过 RequestId 查询 RocketMQ 权限校验失败的具体原因?
目前不支持通过 RequestId 查询细粒度的 IAM 鉴权决策过程(例如被哪条具体策略拒绝),后台日志仅返回通用的 AccessDenied 错误信息,无法进一步定位拒绝原因。如需排查权限校验失败问题,建议从以下方面自行检查:
权限策略配置:确认 RAM 用户或角色绑定了正确的自定义权限策略,Action 和 Resource 字段与实际操作匹配。
Resource 匹配规则:检查 Resource ARN 格式是否正确,特别注意 List 类操作(如
ListInstances)需使用通配符格式(acs:rocketmq:*:*:instance/*),不可限制为具体实例 ARN。签名逻辑:如使用 HTTP 协议,检查请求签名是否符合 HMAC-SHA256 和 V4 规范。
权限边界与信任策略:如使用 RAM 角色,核对角色的权限边界(Permissions Boundary)和信任策略(Trust Policy)配置是否正确。
如何为 RAM 用户授予配置 RocketMQ 报警所需的云监控权限?
RocketMQ 自定义权限策略仅控制 RocketMQ 资源的操作权限,不包含云监控相关权限。如需为 RAM 用户授予配置 RocketMQ 报警的权限,需在 RAM 控制台单独授权云监控系统策略。操作步骤如下:
使用 RAM 管理员账号登录RAM 控制台。
在左侧导航栏,选择身份管理 > 用户。
找到目标 RAM 用户,单击操作列中的添加权限。
在添加权限面板,授权范围选择整个云账号,选择系统策略。
在搜索框中输入
AliyunCloudMonitorReadOnlyAccess,勾选对应策略。单击确认新增授权。
AliyunCloudMonitorReadOnlyAccess 为云监控只读权限,支持 RAM 用户查看监控指标和配置报警规则。如需更多云监控操作权限,可根据实际需求选择 AliyunCloudMonitorFullAccess 系统策略,或创建自定义权限策略。
RocketMQ 5.0 开发环境模拟发送消息应使用 RAM 自定义权限还是 ACL?
推荐在开发测试场景中使用 ACL(访问控制列表)进行消息收发权限控制,而非 RAM 自定义权限策略。两者适用场景不同:
权限类型 | 适用场景 | 管控粒度 |
RAM 自定义权限 | 阿里云账号级别的资源操作管控,例如创建/删除实例、Topic、消费者分组等 | 控制台和 OpenAPI 操作 |
ACL | 应用级别的消息收发权限管控,例如指定 Client ID 允许发布/订阅哪些 Topic | 消息收发操作 |
在开发环境模拟发送消息时,推荐通过 ACL 为 Client ID 绑定相应的发布/订阅权限,实现应用级别的精细化控制。RAM 自定义权限适用于管控阿里云资源层面的操作,不适合直接用于应用级消息收发场景。