権限管理の原則
ロールは権限セットとして作成されます。 ロールを使用して、きめ細かいレベルで権限を管理できます。 ロールにはログイン権限がありません。 ログイン権限を付与できるユーザーを作成できます。 ApsaraDB RDS for PostgeSQLの管理モデルでは、ユーザーの権限は、ユーザーに関連付けられているロールの権限とログイン権限で構成されます
。 ユーザーの権限は、関連するロールの権限によって異なります。
権限管理のモデル
ApsaraDB RDS for PostgeSQLの管理モデルは、使いやすく、効果的で、ほとんどのビジネスシナリオに適しています。
- RDSインスタンス用に特権アカウントを作成できます。 特権アカウントには、RDSインスタンスに対するすべての権限があり、少数のデータベース管理者のみが使用できます。
- 1つの所有者と、{project}_role_readwriteおよび {project}_role_readonlyという名前の2つのロールを作成できます。 所有者と役割を使用して、チームまたはプロジェクトを管理できます。
説明
より細かいレベルで権限を管理したい場合は、ビジネス要件に基づいてロールを作成できます。
- ユーザーを作成できます。 ユーザーの権限は、
ユーザーに関連付けられているロールの権限とログオン権限で構成されます
。 - チームまたはプロジェクトに対して複数のスキーマを定義できます。 スキーマレベルまたはロールレベルで権限を付与することを推奨します。
public
という名前のスキーマにテーブルを配置しないでください。 既定では、すべてのユーザーには、public
スキーマに対するCREATEアクセス許可とUSAGEアクセス許可があります。
権限管理の例
このセクションでは、プロジェクトレベルで権限を管理する方法の例を示します。 また、例に記載されている手順に従って、チームレベルで権限を管理することもできます。
- データベース管理者は、RDSインスタンスのdbsuperuserという名前の特権アカウントを使用できます。
- プロジェクトの名前はrdspgで、rdspgとrdspg_1という2つのスキーマが作成されます。
次の表に、プロジェクトで作成した所有者とロールの権限を示します。
所有者または役割 | テーブルの権限 | ストアドプロシージャの権限 |
所有者または役割 | テーブルの権限 | ストアドプロシージャの権限 |
rdspg_ownerという名前の所有者 | - DDL: CREATE、DROP、およびALTER操作を実行するための権限。
- データクエリ言語 (DQL): SELECT操作を実行するための権限。
- DML: UPDATE、INSERT、およびDELETE操作を実行するための権限。
| - DDL: CREATE、DROP、およびALTER操作を実行するための権限。
- DQL: SELECT操作を実行するための権限とストアドプロシージャを呼び出すための権限。
|
rdspg_role_readwriteという名前のロール | - DQL: SELECT操作を実行するための権限。
- DML: UPDATE、INSERT、およびDELETE操作を実行するための権限。
| DQL: SELECT操作を実行するための権限とストアドプロシージャを呼び出すための権限。 ストアドプロシージャでDDL操作が見つかった場合は、権限に関連するエラーメッセージが表示されます。 |
rdspg_role_readonlyという名前のロール | DQL: SELECT操作を実行するための権限。 | DQL: SELECT操作を実行するための権限とストアドプロシージャを呼び出すための権限。 ストアドプロシージャでDDL操作が見つかった場合は、権限に関連するエラーメッセージが表示されます。 |
ビジネス要件に基づいて作成したユーザーに権限を付与できます。
- rdspg_readwriteユーザーの権限は、rdspg_role_readwriteロールの権限とログオン権限で構成されます。
- rdspg_readonlyユーザーの権限は、rdspg_role_readonlyロールの権限とログオン権限で構成されます。
手順
- rdspg_ownerという名前の所有者と、rdspg_role_readwriteおよびrdspg_role_readonlyという名前の2つのロールをプロジェクトに作成します。
RDSインスタンスのdbsuperuserという名前の特権アカウントを使用して、データベース管理者として次の操作を実行します。
--- rdspg_ownerは所有者のユーザー名です。 この例のパスワードは参照用です。 パスワードを所有者の実際のパスワードに置き換えます。
LOGIN PASSWORD 'asdfy181BASDfadasdbfas' でユーザーrdspg_ownerを作成します。ROLE rdspg_role_readwriteを作成します。ROLE rdspg_role_readonlyを作成します。--- rdspg_ownerの所有者の資格情報を使用して作成されたテーブルに対して、DQL SELECT操作とDML UPDATE、INSERT、およびDELETE操作を実行する権限をrdspg_role_readwriteロールに付与します。
ROLE rdspg_ownerのALTER DEFAULTの優先事項rdspg_role_readwriteにすべてのテーブルを付与します。--- rdspg_ownerの所有者の資格情報を使用して作成されたシーケンスに対して、DQL SELECT操作とDML UPDATE、INSERT、およびDELETE操作を実行する権限をrdspg_role_readwriteロールに付与します。
ROLE rdspg_ownerのALTER DEFAULT特権rdspg_role_readwriteへのシーケンスのすべてを承認します。--- rdspg_ownerの資格情報を使用して作成されたテーブルに対してDQL SELECT操作を実行する権限をrdspg_role_readonlyロールに付与します。
ROLE rdspg_ownerのALTER DEFAULT PRIVILEGES rdspg_role_readonly;
- rdspg_readwriteとrdspg_readonlyという名前の2人のユーザーを作成します。
RDSインスタンスのdbsuperuserという名前の特権アカウントを使用して、データベース管理者として次の操作を実行します。
--- DQL SELECT操作およびDML UPDATE、INSERT、およびDELETE操作を実行する権限をrdspg_readwriteユーザーに付与します。
LOGIN PASSWORD 'dfandfnapSDhf23hbEfabf' でユーザーrdspg_readwriteを作成します。GRANT rdspg_role_readwriteからrdspg_readwriteへ。--- DQL SELECT操作を実行する権限をrdspg_readonlyユーザーに付与します。
LOGIN PASSWORD 'F89h912badSHfadsd01zlk' でユーザーrdspg_readonlyを作成します。GRANT rdspg_role_readonlyからrdspg_readonlyへ。
- rdspgという名前のスキーマを作成し、そのスキーマに対する権限をrdspg_role_readwriteロールとrdspg_role_readonlyロールに付与します。
RDSインスタンスのdbsuperuserという名前の特権アカウントを使用して、データベース管理者
として次の操作を実行します。--- rdspg_ownerをrdspgスキーマの所有者として指定します。
スキーマrdspg認証を作成rdspg_owner;
--- rdspgスキーマの権限をrdspg_role_readwriteロールとrdspg_role_readonlyロールに付与します。
SCHEMA rdspgからrdspg_role_readwriteへのGRANT USAGE;
SCHEMA rdspgからrdspg_role_readonlyへの穀物の使用;
説明
rdspg_readwriteユーザーとrdspg_readonlyユーザーは、関連するロールの権限に対する変更を継承します。 rdspg_readwriteユーザーまたはrdspg_readonlyユーザーに権限を付与する必要はありません。
シナリオ
シナリオ1: rdspg_ownerを使用して、rdspgスキーマのテーブルに対してDDL CREATE、DROP、およびALTER操作を実行します
CREATE TABLE rdspg.test(id bigserial primary key, name text);
CREATE INDEX idx_test_name on rdspg.test(name);
シナリオ2: ビジネス開発にrdspg_readwriteユーザーまたはrdspg_readonlyユーザーを使用する
ビジネス管理に使用するユーザーは、最小特権 (PoLP) の原則に従います。 ビジネス管理には、rdspg_readonlyユーザーを使用することを推奨します。 rdspg_readwriteユーザーは、DML操作を実行する必要がある場合にのみ使用します。 PoLPは、ビジネス層での読み書き分割を容易にします。
説明
- ビジネス層での読み取り /書き込み分割は、プロキシミドルウェアによって実行される自動読み取り /書き込み分割によって引き起こされる追加のコストとパフォーマンスの損失を減らすのに役立ちます。
- RDSインスタンスに読み取り専用RDSインスタンスがアタッチされていない場合は、一方のクライアントに読み取り権限を付与し、もう一方のクライアントに読み取り権限と書き込み権限を付与することを推奨します。 この設定は、読み取り専用RDSインスタンスを作成するためのものです。 また、PoLPに従って、読み取り権限を付与したクライアントに対してrdspg_readonlyユーザーを使用することをお勧めします。
- 読み取り権限を付与したクライアントのrdspg_readonlyユーザーを使用し、Java Database Connectivity (JDBC) URLを
読み取り専用RDSインスタンス1のエンドポイント、読み取り専用RDSインスタンス2のエンドポイント、RDSインスタンスのエンドポイント
に設定します。 - 読み取りおよび書き込み権限を付与したクライアントにrdspg_readwriteユーザーを使用し、JDBC URLを
RDSインスタンスのエンドポイント
に設定します。
- rdspg_readwriteユーザーを使用して、rdspgスキーマ内のテーブルに対してDQL SELECT操作とDML UPDATE、INSERT、およびDELETE操作を実行します。
INSERT INTO rdspg.test (name) VALUES('name0') 、('name1');
SELECT id,name FROM rdspg.test LIMIT 1;
--- rdspg_readwriteユーザーには、DDL CREATE、DROP、およびALTER操作を実行する権限がありません。
CREATE TABLE rdspg.test2(id int);
ERROR: スキーマrdspgに対する権限拒否
LINE 1: テーブルrdspg.test2(id int) を作成します。DROP TABLE rdspg.test;
エラー: テーブルテストの所有者である必要があります
ALTER TABLE rdspg.test ADD id2 int;
エラー: テーブルテストの所有者である必要があります
CREATE INDEX idx_test_name on rdspg.test(name);
エラー: テーブルテスト
の所有者である必要があります - rdspg_readonlyユーザーを使用して、rdspgスキーマ内のテーブルに対してDQL SELECT操作を実行します。
INSERT INTO rdspg.test (name) VALUES('name0') 、('name1');
エラー: テーブルテストの許可が拒否されました
SELECT id,name FROM rdspg.test LIMIT 1;
id | name
---- -------
1 | name0
(1行)
シナリオ3: プロジェクトの権限を別のプロジェクトに付与
従業員プロジェクトに属するemployee_readwriteユーザーに、rdspgプロジェクトのテーブルに対する読み取り権限を付与できます。 RDSインスタンスのdbsuperuserという名前の特権アカウントを使用して、データベース管理者として次の操作を実行します。
--- rdspg_role_readonlyロールの権限をemployee_readwriteユーザーに付与します。
GRANT rdspg_role_readonlyからemployee_readwriteへ。
シナリオ4: rdspg_2という名前のスキーマを作成し、rdspg_2スキーマに対する権限をロールに付与する
rdspg_readwriteユーザー、rdspg_readonlyユーザー、およびemployee_readwriteユーザーは、関連するロールの権限に対する変更を継承します。 rdspg_readwriteユーザー、rdspg_readonlyユーザー、またはemployee_readwriteユーザーに権限を付与する必要はありません。 RDSインスタンスのdbsuperuserという名前の特権アカウントを使用して、データベース管理者として次の操作を実行します。
CREATE SCHEMA rdspg_1 AUTHORIZATION rdspg_owner;
--- rdspg_2スキーマのアクセス権限をロールに付与します。
--- rdspg_1スキーマのテーブルに対してDDL CREATE、DROP、およびALTER操作を実行する権限を付与します。
SCHEMA rdspg_1からrdspg_role_readwriteへの穀物の使用。SCHEMA rdspg_1からrdspg_role_readonlyへの穀物の使用;
権限の照会
このトピックで説明する管理モデルを使用する場合は、次のいずれかの方法を使用して、RDSインスタンスのユーザーの権限を照会します。