IAM Policy ViewOnlyAccessとReadOnlyAccessの違い

2021.02.19

IAM PolicyにはAWS管理ポリシーというものがありますが、その中にViewOnlyAccessとReadOnlyAccessという似たような名前のポリシーがあります。この2つのポリシーの違いを調べてみました。

AWS管理ポリシーって?

名前のとおりですが、AWSを使う私達ユーザーではなく、AWSが管理するポリシーのことです。ユーザー側にポリシーの変更権限は無くポリシーそのものを削除することもできませんが、AWSが我々に代わってサービス追加や機能追加にいい感じに追従してくれます。

ViewOnlyAccessは職務機能のAWS管理ポリシー

ViewOnlyAccessはそのAWS管理ポリシーの中でも「職務機能のAWS管理ポリシー」と呼ばれるカテゴリーに属するものです。ネットワーク管理者、データサイエンティストなど、AWSを使う人の業務をAWSが想定してその要件を満たす権限が設定されたAWS管理ポリシーです。ViewOnlyAccessは「閲覧専用ユーザー」を想定して作られたポリシーです。

職務機能のAWS管理ポリシーを含む、ポリシー周りの様々な言葉については、以下ブログがわかりやすくまとめていますので、よろしければ御覧ください。

ではここから本題、ViewOnlyAccessとReadOnlyAccessの違いについて調べていきます。

先に結論

ViewOnlyAccessのほうがより権限が制限されている、つまりReadOnlyAccessの方が出来ることが多いようです。で、ReadOnlyAccessができてViewOnlyAccessができないことはざっくりとは「コンテンツ」を閲覧できるかどうか、のようです。

「ようです」と少しぼかしたのは、精査しきれていないからです😅

PolicyのDescriptionの違い

ViewOnlyAccess

This policy grants permissions to view resources and basic metadata across all AWS services.

ReadOnlyAccess

Provides read-only access to AWS services and resources.

ViewOnlyAccessが「リソースと基本的なメタデータを閲覧するための権限」、ReadOnlyAccessが「サービスとリソースへの読み込み権限」という感じですが、これだけだと違いがよくわからないですね…

Policyの中身の違い

「よーし、diffコマンドで両者のポリシーの違いを一目瞭然にしてやるぞー」と息巻いてみたのですが、差分がありすぎて私のdiff力ではわかりやすい結果を出力できませんでしたすみません。代わりに、いくつかのサービスに絞って権限の違いを調査し、両ポリシーの違いを考察したいと思います。

S3

$ diff -y -W 80 <(aws iam get-policy-version --policy-arn arn:aws:iam::aws:policy/job-function/ViewOnlyAccess --version-id $(aws iam get-policy --policy-arn arn:aws:iam::aws:policy/job-function/ViewOnlyAccess --query Policy.DefaultVersionId --output text) --query PolicyVersion.Document.Statement | grep s3:) <(aws iam get-policy-version --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess --version-id $(aws iam get-policy --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess --query Policy.DefaultVersionId --output text) --query PolicyVersion.Document.Statement | grep s3:)
            "s3:ListAllMyBuckets",    |	            "s3:Get*",
            "s3:ListBucket",	      |	            "s3:List*",

コマンドがすごく長くなってしまいましたが、ViewOnlyAccessとReadOnlyAccessのポリシーのdiffを出力しているだけです。で、出力結果の左側がViewOnlyAccess、右側がReadOnlyAccessのS3関係の権限です。ViewOnlyAccessは2権限しか無いのに対し、ReadOnlyAccessはざっくりとGetとListから始まる権限すべてついていますね。

ViewOnlyAccessの2権限でできることは、以下だけです。

  • バケットを一覧する
  • バケット内のオブジェクトを一覧する

対してReadOnlyAccessはGetとListの権限全てついてますので、例えばGetObjectでオブジェクトの中身を見ることもできます。

IAM

$ diff -y -W 80 --expand-tabs <(aws iam get-policy-version --policy-arn arn:aws:iam::aws:policy/job-function/ViewOnlyAccess --version-id $(aws iam get-policy --policy-arn arn:aws:iam::aws:policy/job-function/ViewOnlyAccess --query Policy.DefaultVersionId --output text) --query PolicyVersion.Document.Statement | grep iam:) <(aws iam get-policy-version --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess --version-id $(aws iam get-policy --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess --query Policy.DefaultVersionId --output text) --query PolicyVersion.Document.Statement | grep iam:)
                                       >              "iam:Generate*",
                                       >              "iam:Get*",
            "iam:List*",                              "iam:List*",
            "iam:GetAccountSummary",   |              "iam:Simulate*",
            "iam:GetLoginProfile",     <

ViewOnlyAccessの方にあるiam:GetAccountSummaryとiam:GetLoginProfileですが、IAMポリシーのコンソールで見るとどちらも「リスト」の一部にありました。 GetAccountSummary-GetLoginProfile

iam:GetAccountSummaryですが、おそらくIAMダッシュボードの以下の各リソースの使用数を取得する処理などに使われている権限だと思います。 dashboard-GetAccountSummary

一方iam:GetLoginProfileですが、

Grants permission to retrieve the user name and password creation date for the specified IAM user

とあります。どうやらIAMユーザー詳細画面で確認できる作成時刻を表示する際に使われていたりする権限のようです。 create-date

