Amazon RDS のアイデンティティベースのポリシーの例
デフォルトでは、アクセス許可セットとロールには、Amazon RDS リソースを作成または変更するアクセス許可はありません。AWS Management Console、AWS CLI、または AWS API を使用してタスクを実行することもできません。管理者は、指定されたリソースに対して特定の API オペレーションを実行するために必要なアクセス許可をアクセス許可セットとロールに付与する IAM ポリシーを作成する必要があります。続いて、管理者は、それらのアクセス許可を必要とするアクセス許可セットまたはロールに、そのポリシーをアタッチします。
これらの JSON ポリシードキュメント例を使用して IAM のアイデンティティベースのポリシーを作成する方法については、『IAM ユーザーガイド』の「JSON タブでのポリシーの作成」を参照してください。
トピック
- ポリシーのベストプラクティス
- Amazon RDS コンソールの使用
- 自分の権限の表示をユーザーに許可する
- AWS アカウントでの DB インスタンスの作成をユーザーに許可する
- コンソールの使用に必要なアクセス許可
- RDS リソースに対する Describe アクションの実行をユーザーに許可する
- 指定した DB パラメータグループとサブネットグループを使用する DB インスタンスの作成をユーザーに許可する
- 2 つの異なる値を持つタグが付いたリソースに対するアクションにアクセス許可を付与する
- ユーザーによる DB インスタンスの削除を禁止する
- リソースへのすべてのアクセスを拒否する
- ポリシー例: 条件キーの使用
- 条件の指定: カスタムタグの使用
ポリシーのベストプラクティス
ID ベースのポリシーは、ユーザーのアカウント内で誰かが Amazon RDS リソースを作成、アクセス、または削除できるどうかを決定します。これらのアクションを実行すると、AWS アカウント に料金が発生する可能性があります。アイデンティティベースポリシーを作成したり編集したりする際には、以下のガイドラインと推奨事項に従ってください:
-
AWS マネージドポリシーを使用して開始し、最小特権の権限に移行する – ユーザーとワークロードへの権限の付与を開始するには、多くの一般的なユースケースのために権限を付与する AWS マネージドポリシーを使用します。これらは AWS アカウントで使用できます。ユースケースに応じた AWS カスタマーマネージドポリシーを定義することで、権限をさらに減らすことをお勧めします。詳細については、『IAM ユーザーガイド』の「AWS マネージドポリシー」または「AWS ジョブ機能の管理ポリシー」を参照してください。
-
最小特権を適用する – IAM ポリシーで権限を設定するときは、タスクの実行に必要な権限のみを付与します。これを行うには、特定の条件下で特定のリソースに対して実行できるアクションを定義します。これは、最小特権権限とも呼ばれています。IAM を使用して権限を適用する方法の詳細については、『IAM ユーザーガイド』の「IAM でのポリシーと権限」を参照してください。
-
IAM ポリシーで条件を使用してアクセスをさらに制限する - ポリシーに条件を追加して、アクションやリソースへのアクセスを制限できます。例えば、ポリシー条件を記述して、すべてのリクエストを SSL を使用して送信するように指定できます。また、AWS CloudFormation などの特定の AWS のサービスを介して使用する場合、条件を使ってサービスアクションへのアクセス権を付与することもできます。詳細については、『IAM ユーザーガイド』の [IAM JSON policy elements: Condition] (IAM JSON ポリシー要素:条件) を参照してください。
-
IAM Access Analyzer を使用して IAM ポリシーを検証し、安全で機能的な権限を確保する - IAM Access Analyzer は、新規および既存のポリシーを検証して、ポリシーが IAM ポリシー言語 (JSON) および IAM のベストプラクティスに準拠するようにします。IAM アクセスアナライザーは 100 を超えるポリシーチェックと実用的な推奨事項を提供し、安全で機能的なポリシーの作成をサポートします。詳細については、『IAM ユーザーガイド』の「IAM Access Analyzer ポリシーの検証」を参照してください。
-
多要素認証 (MFA) を要求する – AWS アカウント で IAM ユーザーまたはルートユーザーを要求するシナリオがある場合は、セキュリティを強化するために MFA をオンにします。API オペレーションが呼び出されるときに MFA を必須にするには、ポリシーに MFA 条件を追加します。詳細については、『IAM ユーザーガイド』の「MFA 保護 API アクセスの設定」を参照してください。
IAM でのベストプラクティスの詳細については、『IAM ユーザーガイド』の「IAM でのセキュリティのベストプラクティス」を参照してください。
Amazon RDS コンソールの使用
Amazon RDS コンソールにアクセスするには、一連の最小限のアクセス許可が必要です。これらのアクセス許可により、AWS アカウント の Amazon RDS リソースの詳細をリストおよび表示できるようにする必要があります。最小限必要なアクセス許可よりも制限が厳しいアイデンティティベースのポリシーを作成すると、そのポリシーを持つエンティティ (ユーザーまたはロール) ではコンソールが意図したとおりに機能しません。
AWS CLI または AWS API のみを呼び出すユーザーには、最小限のコンソール権限を付与する必要はありません。代わりに、実行しようとしている API オペレーションに一致するアクションのみへのアクセスが許可されます。
これらのエンティティが Amazon RDS コンソールを引き続き使用できるように、エンティティに次の AWS 管理ポリシーもアタッチします。
AmazonRDSReadOnlyAccess
詳細については、「IAM ユーザーガイド」の「ユーザーへのアクセス許可の追加」を参照してください。
自分の権限の表示をユーザーに許可する
この例では、ユーザーアイデンティティにアタッチされたインラインおよびマネージドポリシーの表示を IAM ユーザーに許可するポリシーの作成方法を示します。このポリシーには、コンソールで、または AWS CLI か AWS API を使用してプログラム的に、このアクションを完了するアクセス許可が含まれています。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "ViewOwnUserInfo", "Effect": "Allow", "Action": [ "iam:GetUserPolicy", "iam:ListGroupsForUser", "iam:ListAttachedUserPolicies", "iam:ListUserPolicies", "iam:GetUser" ], "Resource": ["arn:aws:iam::*:user/${aws:username}"] }, { "Sid": "NavigateInConsole", "Effect": "Allow", "Action": [ "iam:GetGroupPolicy", "iam:GetPolicyVersion", "iam:GetPolicy", "iam:ListAttachedGroupPolicies", "iam:ListGroupPolicies", "iam:ListPolicyVersions", "iam:ListPolicies", "iam:ListUsers" ], "Resource": "*" } ] }
AWS アカウントでの DB インスタンスの作成をユーザーに許可する
以下は、123456789012
アカウントで ID が AWS のユーザーが DB インスタンスを作成できるようにするポリシーの例です。ポリシーは、test
で始める新しい DB インスタンスの名前である必要があります。また、新しい DB インスタンスは、MySQL データベースエンジンと DB インスタンスの db.t2.micro
クラスを使用する必要があります。さらに、新しい DB インスタンスでは、オプショングループと default
で始まる DB パラメータグループ、および default
サブネットグループを使用する必要があります。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCreateDBInstanceOnly", "Effect": "Allow", "Action": [ "rds:CreateDBInstance" ], "Resource": [ "arn:aws:rds:*:123456789012:db:test*", "arn:aws:rds:*:123456789012:og:default*", "arn:aws:rds:*:123456789012:pg:default*", "arn:aws:rds:*:123456789012:subgrp:default" ], "Condition": { "StringEquals": { "rds:DatabaseEngine": "mysql", "rds:DatabaseClass": "db.t2.micro" } } } ] }
ポリシーには、 ユーザー用の以下のアクセス許可を指定する単一のステートメントが含まれます。
ポリシーを使用すると、ユーザーは CreateDBInstance API オペレーションを使用して DB インスタンスを作成できます (これは create-db-instance AWS CLI コマンドと AWS Management Console にも適用されます)。
Resource
要素では、ユーザーがリソースでアクションを実行できることを指定できます。Amazon Resources Name (ARN) を使用してリソースを指定します。この ARN には、リソースが属しているサービスの名前 (rds
)、AWS リージョン (*
はこの例のリージョンを示します)、AWS アカウント番号 (123456789012
はこの例のアカウント番号です)、およびリソースのタイプが含まれます。ARN の作成の詳細については、「Amazon RDS の Amazon リソースネーム (ARN) の使用」を参照してください。例の
Resource
要素は、ユーザーのリソースで、以下のポリシーの制約を指定します。新しい DB インスタンスの DB インスタンス識別子は、
test
で始まる必要があります (例:testCustomerData1
、test-region2-data
)。新しい DB インスタンスのオプショングループは、
default
で始まる必要があります。新しい DB インスタンスの DB パラメータグループは、
default
で始まる必要があります。新しい DB インスタンスのサブネットグループは、
default
サブネットグループである必要があります。
Condition
要素は、DB エンジンが MySQL で、DB インスタンスクラスがdb.t2.micro
である必要があることを指定します。Condition
要素は、ポリシーが有効になる条件を指定します。Condition
要素を使用して、アクセス許可または制約を追加できます。条件を指定する方法については、「Amazon RDS のポリシー条件キー」を参照してください。この例では、rds:DatabaseEngine
およびrds:DatabaseClass
を条件として指定します。rds:DatabaseEngine
の有効な条件値については、CreateDBInstance のEngine
パラメータのリストを参照してください。rds:DatabaseClass
の有効な条件値については、「DB インスタンスクラスでサポートされている DB エンジン」を参照してください。
アイデンティティベースのポリシーでアクセス権限を得るプリンシパルを指定していないため、ポリシーでは Principal
要素を指定していません。ユーザーにポリシーをアタッチすると、そのユーザーが暗黙のプリンシパルになります。IAM ロールにアクセス権限ポリシーをアタッチすると、ロールの信頼ポリシーで識別されたプリンシパルがアクセス権限を得ることになります。
Amazon RDS アクションのリストを確認するには、サービス認証リファレンスの「Amazon RDS で定義されるアクション」を参照してください。
コンソールの使用に必要なアクセス許可
コンソールを使用するユーザーには、最小限のアクセス許可のセットが必要です。これらのアクセス許可により、ユーザーは AWS アカウントの Amazon RDS リソースを記述し、Amazon EC2 セキュリティやネットワーク情報など、その他の関連情報を提供できます。
これらの最小限必要なアクセス権限よりも制限された IAM ポリシーを作成している場合、その IAM ポリシーを使用するユーザーに対してコンソールは意図したとおりには機能しません。「AmazonRDSReadOnlyAccess
」で説明されているとおり、ユーザーがコンソールを使用できること、および ポリシーを使用したアクセスの管理 管理ポリシーがユーザーにアタッチされていることを確認してください。
AWS CLI または Amazon RDS API のみを呼び出すユーザーには、最小限のコンソールアクセス許可を付与する必要はありません。
以下のポリシーでは、ルート AWS アカウントの Amazon RDS リソースへのフルアクセスが付与されます。
AmazonRDSFullAccess
RDS リソースに対する Describe アクションの実行をユーザーに許可する
以下のアクセス権限ポリシーは、Describe
で始まるすべてのアクションを実行するためのアクセス権限をユーザーに付与します。これらのアクションは、DB インスタンスなど RDS リソースに関する情報を表示します。Resource
要素内のワイルドカード文字 (*) は、アカウントによって所有されるすべての Amazon RDS リソースに対してそれらのアクションが許可されることを示します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowRDSDescribe", "Effect": "Allow", "Action": "rds:Describe*", "Resource": "*" } ] }
指定した DB パラメータグループとサブネットグループを使用する DB インスタンスの作成をユーザーに許可する
以下の許可ポリシーは、mydbpg
DB パラメータグループと mydbsubnetgroup
DB サブネットグループを使用する必要のある DB インスタンスを作成することのみをユーザーに許可するための許可を付与します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "rds:CreateDBInstance", "Resource": [ "arn:aws:rds:*:*:pg:mydbpg", "arn:aws:rds:*:*:subgrp:mydbsubnetgroup" ] } ] }
2 つの異なる値を持つタグが付いたリソースに対するアクションにアクセス許可を付与する
アイデンティティベースのポリシーの条件を使用して、タグに基づいて Amazon RDS リソースへのアクセスを制御できます。次のポリシーでは、stage
タグが development
または test
に設定された DB インスタンスに対して CreateDBSnapshot
API オペレーションを実行するためのアクセス許可が付与されます。
{ "Version":"2012-10-17", "Statement":[ { "Sid":"AllowAnySnapshotName", "Effect":"Allow", "Action":[ "rds:CreateDBSnapshot" ], "Resource":"arn:aws:rds:*:123456789012:snapshot:*" }, { "Sid":"AllowDevTestToCreateSnapshot", "Effect":"Allow", "Action":[ "rds:CreateDBSnapshot" ], "Resource":"arn:aws:rds:*:123456789012:db:*", "Condition":{ "StringEquals":{ "rds:db-tag/stage":[ "development", "test" ] } } } ] }
次のポリシーでは、stage
タグが development
または test
に設定された DB インスタンスに対して ModifyDBInstance
API オペレーションを実行するためのアクセス許可が付与されます。
{ "Version":"2012-10-17", "Statement":[ { "Sid":"AllowChangingParameterOptionSecurityGroups", "Effect":"Allow", "Action":[ "rds:ModifyDBInstance" ], "Resource": [ "arn:aws:rds:*:123456789012:pg:*", "arn:aws:rds:*:123456789012:secgrp:*", "arn:aws:rds:*:123456789012:og:*" ] }, { "Sid":"AllowDevTestToModifyInstance", "Effect":"Allow", "Action":[ "rds:ModifyDBInstance" ], "Resource":"arn:aws:rds:*:123456789012:db:*", "Condition":{ "StringEquals":{ "rds:db-tag/stage":[ "development", "test" ] } } } ] }
ユーザーによる DB インスタンスの削除を禁止する
以下のアクセス権限ポリシーは、特定の DB インスタンスを削除することをユーザーに禁止するためのアクセス権限を付与します。例えば、管理者以外のすべてのユーザーに対して、本稼働 DB インスタンスの削除を拒否することができます。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyDelete1", "Effect": "Deny", "Action": "rds:DeleteDBInstance", "Resource": "arn:aws:rds:us-west-2:123456789012:db:my-mysql-instance" } ] }
リソースへのすべてのアクセスを拒否する
リソースへのアクセスを明示的に拒否できます。拒否ポリシーは許可ポリシーよりも優先されます。以下のポリシーは、リソースを管理する機能をユーザーに明示的に拒否します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "rds:*", "Resource": "arn:aws:rds:us-east-1:123456789012:db:mydb" } ] }
ポリシー例: 条件キーの使用
以下に示しているのは、Amazon RDS IAM アクセス許可ポリシーでの条件キーの使用例です。
例 1: 特定の DB エンジンを使用し、マルチ AZ ではない DB インスタンスを作成するためのアクセス許可を付与する
以下のポリシーでは、RDS 条件キーを使用して、MySQL データベースエンジンを使用するがマルチ AZ でない DB インスタンスのみをユーザーが作成できるようにします。Condition
要素では、データベースエンジンが MySQL であることが要件になることを示しています。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowMySQLCreate", "Effect": "Allow", "Action": "rds:CreateDBInstance", "Resource": "*", "Condition": { "StringEquals": { "rds:DatabaseEngine": "mysql" }, "Bool": { "rds:MultiAz": false } } } ] }
例 2: 特定の DB インスタンスクラスの DB インスタンスを作成するためのアクセス許可と、プロビジョンド IOPS を使用する DB インスタンスを作成するためのアクセス許可を明示的に拒否する
以下のポリシーでは、最もサイズが大きくてコストの高いインスタンスである DB インスタンスクラス r3.8xlarge
と m4.10xlarge
を使用する DB インスタンスの作成のためのアクセス許可を明示的に拒否しています。このポリシーでは、追加のコストが発生するプロビジョンド IOPS を使用する DB インスタンスの作成もユーザーに禁止しています。
明示的に拒否するアクセス権限は、付与する他のいずれのアクセス権限よりも優先されます。これにより、決して付与されることのないアクセス権限を ID が誤って取得することがなくなります。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyLargeCreate", "Effect": "Deny", "Action": "rds:CreateDBInstance", "Resource": "*", "Condition": { "StringEquals": { "rds:DatabaseClass": [ "db.r3.8xlarge", "db.m4.10xlarge" ] } } }, { "Sid": "DenyPIOPSCreate", "Effect": "Deny", "Action": "rds:CreateDBInstance", "Resource": "*", "Condition": { "NumericNotEquals": { "rds:Piops": "0" } } } ] }
例 3: リソースにタグを付けるために使用できるタグキーと値のセットを制限する
次のポリシーは、RDS 条件キーを使用し、キー stage
を持つタグの追加を値 test
、qa
、および production
を持つリソースに追加することができます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "rds:AddTagsToResource", "rds:RemoveTagsFromResource" ], "Resource": "*", "Condition": { "streq": { "rds:req-tag/stage": [ "test", "qa", "production" ] } } } ] }
条件の指定: カスタムタグの使用
Amazon RDS では、カスタムタグを使用して IAM ポリシーで条件を指定することがサポートされています。
例えば、environment
という名前のタグを、beta
、staging
、production
などの値で DB インスタンスに追加するとします。追加する場合、特定のユーザーを environment
タグ値に基づく DB インスタンスに制限するポリシーを作成することができます。
注記
カスタムタグ識別子は大文字と小文字が区別されます。
以下の表では、Condition
要素で使用できる RDS タグ識別子を示しています。
RDS タグ識別子 | 適用先 |
---|---|
db-tag |
リードレプリカを含む DB インスタンス |
snapshot-tag |
DB スナップショット |
ri-tag |
リザーブド DB インスタンス |
og-tag |
DB オプショングループ |
pg-tag |
DB パラメータグループ |
subgrp-tag |
DB サブネットグループ |
es-tag |
イベントサブスクリプション |
cluster-tag |
DB クラスター |
cluster-pg-tag |
DB クラスターのパラメータグループ |
cluster-snapshot-tag |
DB クラスタースナップショット |
カスタムタグの条件の構文は次のとおりです。
"Condition":{"StringEquals":{"rds:
rds-tag-identifier
/tag-name
":
["value
"]} }
例えば、次の Condition
要素は、environment
という名前のタグを持ち、タグの値が production
である DB インスタンスに適用されます。
"Condition":{"StringEquals":{"rds:db-tag/
environment
": ["production
"]} }
タグの作成の詳細については、「Amazon RDS リソースのタグ付け」を参照してください。
重要
タグを使用して RDS リソースへのアクセスを管理する場合は、RDS リソースのタグへのアクセスを保護することをお勧めします。AddTagsToResource
および RemoveTagsFromResource
アクションのポリシーを作成することによって、タグへのアクセスを管理できます。例えば、次のポリシーは、ユーザーがすべてのリソースのタグを追加または削除することを拒否します。次に、特定のユーザーがタグを追加または削除することを許可するポリシーを作成できます。
{ "Version":"2012-10-17", "Statement":[ { "Sid":"DenyTagUpdates", "Effect":"Deny", "Action":[ "rds:AddTagsToResource", "rds:RemoveTagsFromResource" ], "Resource":"*" } ] }
Amazon RDS アクションのリストを確認するには、サービス認証リファレンスの「Amazon RDS で定義されるアクション」を参照してください。
ポリシー例: カスタムタグの使用
以下に示しているのは、Amazon RDS IAM アクセス許可ポリシーでのカスタムタグの使用例です。Amazon RDS リソースへのタグの追加の詳細については、「Amazon RDS の Amazon リソースネーム (ARN) の使用」を参照してください。
注記
すべての例で、us-west-2 リージョンを使用し、架空のアカウント ID を含めています。
例 1: 2 つの異なる値を持つタグが付いたリソースに対するアクションにアクセス許可を付与する
次のポリシーでは、stage
タグが development
または test
に設定された DB インスタンスに対して CreateDBSnapshot
API オペレーションを実行するためのアクセス許可が付与されます。
{ "Version":"2012-10-17", "Statement":[ { "Sid":"AllowAnySnapshotName", "Effect":"Allow", "Action":[ "rds:CreateDBSnapshot" ], "Resource":"arn:aws:rds:*:123456789012:snapshot:*" }, { "Sid":"AllowDevTestToCreateSnapshot", "Effect":"Allow", "Action":[ "rds:CreateDBSnapshot" ], "Resource":"arn:aws:rds:*:123456789012:db:*", "Condition":{ "StringEquals":{ "rds:db-tag/stage":[ "development", "test" ] } } } ] }
次のポリシーでは、stage
タグが development
または test
に設定された DB インスタンスに対して ModifyDBInstance
API オペレーションを実行するためのアクセス許可が付与されます。
{ "Version":"2012-10-17", "Statement":[ { "Sid":"AllowChangingParameterOptionSecurityGroups", "Effect":"Allow", "Action":[ "rds:ModifyDBInstance" ], "Resource":" [ "arn:aws:rds:*:123456789012:pg:*", "arn:aws:rds:*:123456789012:secgrp:*", "arn:aws:rds:*:123456789012:og:*" ] }, { "Sid":"AllowDevTestToModifyInstance", "Effect":"Allow", "Action":[ "rds:ModifyDBInstance" ], "Resource":"arn:aws:rds:*:123456789012:db:*", "Condition":{ "StringEquals":{ "rds:db-tag/stage":[ "development", "test" ] } } } ] }
例 2: 指定した DB パラメータグループを使用する DB インスタンスを作成するためのアクセス許可を明示的に拒否する
以下のポリシーでは、特定のタグ値が設定された DB パラメータグループを使用する DB インスタンスの作成のためのアクセス権限を明示的に拒否しています。DB インスタンスを作成するときに特定のユーザー定義の DB パラメータグループの使用を必須とする場合にも、このポリシーを適用できます。Deny
を使用するポリシーは、ほとんどの場合、適用範囲のより広いポリシーによって付与されるアクセス許可を制限するために使用します。
明示的に拒否するアクセス権限は、付与する他のいずれのアクセス権限よりも優先されます。これにより、決して付与されることのないアクセス権限を ID が誤って取得することがなくなります。
{ "Version":"2012-10-17", "Statement":[ { "Sid":"DenyProductionCreate", "Effect":"Deny", "Action":"rds:CreateDBInstance", "Resource":"arn:aws:rds:*:123456789012:pg:*", "Condition":{ "StringEquals":{ "rds:pg-tag/usage":"prod" } } } ] }
例 3: インスタンス名にユーザー名がプレフィックスとして付加されている DB インスタンスに対するアクションにアクセス許可を付与する
以下のポリシーでは、DB インスタンス名の前にユーザー名が付いている DB インスタンスのうち、AddTagsToResource
と同等の RemoveTagsFromResource
というタグが付いているか、または stage
というタグが付いていない DB インスタンスに対する、API (devo
または stage
を除く) の呼び出しのためのアクセス権限を付与しています。
ポリシーの Resource
行では、リソースをその Amazon Resource Name (ARN) により識別しています。ARN と Amazon RDS リソースの使用の詳細については、「Amazon RDS の Amazon リソースネーム (ARN) の使用」を参照してください。
{ "Version":"2012-10-17", "Statement":[ { "Sid":"AllowFullDevAccessNoTags", "Effect":"Allow", "NotAction":[ "rds:AddTagsToResource", "rds:RemoveTagsFromResource" ], "Resource":"arn:aws:rds:*:123456789012:db:${aws:username}*", "Condition":{ "StringEqualsIfExists":{ "rds:db-tag/stage":"devo" } } } ] }