RAM ポリシーは、RAM アイデンティティ (ユーザー、ユーザーグループ、ロール) にアタッチする認可ポリシーです。RAM ユーザーまたはロールの OSS リソースに対するアクセス権限を管理する必要がある場合、RAM ポリシーを使用して、そのアイデンティティが実行できる操作と、アクセス可能なリソースのスコープを定義できます。
仕組み
RAM ポリシーは、ID ベースの権限付与モデルを使用します。ポリシーは RAM ユーザー、ユーザーグループ、または RAM ロールにアタッチされ、アイデンティティがどのリソース (Resource) に対してどのアクション (Action) を実行できるか、およびどのような条件 (Condition) で実行できるかを定義します。
RAM アイデンティティがアクセスリクエストを開始すると、OSS は関連するすべてのポリシー (RAM ポリシーおよびバケットポリシーを含む) を総合的に評価します。権限の判定は、明示的な拒否の優先の原則に従います:
-
明示的な拒否の優先:いずれかのポリシーに、リクエストに一致する Deny ルールが含まれている場合、リクエストは 直ちに拒否 されます。
-
明示的な許可:一致する Deny ルールがなく、かつリクエストに一致する Allow ルールがある場合、リクエストは 許可 されます。
-
デフォルト拒否:Deny ルールと Allow ルールのいずれにも一致しない場合、リクエストは デフォルトで拒否 されます。
OSS は 2 種類の RAM ポリシーをサポートしています。システムポリシーは Alibaba Cloud によって事前定義されており、ユーザーは使用できますが変更はできません。カスタムポリシーはユーザーが作成および管理でき、より柔軟な権限設定を提供します。
システムポリシーの権限付与
システムポリシーは Alibaba Cloud によって作成されます。RAM コンソールでユーザーアイデンティティに直接権限を付与できます。以下では、RAM ユーザーを例に、権限付与の手順を説明します。
-
RAM ユーザー ページに移動し、対象ユーザーの [操作] 列にある 権限の追加 をクリックします。
-
[権限を追加] パネルでは、リソーススコープはデフォルトで [アカウントレベル] になっています。特定のリソースグループに権限を付与するには、[リソースグループレベル] を選択してください。
-
検索ボックスにシステムポリシーの名前を入力し、対象のシステムポリシーを選択してください。Object Storage Service (OSS) は、次の 2 つのシステムポリシーをサポートしています:
-
AliyunOSSFullAccess:OSS へのフルアクセス権限を付与します。
-
AliyunOSSReadOnlyAccess:OSS への読み取り専用アクセスを付与します。
-
-
[OK] をクリックして、権限設定を完了します。
カスタムポリシーの付与
カスタムポリシーは、ユーザーが作成および管理します。カスタムポリシーを付与するには、まずカスタムポリシーを作成してから、対応するユーザーアイデンティティに付与する必要があります。
ステップ 1:カスタムポリシーの作成
-
ポリシーページに移動し、ポリシーの作成 をクリックします。
-
スクリプトの編集 を選択し、JSON 形式の権限ポリシーをエディターに入力します。RAM Policy Editor を使用すると、権限ポリシーを素早く生成できます。
認可ポリシーの例:
example-bucketおよびそのバケット内のすべてのリソースに対するすべての操作を許可します。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:*", "Resource": [ "acs:oss:*:*:example-bucket", "acs:oss:*:*:example-bucket/*" ] } ] }完全な権限ポリシーは、 バージョン (バージョン番号) と ステートメント (権限付与ステートメント) で構成されます。
-
バージョン: ポリシーのバージョンであり、
1に固定されていて変更できません。 -
ステートメント:ポリシーの本体であり、1 つ以上の具体的な許可/拒否ルールが含まれます。各権限付与ステートメントは、 エフェクト、 アクション、 リソース、および 条件 で構成されます。
ポリシー要素
説明
エフェクト
ポリシーの効果。有効な値:
Allow(許可) またはDeny(拒否)。アクション
リソースに対して実行する特定の操作。ワイルドカード
*を使用できます。リソース
ポリシーが適用されるリソースの範囲です。
条件
ポリシーが有効になる条件です。
複数の条件が設定されている場合、ポリシーが有効になるには、すべての条件を同時に満たす (AND 関係) 必要があります。
権限付与要素の完全なリストについては、OSS 権限付与の構文と要素をご参照ください。
-
-
OK をクリックし、 [ポリシー名] を入力してから、 OK をクリックしてカスタムポリシーの作成を完了します。
ステップ 2:ユーザーアイデンティティへの権限付与
カスタムポリシーを作成した後、対象のユーザーアイデンティティに付与する必要があります。以下では、RAM ユーザーを例として権限付与の手順を説明します。
-
RAM ユーザーページに移動し、対象ユーザーの 権限の追加 列で 権限の追加 をクリックします。
-
検索ボックスにカスタムポリシーの名前を入力し、対象のポリシーを選択します。
-
[OK] をクリックして、権限の付与を完了します。
一般的な認可シナリオ
以下のシナリオは、権限の付与、アクセス制限、およびさまざまなセキュリティ制御要件に対応する、実際のビジネスにおける RAM ポリシーの典型的な適用例です。各シナリオには、完全なポリシー設定例が含まれています。実際の要件に基づいて、例の中のバケット名やディレクトリパスなどのパラメーターを変更できます。
シナリオ 1:RAM ユーザーへのバケットに対する完全な制御権限の付与
次の例では、RAM ユーザーに mybucket という名前のバケットに対する完全なコントロール権限を付与します。
モバイルアプリケーションの場合、ユーザーにバケットに対する完全な制御権限を付与することは非常に高いリスクをもたらすため、可能な限り避けてください。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:*",
"Resource": [
"acs:oss:*:*:mybucket",
"acs:oss:*:*:mybucket/*"
]
}
]
}
シナリオ 2:RAM ユーザーによるバケット内の一致する特定のパターンのファイルの削除の拒否
以下の例では、mybucket という名前のバケット内で、プレフィックスが abc で拡張子が .txt のすべてのファイルを、RAM ユーザーが削除することを拒否します。
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action": [
"oss:DeleteObject"
],
"Resource": [
"acs:oss:*:*:mybucket/abc*.txt"
]
}
]
}
シナリオ 3:RAM ユーザーへのバケット内のすべてのリソースを一覧表示および読み取る権限の付与
-
次の例では、RAM ユーザーに、OSS SDK または OSS コマンドラインツールを介して
mybucketという名前のバケット内のすべてのリソースを一覧表示および読み取る権限を付与します。説明ListObjects アクションは、リソースとしてバケット全体を使用する必要があります。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:ListObjects", "Resource": "acs:oss:*:*:mybucket" }, { "Effect": "Allow", "Action": "oss:GetObject", "Resource": "acs:oss:*:*:mybucket/*" } ] } -
次の例では、RAM ユーザーに対し、OSS コンソールで
mybucketという名前のバケット内のすべてのリソースを一覧表示し、読み取る権限を付与します。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListBuckets", "oss:GetBucketStat", "oss:GetBucketInfo", "oss:GetBucketTagging", "oss:GetBucketLifecycle", "oss:GetBucketWorm", "oss:GetBucketVersioning", "oss:GetBucketAcl" ], "Resource": "acs:oss:*:*:*" }, { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetBucketAcl" ], "Resource": "acs:oss:*:*:mybucket" }, { "Effect": "Allow", "Action": [ "oss:GetObject", "oss:GetObjectAcl" ], "Resource": "acs:oss:*:*:mybucket/*" } ] }
シナリオ 4:RAM ユーザーによるバケットの削除の拒否
次の例では、RAM ユーザーが mybucket という名前のバケットを削除することを拒否します。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:*",
"Resource": [
"acs:oss:*:*:mybucket",
"acs:oss:*:*:mybucket/*"
]
},
{
"Effect": "Deny",
"Action": [
"oss:DeleteBucket"
],
"Resource": [
"acs:oss:*:*:mybucket"
]
}
]
}
シナリオ 5:RAM ユーザーへのファイルアップロード・削除権限の付与とバケット削除の拒否
次の例では、RAM ユーザーに mybucket という名前のバケット内のファイルをアップロードおよび削除する権限 (オブジェクトバージョンの削除を含む) のみを付与しますが、バケット自体の削除権限は拒否します。 oss:* を使用して広範な権限を付与するシナリオ 4 とは異なり、このシナリオでは最小権限の原則に従い、許可される操作を正確に指定します。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:PutObject",
"oss:DeleteObject",
"oss:DeleteObjectVersion"
],
"Resource": [
"acs:oss:*:*:mybucket/*"
]
},
{
"Effect": "Deny",
"Action": [
"oss:DeleteBucket"
],
"Resource": [
"acs:oss:*:*:mybucket"
]
}
]
}
同一のポリシー内では、Deny ステートメントが Allow ステートメントより優先されます。 したがって、RAM ユーザーが oss:PutObject、oss:DeleteObject、および oss:DeleteObjectVersion 権限を持っていても、oss:DeleteBucket 操作は明示的に拒否されます。
シナリオ 6:RAM ユーザーへのバケット内の複数のディレクトリへのアクセス権限の付与
写真を保存するバケットが mybucket であるとします。このバケットには、撮影場所を表すディレクトリがいくつかあり、各場所のディレクトリには年ごとのサブディレクトリが含まれています。
mybucket[Bucket]
├── beijing
│ ├── 2014
│ └── 2015
└── hangzhou
├── 2014
└── 2015
RAM ユーザーに mybucket/hangzhou/2014/ および mybucket/hangzhou/2015/ ディレクトリへの読み取り専用権限を付与する必要があります。 ディレクトリレベルの承認は高度な承認機能です。 承認ポリシーの複雑さは使用シナリオによって異なり、参考として以下のシナリオが提供されています。
-
RAM ユーザーに
mybucket/hangzhou/2014/およびmybucket/hangzhou/2015/ディレクトリ内のファイルの内容を読み取る権限のみを付与します。RAM ユーザーはファイルのフルパスを知っているため、ディレクトリ内のファイル内容を読み取るには、完全なファイルパスを使用することを推奨します。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:GetObject" ], "Resource": [ "acs:oss:*:*:mybucket/hangzhou/2014/*", "acs:oss:*:*:mybucket/hangzhou/2015/*" ] } ] } -
RAM ユーザーに、OSS コマンドラインツールを使用して
mybucket/hangzhou/2014/およびmybucket/hangzhou/2015/ディレクトリにアクセスし、これらのディレクトリ内のファイルを一覧表示する権限を付与します。RAM ユーザーがディレクトリ内にどのファイルがあるか分からない場合、OSS コマンドラインツールまたは API を使用して、ディレクトリ情報を直接取得できます。このシナリオでは、
ListObjects権限を追加する必要があります。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:GetObject" ], "Resource": [ "acs:oss:*:*:mybucket/hangzhou/2014/*", "acs:oss:*:*:mybucket/hangzhou/2015/*" ] }, { "Effect": "Allow", "Action": [ "oss:ListObjects" ], "Resource": [ "acs:oss:*:*:mybucket" ], "Condition":{ "StringLike":{ "oss:Prefix": [ "hangzhou/2014/*", "hangzhou/2015/*" ] } } } ] } -
OSS コンソールを使用してディレクトリにアクセスする権限を RAM ユーザーに付与します。
OSS コンソールで
mybucket/hangzhou/2014/とmybucket/hangzhou/2015/ディレクトリにアクセスする場合、RAM ユーザーはルートディレクトリから階層を 1 つずつたどり、ターゲットディレクトリに移動できます。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListBuckets", "oss:GetBucketStat", "oss:GetBucketInfo", "oss:GetBucketTagging", "oss:GetBucketLifecycle", "oss:GetBucketWorm", "oss:GetBucketVersioning", "oss:GetBucketAcl" ], "Resource": [ "acs:oss:*:*:*" ] }, { "Effect": "Allow", "Action": [ "oss:GetObject", "oss:GetObjectAcl" ], "Resource": [ "acs:oss:*:*:mybucket/hangzhou/2014/*", "acs:oss:*:*:mybucket/hangzhou/2015/*" ] }, { "Effect": "Allow", "Action": [ "oss:ListObjects" ], "Resource": [ "acs:oss:*:*:mybucket" ], "Condition": { "StringLike": { "oss:Delimiter": "/", "oss:Prefix": [ "", "hangzhou/", "hangzhou/2014/*", "hangzhou/2015/*" ] } } } ] }
シナリオ 7:RAM ユーザーによるバケット内の任意のファイルの削除の拒否
次の例では、RAM ユーザーが mybucket バケット内のいずれかのファイルを削除することを拒否します。
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action": [
"oss:DeleteObject"
],
"Resource": [
"acs:oss:*:*:mybucket/*"
]
}
]
}
シナリオ 8:RAM ユーザーによる指定されたタグを持つオブジェクトへのアクセスの拒否
次の Deny ポリシーは、RAM ユーザーが examplebucket という名前のバケット内で、タグ status:ok および key1:value1 が付いたオブジェクトにアクセスすることを拒否します。
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action": [
"oss:GetObject"
],
"Resource": [
"acs:oss:*:174649585760xxxx:examplebucket/*"
],
"Condition": {
"StringEquals": {
"oss:ExistingObjectTag/status":"ok",
"oss:ExistingObjectTag/key1":"value1"
}
}
}
]
}
シナリオ 9:RAM ユーザーへの特定のIPアドレスからのOSSへのアクセス権限の付与
-
Allow認可に IP アドレス制限を追加します。次の例では、
Allow認可に IP アドレス制限を追加し、RAM ユーザーに対し、IP アドレス範囲192.168.0.0/16および198.51.100.0/24からのみmybucketという名前のバケット内のすべてのリソースを読み取る権限を付与します。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListBuckets", "oss:GetBucketStat", "oss:GetBucketInfo", "oss:GetBucketTagging", "oss:GetBucketAcl" ], "Resource": [ "acs:oss:*:*:*" ] }, { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetObject" ], "Resource": [ "acs:oss:*:*:mybucket", "acs:oss:*:*:mybucket/*" ], "Condition":{ "IpAddress": { "acs:SourceIp": ["192.168.0.0/16", "198.51.100.0/24"] }, "StringNotLike": { "acs:SourceVpc": [ "vpc-*" ] } } } ] } -
拒否認可に IP アドレス制限を追加します。次の例では、
Deny承認に IP アドレス制限を追加することで、送信元 IP アドレスが192.168.0.0/16範囲内にない RAM ユーザーによる OSS でのあらゆる操作を拒否します。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListBuckets", "oss:GetBucketStat", "oss:GetBucketInfo", "oss:GetBucketTagging", "oss:GetBucketAcl" ], "Resource": [ "acs:oss:*:*:*" ] }, { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetObject" ], "Resource": [ "acs:oss:*:*:mybucket", "acs:oss:*:*:mybucket/*" ] }, { "Effect": "Deny", "Action": "oss:*", "Resource": [ "acs:oss:*:*:*" ], "Condition":{ "NotIpAddress": { "acs:SourceIp": ["192.168.0.0/16"] }, "StringLike": { "acs:SourceVpc": [ "*" ] } } } ] }説明権限ポリシーの認可ルールは拒否優先であるため、訪問者が
192.168.0.0/16以外の IP アドレスから mybucket 内のコンテンツにアクセスすると、OSS はアクセス拒否エラーを返します。
シナリオ 10:RAM または STS サービスによる他のユーザーへの権限付与
RAM または STS サービスを使用して、IP アドレスが 192.168.0.1 のユーザーに、Java SDK クライアントで以下の操作を実行する権限を付与します。
-
mybucket内の、プレフィックスがfooのオブジェクトを一覧表示します。 -
mybucket内のfileで始まるオブジェクトのアップロード、ダウンロード、削除を許可します。
{
"Version": "1",
"Statement": [{
"Action": [
"oss:GetBucketAcl",
"oss:ListObjects"
],
"Resource": [
"acs:oss:*:177530505652xxxx:mybucket"
],
"Effect": "Allow",
"Condition": {
"StringLike": {
"acs:UserAgent": "*java-sdk*",
"oss:Prefix": "foo"
},
"IpAddress": {
"acs:SourceIp": "192.168.0.1"
},
"StringNotLike": {
"acs:SourceVpc": [
"vpc-*"
]
}
}
},
{
"Action": [
"oss:PutObject",
"oss:GetObject",
"oss:DeleteObject"
],
"Resource": [
"acs:oss:*:177530505652xxxx:mybucket/file*"
],
"Effect": "Allow",
"Condition": {
"StringEquals": {
"acs:UserAgent": "java-sdk"
},
"IpAddress": {
"acs:SourceIp": "192.168.0.1"
},
"StringNotLike": {
"acs:SourceVpc": [
"vpc-*"
]
}
}
}
]
}
シナリオ 11:バケットとオブジェクトの ACL をパブリックアクセスに設定することの拒否
次の例では、バケットとオブジェクトの ACL をパブリックアクセスに設定することを拒否し、OSS データのセキュリティを確保します。
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action": [
"oss:PutBucket",
"oss:PutBucketAcl"
],
"Resource": "*",
"Condition": {
"StringNotEquals": {
"oss:x-oss-acl": "private"
}
}
},
{
"Effect": "Deny",
"Action": [
"oss:PutObject",
"oss:PutObjectAcl"
],
"Resource": "*",
"Condition": {
"StringNotEquals": {
"oss:x-oss-object-acl": [
"private",
"default"
]
}
}
}
]
}
シナリオ 12:RAM ユーザーへの IMM 関連機能を使用する権限の付与
次の RAM ポリシーでは、IMM のドキュメント処理を使用する権限を RAM ユーザーに付与します。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:GetObject",
"oss:PutObject",
"oss:PostProcessTask",
"oss:ProcessImm"
],
"Resource": "*"
},
{
"Action": [
"imm:CreateOfficeConversionTask",
"imm:GetWebofficeURL"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Effect": "Allow",
"Action": "ram:PassRole",
"Resource": "acs:ram:*:*:role/aliyunimmdefaultrole"
}
]
}
シナリオ 13:RAM ユーザーへのストレージ冗長タイプを変更する権限の付与
-
特定のバケットのストレージ冗長タイプを変更する権限を RAM ユーザーに付与します。
次の例では、RAM ユーザーに
mybucketのストレージの冗長タイプを変更する権限を付与します。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:CreateBucketDataRedundancyTransition", "oss:GetBucketDataRedundancyTransition", "oss:ListBucketDataRedundancyTransition", "oss:DeleteBucketDataRedundancyTransition" ], "Resource": "acs:oss:*:*:mybucket" } ] } -
すべてのバケットのストレージ冗長タイプを変更する権限を RAM ユーザーに付与します。
重要次の例では、Alibaba Cloud アカウント配下のすべてのバケットのストレージ冗長タイプを変更する権限を RAM ユーザーに付与します。慎重に設定してください。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:CreateBucketDataRedundancyTransition", "oss:GetBucketDataRedundancyTransition", "oss:ListBucketDataRedundancyTransition", "oss:DeleteBucketDataRedundancyTransition" ], "Resource": "acs:oss:*:*:*" } ] }
シナリオ 14:RAM ユーザーへの OSS リソースプランの注文を作成する権限の付与
次の RAM ポリシーでは、OSS リソースプランの注文を作成する権限を RAM ユーザーに付与します。
RAM ユーザーが OSS リソースプランの注文を作成した後、RAM ユーザーは Alibaba Cloud アカウントの所有者に連絡して注文の支払いを完了できます。RAM ユーザーが OSS リソースプランの注文の支払いを完了できるようにするには、Alibaba Cloud アカウントの所有者は RAM ユーザーに注文の支払い権限 bss:PayOrder を付与する必要があります。bss:PayOrder は、資金操作を伴うリスクの高い権限です。必要でない限り付与しないでください。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:CreateOrder",
"Resource": "acs:oss:*:*:*"
}
]
}
シナリオ 15:RAM ユーザーへの OSS をアクティベートする権限の付与
次の RAM ポリシーでは、OSS をアクティベートする権限を RAM ユーザーに付与します。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:ActivateProduct",
"Resource": "acs:oss:*:*:*"
}
]
}
シナリオ 16:RAM ユーザーへの指定されたタグを持つバケット内のデータを読み書きする権限の付与
次の RAM ポリシーでは、指定されたタグを持つバケット内のデータを読み書きする権限を RAM ユーザーに付与します。ここで、タグキーは key1、タグ値は value1 です。
{
"Version": "1",
"Statement": [
{
"Action": [
"oss:ListBuckets",
"oss:GetBucketStat",
"oss:GetBucketInfo",
"oss:GetBucketAcl",
"oss:ListObjects",
"oss:PutObject",
"oss:GetObject"
],
"Resource": [
"acs:oss:*:*:*"
],
"Effect": "Allow",
"Condition": {
"StringEquals": {
"oss:BucketTag/key1": "value1"
}
}
}
]
}
ポリシーが有効になると、RAM ユーザーは、タグ key1=value1 が付いた OSS バケットに対して、指定された操作のみを実行できます。アクセス方法ごとの動作は次のとおりです。
-
OSS SDK または ossutil を使用して
ListBucketsリクエストを開始する場合、タグフィルタリングパラメーター (例:tag-key=key1, tag-value=value1) を追加する必要があります。ポリシーが正しく設定されている場合、レスポンスには指定されたタグ条件に一致するバケットのみが含まれます。 -
OSS コンソールから
ListBucketsリクエストを開始すると、コンソールはタグパラメーターを付加できず、ポリシー条件 (oss:BucketTag/key1=value1) を満たさないため、リクエストは拒否されます。権限が不十分であることを示すプロンプトが表示されます。 -
その他の操作 (
PutObjectやGetObjectなど) もタグ条件の制限を受けます。操作の対象バケットは、key1=value1というタグ要件を満たす必要があります。
シナリオ 17:RAM ユーザーへの書き込み専用権限 (oss:PutObject) の付与
次の RAM ポリシーでは、OSS にファイルをアップロードする権限を RAM ユーザーに付与しますが、バケットやオブジェクトを読み取ったり一覧表示したりする権限は付与しません。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:PutObject",
"Resource": "acs:oss:*:*:*"
}
]
}
このポリシーが RAM ユーザーに付与されると、RAM ユーザーは ossutil または SDK 経由でファイルをアップロードできますが、ls を使用してバケットを一覧表示したり、cp を使用してファイルをダウンロードしたりすることはできません。これら 2 種類のリクエストは 403 AccessDenied エラーを返しますが、これはポリシーが有効になった場合の期待される動作です。書き込み専用権限を特定のバケットにのみ付与する必要がある場合は、Resource スコープを acs:oss:*:*:{bucket-name}/* に絞り込むことができます。acs:oss:*:*:/* は有効な Resource 形式ではなく、認可検証をパスできないため、使用しないでください。
このポリシーは、RAM ユーザーまたは RAM ロールのいずれか一方に付与できます。両方に同時に付与する必要はありません。STS の一時的な認証情報で OSS にアクセスする場合、RAM ユーザーの最終的な権限は、RAM ロールの権限と STS セッションポリシーの積集合になります。この場合、この書き込み専用権限ポリシーを直接 RAM ロールに付与できます。
セキュリティのベストプラクティス
RAM ポリシーの設定および RAM アイデンティティの管理では、以下のセキュリティのベストプラクティスに従って、データ漏洩のリスクを効果的に軽減し、権限管理の精度を確保してください:
-
最小権限の原則に従う:タスクの実行に必要な最小限の権限セットのみを常に付与してください。絶対に必要でない限り、
oss:*のような広範な権限の使用は避けてください。最小権限の原則に従うことで、潜在的な攻撃対象領域を減らし、権限の乱用や誤操作のリスクを低減できます。 -
RAM ロールと STS の一時的な認証情報を使用する:アプリケーション、特に ECS やコンテナにデプロイされたものには、RAM ロールを使用して STS の一時的な認証情報を取得し、OSS にアクセスすることを推奨します。永続的な AccessKey ペアと比較して、一時的な認証情報には自動で失効する仕組みがあります。これにより、コードや設定ファイルに永続的な AccessKey ペアをハードコーディングすることを避け、AccessKey の漏洩リスクを大幅に削減できます。
-
ヒューマンユーザーとプログラムユーザーを分離する:異なる担当者やアプリケーションごとに個別の RAM ユーザーを作成することで、専門的なアイデンティティ管理ときめ細かな権限コントロールを実現できます。
-
ヒューマンユーザー:コンソールアクセスを設定し、ユーザー名とパスワードを使用してクラウドサービスのコンソールにアクセスします。MFA 多要素認証を有効にすることを推奨します。
-
プログラムユーザー:永続的な AccessKey アクセスを設定し、アクセスキーを使用して API を呼び出し、クラウドリソースにアクセスします。
-
-
AccessKey のセキュリティ管理:
-
RAM ユーザーの AccessKey ID と AccessKey Secret をプロジェクトコードに保存しないでください。そうしないと、AccessKey が漏洩する可能性があります。
-
STS または環境変数を使用してアクセス権限を取得することを推奨します。
-
AccessKey を定期的にローテーションしてください。
-
-
RAM ロールのセキュリティに関する推奨事項:
-
RAM ロールを作成した後、ビジネスオペレーションへの影響や過剰な権限付与のリスクを避けるため、RAM ロールの信頼できるエンティティを任意に変更しないでください。
-
有効期間が長すぎることによるセキュリティリスクを避けるため、STS トークンの有効期間を合理的に設定してください。
-
-
権限を定期的に監査する:不要になった RAM ユーザーと権限ポリシーを定期的に確認および整理し、権限が現在のビジネス要件と一致していることを確認してください。
-
Condition を使用してセキュリティを強化する:ポリシーに
Conditionを追加し、ソース IP アドレスや VPC の制限といった多次元の条件制約を設けることで、データアクセスのセキュリティレイヤーをさらに強化できます。重要RAM ポリシーを設定する際は、ご自身のネットワークアクセスアーキテクチャに基づいて設定してください。デュアルアクセス制御を実装するために、
acs:SourceIpとacs:SourceVpcの両方の条件を設定することを推奨します。単一の条件ではセキュリティ上の死角が生じる可能性があります。例えば、パブリック IP アドレスのみを制限した場合、VPC インスタンスがパブリックインターネットを介して一致するエグレス IP アドレスを使用することで制限を回避し、不正アクセスを引き起こす可能性があります。
ポリシーが有効にならない場合のトラブルシューティング
RAM カスタムポリシーを設定した後も OSS へのアクセスリクエストが失敗する場合は、以下の一般的な原因を参考に、手順に沿ってトラブルシューティングしてください。
明示的な Deny ルールによる Allow の上書き
症状:RAM ポリシーに Allow ステートメントを設定しているにもかかわらず、リクエストが AccessDenied エラーを返します。
トラブルシューティング手順:
-
[RAM ユーザー] ページに移動し、対象のユーザーをクリックして、[権限] タブでこのアイデンティティにバインドされているすべてのポリシー (システムポリシーとカスタムポリシーを含む) を表示します。
-
各ポリシーを 1 つずつ確認し、
Effect: Denyを含むステートメントがないかを確認します。特に、Actionにワイルドカード (例:oss:*) が含まれるルール、または対象のアクションが含まれるルールに注目してください。 -
アカウントレベルでサービスコントロールポリシー (SCP) が有効になっている場合は、SCP にリクエストと一致する Deny ルールがないかを確認します。
解決策:不要な Deny ステートメントを削除するか、Deny ルールの Resource と Condition のスコープを絞り込み、Allow されている正当なリクエストを誤って遮断しないようにしてください。RAM ポリシーは明示的な拒否の優先原則に従います。つまり、同一ポリシーまたは他のポリシーに Allow ルールが存在していても、いずれかの Deny ルールがリクエストに一致するとアクセスは拒否されます。
リソース ARN 形式の誤り
症状:GetObject や PutObject などのオブジェクトレベルのアクションで権限不足が返されたり、ListObjects などのバケットレベルのアクションが失敗したりします。これら 2 種類のアクションでは、Resource を個別に設定する必要があります。
トラブルシューティング手順:
-
ポリシーの
Resourceフィールドを確認し、バケットレベルのリソース (acs:oss:*:*:bucketname) とオブジェクトレベルのリソース (acs:oss:*:*:bucketname/*) の両方が含まれているかを確認します。 -
アカウント ID が正しく入力されていることを確認します。すべてのアカウントに一致させるために
*を使用している場合は、想定する権限のスコープと一致していることを確認します。 -
ディレクトリレベルの認可では、正しいプレフィックスのワイルドカード (例:
acs:oss:*:*:mybucket/dir/*) を使用していることを確認します。Resourceにディレクトリパスを記述しているにもかかわらず、ListObjectsに必要なバケットレベルのリソースを省略していないかにも注意してください。
解決策:バケットレベルとオブジェクトレベルの両方のアクションを認可する必要がある場合は、同一ポリシー内で 2 種類の Resource を設定します。
{
"Effect": "Allow",
"Action": ["oss:ListObjects", "oss:GetBucketInfo"],
"Resource": "acs:oss:*:*:mybucket"
},
{
"Effect": "Allow",
"Action": ["oss:GetObject", "oss:PutObject"],
"Resource": "acs:oss:*:*:mybucket/*"
}
ポリシーが正しい RAM アイデンティティにアタッチされていない
症状:ポリシーを作成または変更した後も権限が有効にならず、RAM ユーザーまたは RAM ロールの実際のアクセス動作が変わりません。
トラブルシューティング手順:
-
ポリシー ページに移動し、対象のポリシーを見つけ、[ユーザーのバインド] をクリックして現在バインドされている ID のリストを表示します。対象のユーザーまたはロールがリストに含まれていることを確認します。
-
ユーザーグループを介して権限が付与される場合、RAM ユーザーグループ ページに移動し、RAM ユーザーが対応するユーザーグループに追加されていること、およびそのユーザーグループに対象のポリシーがアタッチされていることを確認します。
-
RAM ロールを使用している場合は、アプリケーションまたはユーザーが、別のロールではなく、対象のポリシーがアタッチされている正しいロールを引き受けていることを確認します。
解決策:対象ユーザーの [権限] タブで [権限を付与] をクリックし、対象のポリシーをこの RAM アイデンティティにアタッチしてから、再度テストします。
Condition の不一致
症状:ポリシーに Condition (IP 制限、VPC 制限、時間帯制限など) が含まれており、特定のソースからのリクエスト、または特定の時間帯のリクエストが想定外に拒否されます。
トラブルシューティング手順:
-
ポリシーの
Condition設定を確認し、使用している条件キー (例:acs:SourceIp、acs:SourceVpc、oss:Prefix) と、それぞれの一致値を検証します。 -
リクエスト元のクライアントの実際の IP アドレス、VPC ID などの属性が、
Conditionの要件を満たしているかを確認します。 -
acs:SourceIpとacs:SourceVpcは、通常はセキュリティ上の死角を避けるために併用する必要があります。パブリック IP アドレスのみを制限している場合、VPC 内のリクエストが一致する IP アドレスのパブリックインターネット出口を経由してルーティングされ、制限を回避する可能性があります。詳細については、「本番環境への適用」のセキュリティ推奨事項をご参照ください。
解決策:実際のネットワークアクセスアーキテクチャに基づいて Condition フィールドを調整します。問題を特定するために、まず Condition を一時的に削除してポリシーの基本的な Allow が機能することを確認し、その後、条件制約を段階的に追加して検証してください。
Action 名のスペルミスまたは不足
症状:該当アクションの Allow を設定しているにもかかわらず、リクエストが AccessDenied を返します。または、OSS コンソール経由のアクセスは正常ですが、SDK または API 呼び出しが失敗します (またはその逆)。
トラブルシューティング手順:
-
ポリシー内の各
Action名を検証します。OSS の Action はケースセンシティブ (大文字と小文字を区別します) です。正しい形式は、例:oss:GetObjectであり、oss:getobjectではありません。 -
OSS コンソール経由の操作では、通常、複数の Action を同時に認可する必要があります (例:
oss:ListBuckets、oss:GetBucketStat、oss:GetBucketInfo、oss:GetBucketAcl)。不足がないか確認します。 -
OSS がサポートする RAM 認可要素を参照し、必要なアクションの正式名称と適用シナリオを確認します。
解決策:スペルミスしている Action 名を修正し、実際の利用シナリオ (コンソール、SDK、API) に基づいて必要な Action をすべて追加します。
バケットポリシーと RAM ポリシーの相互影響
症状:RAM ポリシーで対象アクションを認可しているにもかかわらず、特定のバケットへのアクセスが拒否されます。または、RAM ポリシーを削除した後もアクセス動作が変わりません。
トラブルシューティング手順:
-
OSS コンソールに移動し、対象バケットを開いて、[アクセス制御] > [バケットポリシー] を選択します。現在のアイデンティティに適用される Deny ルールがないかを確認します。
-
明示的な拒否の優先原則に従い、バケットポリシーの Deny ルールと RAM ポリシーの Allow ルールは拒否優先で評価されます。つまり、RAM ポリシーでアクションを認可していても、バケットポリシーに一致する Deny ルールがある限り、リクエストは拒否されます。
-
バケットのアクセス制御リスト (ACL) 設定を確認します。ACL が
privateのバケットでは、すべてのアクセスを RAM ポリシーまたはバケットポリシーで明示的に認可する必要があります。バケットレベルの ACL がpublic-readまたはpublic-read-writeに設定されている場合、匿名ユーザーでもデータにアクセスできるため、データセキュリティ上のリスクになります。
解決策:RAM ポリシーとバケットポリシーを総合的に確認し、両者が競合していないことを確認します。RAM ポリシーの Allow ルールを有効にする必要がある場合は、バケットポリシー内の該当する Deny ルールを調整または削除するか、関連する認可を RAM ポリシーに集約してください。