目次

OSS 権限定義を表示する

OSS プロダクトドキュメントの「アクセス制御」をご参照ください。

RAM ユーザーに OSS 読み取り専用権限を割り当て

RAM コンソールで RAM ユーザーを作成し、システム権限付与ポリシー "AliyunSLBReadOnlyAccess" をユーザーに追加します。 権限付与ポリシーの追加方法の詳細は、「権限付与」をご参照ください。

完全な OSS 管理権限を RAM ユーザーに割り当て

システム権限付与ポリシー "AliyunSLBFullAccess" を RAM コンソールの RAM ユーザーに追加します。

RAM ユーザーにバケット内のリソースの一覧表示と読み取りを許可

RAM ユーザー (自分を代表するアプリケーションなど) を許可して、OSS SDK または OSS CMD を使用してバケット内のリソースをリストして読み取る必要がある場合、 権限付与ポリシーを作成する必要があります。次に完了するためのカスタム権限付与ポリシーを作成する必要があります。

バケットが "myphotos" という名前であるとします。 以下のように権限付与ポリシーを作成します。

{
    "Version": "1",
    "Statement ":[
        {
            "Effect": "Allow",
            "Action": "oss:ListObjects",
            "Resource": "acs:oss:*:*:myphotos"
        },
        {
            "Effect": "Allow",
            "Action": "oss:GetObject",
            "Resource": "acs:oss:*:*:myphotos/*"
        }
    ]
}
権限付与された RAM ユーザーに OSS コンソールで操作を実行させたい場合は、権限付与ポリシーに "GetBucketAcl" および "GetObjectAcl" 権限を追加してください。 (コンソールは操作エクスペリエンスを最適化するために追加の OSS API を呼び出す必要があります。) 権限付与ポリシー定義の例を次に示します。 これにより、RAM ユーザーは OSS コンソールで操作を実行できます。
{
    "Version": "1",
    "Statement ":[
        {
            "Effect": "Allow",
            "Action": "oss:ListBuckets",
            "Resource": "acs:oss:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "oss:ListObjects",
                "oss:GetBucketAcl"
            ],
            "Resource": "acs:oss:*:*:myphotos"
        },
        {
            "Effect": "Allow",
            "Action": [
                "oss:GetObject",
                "oss:GetObjectAcl"
            ],
            "Resource": "acs:oss:*:*:myphotos/*"
        }
    ]
}

OSS で IP アドレス固有のアクセス制御を適用

例1: Allow コマンドを使用して IP アドレス固有のアクセス制御を適用します。

IP アドレスセグメント 42.120.88.0/24 および 42.120.66.0/24 が "myphotos" ディレクトリの情報を読むことを許可されています。

{
    "Version": "1",
    "Statement ":[
        {
            "Sid": "To allow listing all buckets",
            "Effect": "Allow",
            "Action": [
                "oss:ListBuckets"
            ],
            "Resource": [
                "acs:oss:*:*:*"
            ]
        },
        {
            "Sid": "To allow only the users in the specified IP address segment to obtain the information in the myphotos directory",
            "Effect": "Allow",
            "Action": [
                "oss:ListObjects",
                "oss:GetObject"
            ],
            "Resource": [
                "acs:oss:*:*:myphotos",
                "acs:oss:*:*:myphotos/*"
            ],
            "Condition ":{
                "IpAddress": {
                    "acs:SourceIp": "42.120.88.0/24", "42.120.66.0/24"
                }
            }
        }
    ]
}

例2: Deny コマンドを使用して IP アドレス固有のアクセス制御を適用します。

ユーザーの IP アドレスが 42.120.88.0/24 セグメント内にない場合、ユーザーは OSS 操作を実行できません。 以下のように権限付与ポリシーを作成します。