それ以外についてはほとんどエラーになりました。例えば以下のようにIAMポリシーの中身を確認することもできません。 cannot-get-iam-policy

Lambda

$ diff -y -W 80 --expand-tabs <(aws iam get-policy-version --policy-arn arn:aws:iam::aws:policy/job-function/ViewOnlyAccess --version-id $(aws iam get-policy --policy-arn arn:aws:iam::aws:policy/job-function/ViewOnlyAccess --query Policy.DefaultVersionId --output text) --query PolicyVersion.Document.Statement | grep lambda:) <(aws iam get-policy-version --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess --version-id $(aws iam get-policy --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess --query Policy.DefaultVersionId --output text) --query PolicyVersion.Document.Statement | grep lambda:)
            "lambda:List*",                           "lambda:List*",
                                       >              "lambda:Get*",

Lambdaに関してはViewOnlyAccess権限だとIAMやS3以上にコンソールで何もできませんでした。関数の一覧ページを表示するのにlambda:GetAccountSettings権限が必要なようで、関数一覧すら取得できませんでした。当然各関数の設定やコード内容も確認できません。

lambda-GetAccountSettings

SQS

$ diff -y -W 80 --expand-tabs <(aws iam get-policy-version --policy-arn arn:aws:iam::aws:policy/job-function/ViewOnlyAccess --version-id $(aws iam get-policy --policy-arn arn:aws:iam::aws:policy/job-function/ViewOnlyAccess --query Policy.DefaultVersionId --output text) --query PolicyVersion.Document.Statement | grep sqs:) <(aws iam get-policy-version --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess --version-id $(aws iam get-policy --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess --query Policy.DefaultVersionId --output text) --query PolicyVersion.Document.Statement | grep sqs:)
            "sqs:ListQueues",          |              "sqs:Get*",
                                       >              "sqs:List*",
                                       >              "sqs:Receive*",

ViewOnlyAccess側の権限が一つしか無くてわかりやすかったのでSQSを取り上げました。ViewOnlyAccess権限だとどんなキューがあるかはわかりますが、それ以上のこと例えばメッセージの数だとか中身だとかはわかりませんね。(ちなみにSQSコンソールだとキュー一覧画面でキューが表示されなかったのですがなんででしょう。。CLI (list-queues)だと見れたので、一覧表示時に別の権限も必要なのでしょうか。)

更新頻度の違い

両ポリシーともAWS管理ポリシーなので、新サービスや新機能が発表される度にそれぞれのポリシーの目的に合わせてAWS側でよしなにポリシーを更新していってくれているはずです。というわけで更新頻度も調べてみました。

結果としては、ReadOnlyAccessの方が圧倒的に更新頻度が高かったです。

ViewOnlyAccess

現在のバージョンは10。初回バージョンは2016-11-10に作成。

$ aws iam get-policy --policy-arn arn:aws:iam::aws:policy/job-function/ViewOnlyAccess
{
    "Policy": {
        "PolicyName": "ViewOnlyAccess",
        "PolicyId": "ANPAID22R6XPJATWOFDK6",
        "Arn": "arn:aws:iam::aws:policy/job-function/ViewOnlyAccess",
        "Path": "/job-function/",
        "DefaultVersionId": "v10",
        "AttachmentCount": 0,
        "PermissionsBoundaryUsageCount": 0,
        "IsAttachable": true,
        "Description": "This policy grants permissions to view resources and basic metadata across all AWS services. ",
        "CreateDate": "2016-11-10T17:20:15+00:00",
        "UpdateDate": "2020-08-18T22:51:43+00:00"
    }
}

ReadOnlyAccess

現在のバージョンは73。初回バージョンは2015-02-06に作成。

$ aws iam get-policy --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess
{
    "Policy": {
        "PolicyName": "ReadOnlyAccess",
        "PolicyId": "ANPAILL3HVNFSB6DCOWYQ",
        "Arn": "arn:aws:iam::aws:policy/ReadOnlyAccess",
        "Path": "/",
        "DefaultVersionId": "v73",
        "AttachmentCount": 4,
        "PermissionsBoundaryUsageCount": 0,
        "IsAttachable": true,
        "Description": "Provides read-only access to AWS services and resources.",
        "CreateDate": "2015-02-06T18:39:48+00:00",
        "UpdateDate": "2021-01-14T20:07:47+00:00"
    }
}

まとめ

ViewOnlyAccessとReadOnlyAccessの違いを調べました。

  • ViewOnlyAccessのほうがより権限が制限されている(そして結構見れないものが多い)
  • 基本的にViewOnlyAccessはリソースのコンテンツ、例えばS3オブジェクトの中身やIAM Policyの中身、SQSメッセージ内容などは見れない
  • 更新頻度はReadOnlyAccessの方が高い

ということがわかりました。

大事なことは、結局ViewOnlyAccessとReadOnlyAccessも「AWSが考えた」ポリシーなので、そのAWSの考えがあなたの要件に100%マッチするとは限らないということです。おそらくViewOnlyAccessだと足らないとか、ReadOnlyAccessだと見えすぎだとか、色々過不足が出てきて然りだと思います。大変ですが、そういったところは独自定義のポリシーもアタッチして許可・拒否設定を細かく行なっていくしかないのだと思います。

参考情報