问题背景
由于公司权限控制,需要对阿里云RDS MySQL实例的进行资源隔离,即单一RAM子账号只能访问特定的资源,下面我们举一个例子来看看如何处理。
操作流程
1、主账号下有两个RDS实例A和B,我们选其中实例A来赋予RAM子账号独立访问操作的权限
2、首先我们在RAM访问控制中创建RAM子账号。
3、创建自定义权限策略
{ "Statement": [ { "Action": "rds:Describe*", "Effect": "Allow", "Resource": "acs:rds:*:*:dbinstance/rm-bxxxxxxxxo" }, { "Action": "rds:DescribeDBInstances", "Effect": "Allow", "Resource": "*" } ], "Version": "1" }
RDS支持policy在resource中指定资源实例ID写法。
4、授权操作,确认后点击【完成】即可。具体详见为RAM账户授权。
授权成功。
5、使用对应的RAM账号登录验证:
6、此时,控制台还是能看到实例B。
7、访问实例A正常的,由于没有实例B的授权,因此点进实例页面会发现报错:“该实例不存在,请确认实例是否存在或已过期”,这个是因为没有授权导致。
这个问题的原因是由于单个实例授权在控制台现在不支持,实例列表页请求本身不带资源ID鉴权不会通过,现在只能支持到acs:rds:*:主账号uid:dbinstance/*这种策略,单一api调用是可以用实例级别的策略。
那能不能进一步优化,隐藏掉未指定的实例?接着往下看
1、首先我们使用主账号回到RAM访问控制>用户页面为RAM账户绑定标签,注意:Tag的key和value不要用大写字母。
2、因为在【资源管理/标签】对应的标签就自动创建了,我们再给实例绑定该标签。
3、验证下,按照标签检索
4、回到前面自定义的授权页面,变更授权
5、变更后:
文本格式:
{ "Statement": [ { "Action": "rds:*", "Effect": "Allow", "Resource": "acs:rds:*:*:*", "Condition": { "StringEquals": { "rds:ResourceTag/chytag": "test" } } }, { "Action": "rds:DescribeTag*", "Effect": "Allow", "Resource": "*" } ], "Version": "1" }
更详细授权如下:
{ "Statement": [ { "Action": "rds:Describe*", "Effect": "Allow", "Resource": "acs:rds:*:*:*", "Condition": { "StringEquals": { "rds:ResourceTag/chytag": "test" } } }, { "Action": "rds:DescribeTag*", "Effect": "Allow", "Resource": "*" }, { "Action": [ "rds:DescribeSQLCollectorVersion", "rds:DescribeVSwitches" ], "Effect": "Allow", "Resource": "acs:rds:*:*:*" }, { "Action": [ "hdm:Get*", "hdm:Describe*", "hdm:Query*" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "actiontrail:Lookup*", "actiontrail:Describe*", "actiontrail:Get*", "actiontrail:Check*", "actiontrail:List*" ], "Resource": "*", "Effect": "Allow" } ], "Version": "1" }
6、RAM子账号登录验证:RDS实例列表控制台
7、通过Tag标签检索
成功获取实例,且具有该RDS实例的所有权限
两种方案各有利弊吧,都有不太妥当的地方,期待阿里云继续优化吧。