{
    "Version": "1",
    "Statement ":[
        {
            "Sid": "To allow listing all buckets",
            "Effect": "Allow",
            "Action": [
                "oss:ListBuckets"
            ],
            "Resource": [
                "acs:oss:*:*:*"
            ]
        },
        {
            "Sid": "To allow obtaining the information in the myphotos directory",
            "Effect": "Allow",
            "Action": [
                "oss:ListObjects",
                "oss:GetObject"
            ],
            "Resource": [
                "acs:oss:*:*:myphotos",
                "acs:oss:*:*:myphotos/*"
            ]
        },
        {
            "Sid": "To disallow IP addresses not in the 42.120.88.0/24 segment to access OSS",
            "Effect": "Deny",
            "Action": "oss:*",
            "Resource": [
                "acs:oss:*:*:*"
            ],
            "Condition ":{
                "NotIpAddress": {
                    "acs:SourceIp": ["42.120.88.0/24"]
                }
            }
        }
    ]
}

注:"Deny" コマンドを使用したポリシーは、"Allow" コマンドを使用したポリシーよりも優先度が高くなります。 (ユーザーのアクセス操作が "Deny" コマンドのいずれかのポリシーを満たしている場合、そのユーザーはコンテンツにアクセスできません。) したがって、IP アドレスが 42.120.88.0/24 セグメントにないユーザが "myphotos" ディレクトリの情報にアクセスしようとすると、OSS サービスはユーザに操作権限がないことを通知します。

OSS ディレクトリーによる権限付与

ディレクトリによる許可は高度な権限付与機能です。

背景

"myphotos" という名前の写真バケットがあるとします。 バケットには、写真が撮影された場所を示すディレクトリが含まれています。 各ディレクトリには、写真が撮影された年を示すサブディレクトリが含まれています。

ディレクトリツリーは次のとおりです。

myphotos[Bucket]
  ├── beijing
  │   ├── 2014
  │   └── 2015
  ├── hangzhou
  │ ├── 2013
  │   ├── 2014
  │ └── 2015 //The read-only permission on this directory must be assigned.
  └── qingdao
      ├── 2014
      └── 2015

myphotos/hangzhou/2015/ ディレクトリに RAM ユーザーへの読み取り専用権限を割り当てる必要があるとします。 必要な権限付与ポリシーはアプリケーションのシナリオによって異なります。 以下では、最も単純なものからより複雑なものまで、ポリシーの複雑さによって 3 つのシナリオの権限付与ポリシーについて説明します。

シナリオ1: RAM ユーザーはすべてのファイルパスを知っており、ファイルの内容を読み取るためのアクセス許可のみを必要とし、ファイルを一覧表示するためのアクセス許可は必要としません。

このシナリオでは、RAM ユーザーはすべてのファイルの完全パスを知っており、完全パスを使用してファイルを直接読み取ることができます。 ソフトウェアがそのような権限を必要とするのは、ソフトウェアシステム内のファイルパスは特定の規則に準拠している (たとえば、ファイルは従業員 ID に基づいて名前が付けられている) か、ファイルパスはソフトウェアシステムのデータベースに保持されているためです。

{
    "Version": "1",
    "Statement ":[
        {
            "Effect": "Allow",
            "Action": [
                "oss:GetObject"
            ],
            "Resource": [
                "acs:oss:*:*:myphotos/hangzhou/2015/*"
            ]
        }
    ]
}
シナリオ2: RAM ユーザーが OSS CMD を使用して myphotos/hangzhou/2015/ ディレクトリにアクセスするが、そのディレクトリで使用可能なファイルはわかりません。 したがって、ファイルをリストしなければなりません。

一般に、ソフトウェア開発者はそのような許可の割り当てを必要とします。 開発者は、ディレクトリで利用可能なファイルがわかりません。 OSS CMD または API を使用して、ディレクトリ情報を直接取得します。

このシナリオでは、scenario 1 では必要ではなかった "ListObjects" 権限を追加する必要があります。 myphotos/hangzhou/2015/ ディレクトリのファイルのみを一覧表示する必要があるので、"oss:Prefix" 条件を "ListObjects" 権限に追加する必要があります。

{
    "Version": "1",
    "Statement ":[
        {
            "Effect": "Allow",
            "Action": [
                "oss:GetObject"
            ],
            "Resource": [
                "acs:oss:*:*:myphotos/hangzhou/2015/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "oss:ListObjects"
            ],
            "Resource": [
                "acs:oss:*:*:myphotos"
            ],
            "Condition":{
                "StringLike":{
                    "oss:Prefix":"hangzhou/2015/"
                }
            }
        }
    ]
}
シナリオ 3: RAM ユーザーが OSS コンソールを使って myphotos/hangzhou/2015/ ディレクトリにアクセスします。

