RAM ポリシーは、RAM ユーザー、グループ、ロールなどの RAM ID にアタッチされる権限付与ポリシーです。RAM ポリシーを使用して、Object Storage Service (OSS) リソースに対する RAM ユーザーやロールのアクセス権限を管理できます。これらのポリシーでは、その ID が実行できる操作およびアクセス可能なリソースが定義されます。
仕組み
RAM ポリシーは、ID ベースの権限付与を使用します。このポリシーは、RAM ユーザー、グループ、またはロールにアタッチできます。ポリシーでは、特定のリソースに対して、特定の条件下で ID が実行できる操作が定義されます。
OSS に対して RAM ID がリクエストを送信すると、OSS は RAM ポリシーやバケットポリシーなど、関連するすべてのポリシーを評価し、アクセス可否を判断します。権限の評価は、明示的な拒否が優先されるルールに従います。
明示的な拒否が優先:いずれかのポリシーに一致する Deny 文が存在する場合、リクエストは即座に拒否されます。
明示的な許可:Deny 文が一致しないが、少なくとも 1 つの Allow 文が一致する場合、リクエストは許可されます。
デフォルトでの拒否:Deny 文も Allow 文も一致しない場合、リクエストはデフォルトで拒否されます。
OSS は、システムポリシーとカスタムポリシーという 2 種類の RAM ポリシーをサポートしています。システムポリシーは Alibaba Cloud によって事前設定されており、使用は可能ですが変更はできません。カスタムポリシーはユーザー自身で作成・管理でき、より柔軟な権限設定が可能です。
システムポリシーの付与
Alibaba Cloud が作成したシステムポリシーは、Resource Access Management (RAM) コンソールで直接 RAM ID に付与できます。以下の手順は、RAM ユーザーにシステムポリシーを付与する方法を示しています。
ユーザーページに移動します。対象ユーザーの [操作] 列で、権限の追加 をクリックします。
検索ボックスにシステムポリシーの名前を入力し、対象のシステムポリシーを選択します。OSS は以下の 2 つのシステムポリシーをサポートしています。
AliyunOSSFullAccess:OSS の完全な管理権限を付与します。
AliyunOSSReadOnlyAccess:OSS への読み取り専用アクセスを付与します。
新しい権限付与の確認 をクリックして、権限付与を完了します。
カスタムポリシーの付与
カスタムポリシーはユーザー自身で作成・管理できます。カスタムポリシーを付与するには、まずポリシーを作成し、その後対象の RAM ID に割り当てる必要があります。
カスタムポリシーの作成
ポリシーページに移動します。ポリシーの作成 をクリックします。
スクリプトの編集 タブをクリックします。エディターに JSON 形式の権限付与ポリシーを入力します。RAM ポリシーエディター を使用すると、ポリシーを迅速に生成できます。
ポリシー例:
example-bucketバケットおよびバケット内のすべてのオブジェクトに対して、すべての操作を許可します。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:*", "Resource": [ "acs:oss:*:*:example-bucket", "acs:oss:*:*:example-bucket/*" ] } ] }完全な権限付与ポリシーには、Version および Statement が含まれます。
Version:ポリシー言語のバージョンです。値は常に
1です。この値を変更しないでください。Statement:ポリシーの本文です。1 つ以上の Allow または Deny ルールを含めることができます。各ステートメントには、Effect、Action、Resource、および Condition が含まれます。
ポリシー要素
説明
Effect
ポリシーの効果です。有効な値は
AllowまたはDenyです。Action
リソースに対して実行する具体的な操作です。
*などのワイルドカードをサポートします。Resource
ポリシーが適用されるリソースの範囲です。
Condition
ポリシーが有効になる条件です。
複数の条件を設定する場合、ポリシーが適用されるにはすべての条件を満たす(AND 論理)必要があります。
権限付与要素の詳細については、「権限付与の構文と要素」をご参照ください。
OK をクリックします。ポリシー名 を入力し、OK をクリックして、カスタムポリシーの作成を完了します。
ステップ 2:ユーザー ID の権限付与
カスタムポリシーを作成したら、対象の RAM ID に割り当てる必要があります。以下の手順は、RAM ユーザーにカスタムポリシーを割り当てる方法を示しています。
ユーザーページに移動します。対象ユーザーの [操作] 列で、権限の追加 をクリックします。
検索ボックスに作成したカスタムポリシーの名前を入力し、対象のポリシーを選択します。
新しい権限付与の確認 をクリックして、権限付与を完了します。
一般的な権限付与シナリオ
以下のシナリオでは、RAM ポリシーの一般的なユースケースについて説明します。これらのシナリオでは、権限の付与、アクセスの制限、セキュリティコントロールの強化が取り上げられています。各シナリオには、完全なポリシー例が含まれています。ポリシーを使用する前に、バケット名やフォルダパスなどのパラメーターを要件に応じて修正する必要があります。
シナリオ 1:RAM ユーザーにバケットの完全制御を付与する
この例では、RAM ユーザーに mybucket バケットの完全制御を付与する方法を示します。
モバイルアプリケーションにバケットの完全制御を付与すると、高いセキュリティリスクが生じます。この実践は避けることを推奨します。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:*",
"Resource": [
"acs:oss:*:*:mybucket",
"acs:oss:*:*:mybucket/*"
]
}
]
}シナリオ 2:RAM ユーザーがバケット内で特定のパターンに一致するファイルを削除できないようにする
この例では、RAM ユーザーが mybucket バケット内で abc で始まる .txt ファイルをすべて削除できないようにする方法を示します。
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action": [
"oss:DeleteObject"
],
"Resource": [
"acs:oss:*:*:mybucket/abc*.txt"
]
}
]
}シナリオ 3:RAM ユーザーにバケット内のすべてのリソースを一覧表示および読み取る権限を付与する
この例では、OSS SDK または ossutil を使用して、RAM ユーザーに
mybucketバケット内のすべてのリソースを一覧表示および読み取る権限を付与する方法を示します。説明ListObjects 操作では、リソースをバケット全体にする必要があります。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:ListObjects", "Resource": "acs:oss:*:*:mybucket" }, { "Effect": "Allow", "Action": "oss:GetObject", "Resource": "acs:oss:*:*:mybucket/*" } ] }この例では、OSS コンソールを使用して、RAM ユーザーに
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 ユーザーにバケット内の複数のフォルダへのアクセス権限を付与する
mybucket バケットに写真が保存されていると仮定します。バケットには都市名で命名されたフォルダが含まれており、各都市フォルダには年で命名されたサブフォルダが含まれています。
mybucket[バケット]
├── beijing
│ ├── 2014
│ └── 2015
└── hangzhou
├── 2014
└── 2015 mybucket/hangzhou/2014/ および mybucket/hangzhou/2015/ フォルダに対して、RAM ユーザーに読み取り専用アクセスを付与できます。フォルダレベルの権限は高度な機能であり、ユースケースによってポリシーの複雑さが異なります。以下の例では、一般的なアプローチを示します。
mybucket/hangzhou/2014/およびmybucket/hangzhou/2015/フォルダ内のファイルの内容のみを読み取る権限を RAM ユーザーに付与します。RAM ユーザーがファイルの完全なパスを把握している場合、そのパスを使用してファイルを直接読み取ることができます。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:GetObject" ], "Resource": [ "acs:oss:*:*:mybucket/hangzhou/2014/*", "acs:oss:*:*:mybucket/hangzhou/2015/*" ] } ] }ossutil または API を使用して、RAM ユーザーに
mybucket/hangzhou/2014/およびmybucket/hangzhou/2015/フォルダ内のファイルを一覧表示する権限を付与します。RAM ユーザーがフォルダ内にどのようなファイルが存在するか不明な場合、
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 ユーザーはルートディレクトリから階層的に目的のフォルダまで移動できます。{ "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/*" ] } } } ] }
シナリオ 6:RAM ユーザーがバケット内の任意のファイルを削除できないようにする
この例では、RAM ユーザーが mybucket バケット内の任意のファイルを削除できないようにする方法を示します。
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action": [
"oss:DeleteObject"
],
"Resource": [
"acs:oss:*:*:mybucket/*"
]
}
]
}シナリオ 7:特定のタグを持つオブジェクトへの RAM ユーザーのアクセスを防止する
この例では、RAM ユーザーが examplebucket バケット内の status:ok および key1:value1 のタグが付いたオブジェクトにアクセスするのを防ぐために、Deny 文を追加する方法を示します。
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action": [
"oss:GetObject"
],
"Resource": [
"acs:oss:*:174649585760xxxx:examplebucket/*"
],
"Condition": {
"StringEquals": {
"oss:ExistingObjectTag/status":"ok",
"oss:ExistingObjectTag/key1":"value1"
}
}
}
]
}シナリオ 8:特定の IP アドレスからのみ OSS にアクセスできるように RAM ユーザーに権限を付与する
Allow文に IP アドレス制限を追加します。以下の例では、
mybucketバケット内のすべてのリソースを読み取る権限を RAM ユーザーに付与する際に、Allow文に IP アドレス制限を追加し、192.168.0.0/16および198.51.100.0/24の IP アドレス範囲からのみアクセスを許可する方法を示します。{ "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-*" ] } } } ] }Deny文に IP アドレス制限を追加します。この例では、
Deny文に IP アドレス制限を追加し、192.168.0.0/16範囲外のソース IP アドレスを持つ 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": [ "*" ] } } } ] }説明Deny 文が優先されるため、
192.168.0.0/16範囲外の IP アドレスから mybucket バケットのコンテンツにアクセスするリクエストは拒否されます。
シナリオ 9:RAM または STS を使用して他のユーザーに権限を付与する
この例では、IP アドレスが 192.168.0.1 のユーザーに対して、Java SDK クライアントを実行し、以下の操作を実行できるように RAM または Security Token Service (STS) を使用して権限を付与する方法を示します。
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-*"
]
}
}
}
]
}シナリオ 10:バケットおよびオブジェクトの 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"
]
}
}
}
]
}シナリオ 11:RAM ユーザーに IMM 機能を使用する権限を付与する
この RAM ポリシーは、RAM ユーザーに Intelligent Media Management (IMM) のドキュメント処理機能を使用する権限を付与します。
{
"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"
}
]
}シナリオ 12:RAM ユーザーにストレージ冗長タイプを変更する権限を付与する
特定のバケットのストレージ冗長タイプを変更する権限を RAM ユーザーに付与します。
この例では、
mybucketバケットのストレージ冗長タイプを変更する権限を RAM ユーザーに付与する方法を示します。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:CreateBucketDataRedundancyTransition", "oss:GetBucketDataRedundancyTransition", "oss:ListBucketDataRedundancyTransition", "oss:DeleteBucketDataRedundancyTransition" ], "Resource": "acs:oss:*:*:mybucket" } ] }すべてのバケットのストレージ冗長タイプを変更する権限を RAM ユーザーに付与します。
重要この例では、Alibaba Cloud アカウント内のすべてのバケットのストレージ冗長タイプを変更する権限を付与します。この権限は慎重に使用してください。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:CreateBucketDataRedundancyTransition", "oss:GetBucketDataRedundancyTransition", "oss:ListBucketDataRedundancyTransition", "oss:DeleteBucketDataRedundancyTransition" ], "Resource": "acs:oss:*:*:*" } ] }
シナリオ 13:RAM ユーザーに OSS リソースプランを購入する権限を付与する
この RAM ポリシーは、RAM ユーザーに OSS リソースプランを購入する権限を付与します。
RAM ユーザーが OSS リソースプランを購入した後、Alibaba Cloud アカウントのオーナーが支払いを完了する必要があります。RAM ユーザーが注文の支払いを行えるようにするには、アカウントオーナーが RAM ユーザーに bss:PayOrder 権限を付与する必要があります。bss:PayOrder 権限は金融取引に関わる高リスクの権限であるため、必要な場合にのみ付与してください。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:CreateOrder",
"Resource": "acs:oss:*:*:*"
}
]
}シナリオ 14:RAM ユーザーに OSS を有効化する権限を付与する
この RAM ポリシーは、RAM ユーザーに OSS を有効化する権限を付与します。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:ActivateProduct",
"Resource": "acs:oss:*:*:*"
}
]
}シナリオ 15:特定のタグを持つバケット内のデータを読み書きする権限を RAM ユーザーに付与する
以下の RAM ポリシーは、タグキーが key1 でタグ値が value1 のバケット内のデータに対して、RAM ユーザーに読み書き権限を付与します。
{
"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のタグが付与されている必要があります。
本番リリース
RAM ポリシーを構成し、RAM ID を管理する際は、以下のセキュリティベストプラクティスに従ってください。これにより、データ漏洩のリスクを軽減し、正確な権限制御を実現できます。
最小権限の原則を適用する:タスクを完了するために必要な最小限の権限のみを付与します。
oss:*のような広範な権限は、絶対に必要な場合を除き付与しないでください。最小権限の原則により、攻撃対象領域が縮小され、権限の乱用や誤操作によるリスクが低下します。RAM ロールと STS 一時認証情報を使用する:特に ECS インスタンスやコンテナーにデプロイされたアプリケーションでは、OSS へのアクセスに RAM ロールと STS 一時認証情報を使用することを推奨します。一時認証情報は自動的に有効期限切れとなるため、コードや設定ファイルに長期的な AccessKey ペアをハードコードする必要がなくなり、AccessKey ペアの漏洩リスクを大幅に低減できます。
人間ユーザーとプログラムユーザーを分離する:人間ユーザーとアプリケーション用に別々の RAM ユーザーを作成します。これにより、適切な ID 管理と詳細な権限制御が可能になります。
人間ユーザー:コンソールアクセス を有効にします。人間ユーザーはユーザー名とパスワードを使用して Alibaba Cloud コンソールにログインできます。人間ユーザーに対して多要素認証 (MFA) を有効にすることを推奨します。
プログラムユーザー:プログラムによるアクセス を有効にします。プログラムユーザーは AccessKey ペアを使用して API 操作を呼び出し、クラウドリソースにアクセスできます。
AccessKey ペアを安全に管理する:
RAM ユーザーの AccessKey ID および AccessKey Secret をアプリケーションコード内に保存しないでください。これにより、認証情報の漏洩リスクが高まります。
アクセス認証情報の提供には、STS トークンまたは環境変数を使用します。
AccessKey ペアを定期的にローテーションします。
RAM ロールを安全に管理する:
RAM ロールを作成した後は、不要な限り信頼できるエンティティを変更しないでください。計画外の変更により、ビジネスが中断されたり、権限が昇格したりする可能性があります。
STS トークンの有効期限を合理的に設定します。長期間有効なトークンはセキュリティリスクを高めます。
権限を定期的に監査する:未使用の RAM ユーザーや権限ポリシーを確認・削除します。権限が現在のビジネスニーズに合致していることを確認します。
条件を使用してセキュリティを強化する:ポリシーに
Condition要素を追加して、ソース IP アドレスや VPC を制限します。多次元的な条件により、データアクセスに対して追加の保護レイヤーが提供されます。重要RAM ポリシーを構成する際は、ネットワークアーキテクチャと整合性が取れていることを確認してください。
acs:SourceIpおよびacs:SourceVpcの両方の条件を使用して二要素アクセス制御を行うことを推奨します。単一の条件に依存すると、セキュリティ上の盲点が生じます。たとえば、パブリック IP アドレスのみを制限した場合、一致するパブリック IP アドレスを経由して VPC からのトラフィックがルールをバイパスできる可能性があります。