一部のRDSの情報の閲覧だけできるポリシーは作れなかった話

  • 0
    いいね
  • 0
    コメント

    ポリシー作ってみた

    協力会社の人が、「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のドキュメントにも少し書いてました。

    IAM と連携する AWS サービス

    API がリソースレベルのアクセス権限をサポートしない場合、ポリシーのそのステートメントは Resource 要素で * を使用する必要があります。

    可否の一覧とか無いと思ってググったけど、いい感じのは見つけられなかった。
    そういうやり方ができない予感はしていたけど、出来ればポリシー作成時にエラーだして欲しかったぜ。

    代替案あったら教えて

    結局あきらめてすべてのRDSインスタンスのリードオンリー権限で作りました。
    もしかしたら、タグで切り分けるとか他に方法があるかもしれません。
    誰か知っていたら教えてください。