これは最も使いやすいシナリオです。 RAM ユーザーがビジュアル OSS クライアントを使用して myphotos/hangzhou/2015/ ディレクトリにアクセスすると、Windows のファイルエクスプローラと同様に、ビジュアル OSS クライアントは RAM ユーザがルートディレクトリからサブディレクトリのレベルを通してターゲットディレクトリにアクセスすることを可能にします。

したがって、このタイプのディレクトリナビゲーションを実装するには、次の権限を追加する必要があります。
  1. すべてのバケットを一覧表示する権限
  2. "myphotos" ディレクトリのサブディレクトリを一覧表示する権限 (この例では、サブディレクトリに "beijing"、"hangzhou" および "qingdao" が含まれます)
  3. "myphotos/hangzhou" の下にサブディレクトリーをリストする許可 (サブディレクトリーには "2013"、"2014" および "2015" が含まれます)
{
    "Version": "1",
    "Statement ":[
        {
            "Effect": "Allow",
            "Action": [
                "oss:ListBuckets",
                "oss:GetBucketAcl"
            ],
            "Resource": [
                "acs:oss:*:*:*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "oss:GetObject",
                "oss:GetObjectAcl"
            ],
            "Resource": [
                "acs:oss:*:*:myphotos/hangzhou/2015/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "oss:ListObjects"
            ],
            "Resource": [
                "acs:oss:*:*:myphotos"
            ],
            "Condition": {
                "StringLike": {
                    "oss:Delimiter": "/",
                    "oss:Prefix": [
                        "",
                        "hangzhou/",
                        "hangzhou/2015/*"
                    ]
                }
            }
        }
    ]
}

RAM ユーザーにバケットの完全管理を許可

最初に権限付与ポリシーを作成する必要があります。 バケットが "myphotos" という名前であるとします。 以下のように権限付与ポリシーを作成します。

{
    "Version": "1",
    "Statement ":[
        {
            "Effect": "Allow",
            "Action": "oss:*",
            "Resource": [
                "acs:oss:*:*:myphotos",
                "acs:oss:*:*:myphotos/*"
            ]
        }
    ]
}

そしてそのユーザーに権限付与ポリシーを追加します。

OSS コンソールへのログイン時に操作権限がないことを通知され、バケットの管理を許可された RAM ユーザー

以下の通り権限付与ポリシーを作成して、RAM ユーザーに ("myphotos" のような) バケットからデータオブジェクトを読み取ることを許可するとします。
{
  "Version": "1",
  "Statement ":[
    {
      "Effect": "Allow",
      "Action": [
        "oss:ListObjects"
      ],
      "Resource": "acs:oss:*:*:myphotos"
    },
    {
      "Effect": "Allow",
      "Action": [
        "oss:GetObject"
      ],
      "Resource": "acs:oss:*:*:myphotos/*"
    }
  ]
}

ただし、OSS コンソールにログインすると、RAM ユーザーに操作権限がないことが通知されました。

その理由は、RAM ユーザーが OSS コンソールにログインすると、OSS コンソールによって、承認されたとおりに RAM ユーザーが OSS サービスにアクセスできるようになるためです。 より良いユーザーインタラクションを体験するために、OSS コンソールは "ListBuckets"、"GetBucketAcl" および "GetObjectAcl" オペレーションも呼び出します。 ("GetBucketAcl" はバケットがプライベートかパブリックかを指定します。 "GetObjectAcl" はオブジェクトがプライベートかパブリックかを指定します。)

したがって、RAM ユーザーが OSS コンソールでバケットを管理できるようにするには、次のように承認ポリシーを作成する必要があります。

{
  "Version": "1",
  "Statement ":[
    {
      "Effect": "Allow",
      "Action": "oss:ListBuckets",
      "Resource": "acs:oss:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "oss:ListObjects",
        "oss:GetBucketAcl"
      ],
      "Resource": "acs:oss:*:*:myphotos"
    },
    {
      "Effect": "Allow",
      "Action": [
        "oss:GetObject",
        "oss:GetObjectAcl"
      ],
      "Resource": "acs:oss:*:*:myphotos/*"
    }
  ]
}