ポリシー作ってみた
協力会社の人が、「AWSのRDSのリソースの状況とか自分たちでリアルタイムで見たいから、マネジメントコンソールのアカウント欲しい」というので、特定のRDSの情報を見ることだけできるユーザを作ることに。
で、ポリシーの作成とかあまりやったことなかったので、AmazonRDSReadOnlyAccess
のポリシーのJSONのResource
を"*"
からARN指定に変えればいけるんじゃね? と思いコピペ&修正で新しいポリシーをJSONで作ってみる。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"rds:Describe*",
"rds:ListTagsForResource",
"ec2:DescribeAccountAttributes",
"ec2:DescribeAvailabilityZones",
"ec2:DescribeSecurityGroups",
"ec2:DescribeVpcs"
],
"Effect": "Allow",
"Resource": [
"arn:aws:rds:ap-northeast-1:999999999999:db:rds-postgresql-test1",
"arn:aws:rds:ap-northeast-1:999999999999:db:rds-postgresql-test2"
]
},
{
"Action": [
"cloudwatch:GetMetricStatistics",
"logs:DescribeLogStreams",
"logs:GetLogEvents"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
だめでした
このポリシーを付けたユーザでマネジメントコンソールにログインしたところ、怪しいメッセージが・・・。
アカウントの属性の取得に失敗しました。特定のコンソール機能に障害が発生している可能性があります。
RDSのインスタンス一覧を表示したところ、また違うエラーメッセージが。そして、一覧には何も表示されず。
User: arn:aws:iam::999999999999:user/testuser1 is not authorized to perform: rds:DescribeDBInstances
(Service: AmazonRDS; Status Code: 403; Error Code: AccessDenied; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
その後、JSONの構造を変えてみたり、アクション名を足したり引いたりワイルドカードやめてみたりとかしたけど、何やってもエラーは変わらず。
もしかして、メッセージ通り何かの障害かもしれないと思い、サポートに問い合わせることに。
サポートの回答来た
英語で問い合わせたので、回答も英語。Google自動翻訳が以下の通り。
ポリシーのDescribe*権限は、コンソールからアクセスしたときのリソースレベル権限をサポートしていません。リソースレベルの権限とは、ユーザーがアクションを実行することを許可されているリソースを指定する機能を指します。サポートされていないアクション/権限は、すべてのリソース '*'で許可または拒否する必要があります。
たとえば、 'rds:DescribeDBInstances'を実行する権限があると言われているエラーの場合、 'rds-postgresql-test1'というリソースでこれを許可し、RDSコンソールを開くと、エラーが発生します。この理由は、RDSコンソールがすべてのリソースを記述し、単一のDBインスタンスだけを記述することができないためです。したがって、コンソールを介して 'rds:DescribeDBInstances'を呼び出すには、すべてのリソース '*'にアクセス権を許可する必要があります。
ということで、全てのアクションでリソース指定ができるわけじゃない、ということがわかりました。
DeleteDBInstance
のアクションとかだと指定できるみたいです。編集系だといけるんでしょうか。
AWSのドキュメントにも少し書いてました。
API がリソースレベルのアクセス権限をサポートしない場合、ポリシーのそのステートメントは Resource 要素で * を使用する必要があります。
可否の一覧とか無いと思ってググったけど、いい感じのは見つけられなかった。
そういうやり方ができない予感はしていたけど、出来ればポリシー作成時にエラーだして欲しかったぜ。
代替案あったら教えて
結局あきらめてすべてのRDSインスタンスのリードオンリー権限で作りました。
もしかしたら、タグで切り分けるとか他に方法があるかもしれません。
誰か知っていたら教えてください。