

# Babelfish for Aurora PostgreSQL でのアクセス許可とアクセスコントロールの管理
<a name="babelfish-permissions"></a>

 Babelfish for Aurora PostgreSQL では、データベース、スキーマ、オブジェクトのアクセス許可とアクセスコントロールを管理できます。次の表は、さまざまなアクセスコントロールのシナリオを達成するために、Babelfish でアクセス許可を付与するための特定の SQL コマンドの概要を示しています。サポートされている実装可能なユースケースと、現在サポートされていないケースの回避策について説明します。これにより、Babelfish データベースを使用する際のセキュリティおよびコンプライアンス要件を満たす適切なアクセス許可を設定できます。

## 対応するユースケース
<a name="babelfish-permissions-supported"></a>

 次の表は、Babelfish でサポートされているユースケースを示しています。各ユースケースについて、達成するために必要なアクションとサンプル SQL コマンドがテーブルに表示されています。


|  ユースケース  |  Action  |  SQL コマンド  |  コメント  |  Babelfish バージョンの互換性  | 
| --- | --- | --- | --- | --- | 
|   ログインして任意のデータベースで SELECT/DML/DDL を実行できるようにする   |   sysadmin サーバーロールにログインを追加する   |   ALTER SERVER ROLE sysadmin ADD MEMBER `login`   |   なし   |   すべてのバージョン   | 
|   ログインしてデータベースで SELECT/DML/DDL を実行できるようにする   |   ログインをデータベースの所有者にする   |   ALTER AUTHORIZATION ON DATABASE::`database` TO `login`   |   データベースの所有者は 1 人だけです。  |   バージョン 3.4 以降   | 
|   データベースユーザーにスキーマでの SELECT/DML の実行を許可する   |   スキーマのデータベースユーザーにアクセス許可を付与する   |   GRANT SELECT/EXECUTE/INSERT/UPDATE/DELETE ON SCHEMA::`schema` TO `user`   |   なし   |   バージョン 3.6 以降、4.2 以降   | 
|   データベースユーザーにスキーマでの SELECT/DML の実行を許可する   |   スキーマ作成時にデータベースユーザーをスキーマの所有者にする   |   CREATE SCHEMA `schema` AUTHORIZATION `user`   |   作成後のスキーマ所有者の変更は現在サポートされていません。  |   バージョン 1.2 以降   | 
|   データベースユーザーにオブジェクトに対する SELECT/DML の実行を許可する   |   オブジェクトのデータベースユーザーにアクセス許可を付与する   |   GRANT SELECT/EXECUTE/INSERT/UPDATE/DELETE ON OBJECT::`object` TO `user`   |   なし   |   すべてのバージョン   | 
|   データベースユーザーに、データベースの削除を含む、データベース内での SELECT/DML/DDL の実行を許可する   |   db\$1owner 固定データベースロールにユーザーを追加する   |   ALTER ROLE db\$1owner ADD MEMBER `user`   |   db\$1owner 固定データベースロールを追加できるのはユーザーのみです。db\$1owner ロールへのロールの追加はまだサポートされていません。  |   バージョン 4.5 以降、5.1 以降   | 
|   ユーザーまたはカスタムデータベースロールのメンバーに、データベース内の SELECT のみの実行を許可する   |   ユーザーまたはロールを db\$1datareader 固定データベースロールに追加する   |   ALTER ROLE db\$1datareader ADD MEMBER `user` / `role`   |   なし   |   バージョン 4.5 以降、5.1 以降   | 
|   ユーザーまたはカスタムデータベースロールのメンバーに、データベース内の DML のみの実行を許可する   |   ユーザーまたはロールを db\$1datawriter 固定データベースロールに追加する   |   ALTER ROLE db\$1datawriter ADD MEMBER `user` / `role`   |   なし   |   バージョン 4.5 以降、5.1 以降   | 
|   ユーザーまたはカスタムデータベースロールのメンバーに、データベース内の DDL のみの実行を許可する   |   db\$1accessadmin 固定データベースロールにユーザーまたはロールを追加する   |   ALTER ROLE db\$1accessadmin ADD MEMBER `user` / `role`   |   なし   |   バージョン 4.5 以降、5.1 以降   | 
|   ユーザーまたはカスタムデータベースロールのメンバーに、カスタムロールの CREATE/ALTER/DROP、データベース内のオブジェクトに対するアクセス許可の GRANT/REVOKE、データベース内の CREATE SCHEMA のみを許可します。  |   ユーザーまたはロールを db\$1securityadmin 固定データベースロールに追加   |   ALTER ROLE db\$1securityadmin ADD MEMBER `user` / `role`   |   なし   |   バージョン 4.5 以降、5.1 以降   | 
|   ユーザーまたはカスタムデータベースロールのメンバーに、任意のユーザーの CREATE/ALTER/DROP、データベースアクセスの許可と取り消し、ユーザーアカウントのログインへのマッピング、データベース内の CREATE SCHEMA のみを許可します。  |   db\$1accessadmin 固定データベースロールにユーザーまたはロールを追加する   |   ALTER ROLE db\$1accessadmin ADD MEMBER `user` / `role`   |   なし   |   バージョン 4.5 以降、5.1 以降   | 
|   ログインに任意のデータベースの CREATE/DROP/ALTER のみを許可する   |   dbcreator 固定サーバーロールにログインを追加する   |   ALTER SERVER ROLE dbcreator ADD MEMBER `login`   |   dbcreator ログインがアクセスできるデータベースのみを変更できます。  |   バージョン 4.5 以降、5.1 以降   | 
|   ログインに任意のログインの CREATE/ALTER/DROP のみを許可する   |   securityadmin 固定サーバーロールにログインを追加する   |   ALTER SERVER ROLE securityadmin ADD MEMBER `login`   |   なし   |   バージョン 4.5 以降、5.1 以降   | 

## サポートされていないユースケースと回避策
<a name="babelfish-permissions-unsupported"></a>

 次の表は、Babelfish ではサポートされていないものの、回避策を使用して達成できるユースケースを示しています。


|  ユースケース  |  Action  |  SQL コマンド  |  コメント  |  回避策のための Babelfish バージョンの互換性  | 
| --- | --- | --- | --- | --- | 
|   ユーザーにオブジェクト/スキーマに対する SELECT/DML の実行と、これらのアクセス許可を他のユーザーに "付与" するオプションを許可する   |   他のすべてのユーザーにアクセス許可を直接 "付与" する   |   GRANT SELECT/EXECUTE/INSERT/UPDATE/DELETE ON OBJECT/SCHEMA::`object`/`schema` TO `user`   |   GRANT ... WITH GRANT OPTION は現在サポートされていません。  |   バージョン 3.6 以降、4.2 以降   | 
|   データベースユーザーに、データベースの削除を含む、データベース内での SELECT/DML/DDL の実行を許可する   |   db\$1owner 固定データベースロールにロールのメンバーを追加する   |   ALTER ROLE db\$1owner ADD MEMBER `user`   |   db\$1owner ロールへのロールの追加は現在サポートされていません。  |   バージョン 4.5 以降、5.1 以降   | 

## サポートされていないユースケース
<a name="babelfish-permissions-unsupported"></a>

 次の表は、Babelfish でサポートされていないユースケースを示しています。


|  ユースケース  |  コメント  | 
| --- | --- | 
|  ユーザーまたはカスタムデータベースロールのメンバーに、データベース内の SELECT の実行を拒否する   |   db\$1denydatareader 固定データベースロールはまだサポートされていません   | 
|  ユーザーまたはカスタムデータベースロールのメンバーに、データベース内の DML の実行を拒否する   |   db\$1denydatawriter 固定データベースロールは現在サポートされていません。  | 
|  任意のデータベース接続の KILL のみへのログインを許可する   |   processadmin 固定サーバーロールは現在サポートされていません。  | 
|  リンクされたサーバーのみを追加または削除するためのログインを許可する   |   setupadmin 固定サーバーロールは現在サポートされていません。  | 

# アップグレード後のオブジェクトの所有権の違いに対処する
<a name="babelfish-ownership-differences"></a>

Babelfish バージョン 4.6 以降、および 5.2 以降には、TDS エンドポイントを介したオブジェクト所有権処理の変更が含まれています。TDS エンドポイントを使用して新しいオブジェクトを作成すると、これらのオブジェクトは現在のユーザーではなくスキーマ所有者によって所有されるようになりました。この所有権の変更は、4.6 または 5.2 より前のバージョンからアップグレードするときに、既存のオブジェクトと比較して新しいオブジェクトのアクセス許可の動作に影響する可能性があります。

これらの所有権の違いを解決するために、Babelfish は `sys.generate_alter_ownership_statements()` 関数を提供します。この関数は、オブジェクトの所有権とスキーマの所有権を一致させる SQL ステートメントを生成します。

オブジェクトの所有権に対処するときは、次の制限に注意してください。
+ PostgreSQL エンドポイントを介して付与された CREATE アクセス許可を持つユーザーは、それらのスキーマの TDS エンドポイントを介してオブジェクトを作成できません。
+ PostgreSQL エンドポイントを介して T-SQL オブジェクトのアクセス許可を変更することは推奨されず、T-SQL が正しく動作しなくなる可能性があります。
+ アクセス許可は、所有権の不一致により、古いオブジェクトと新しいオブジェクトで異なる場合があります。例えば、`sch_own` が所有するスキーマで、`dbo` が所有するオブジェクトが含まれている場合を考えてみます。この場合、アップグレード前に作成され、`dbo` が所有していたオブジェクトは、アップグレード後に作成され、`sch_own` が所有するオブジェクトと比較して異なるアクセス許可を持つ可能性があります。これは、SELECT や INSERT などの操作に影響する可能性があります。

DB クラスターに 4.6 または 5.2 より前のバージョンの Babelfish で作成されたオブジェクトが含まれている場合は、その所有権を調整することを検討してください。

**オブジェクトの所有権の違いに対処するには**

1. PostgreSQL エンドポイントを使用して DB クラスターの `babelfish_db` データベースに接続します。

1. 次のコマンドを実行します。

   ```
   SELECT * from sys.generate_alter_ownership_statements();
   ```

   これにより、オブジェクト間の所有権を標準化するための SQL ステートメントのリストが生成されます。

1. 生成されたステートメントを最初にテスト環境で実行し、実稼働環境に適用する前にその効果を検証します。

データベース全体で一貫したオブジェクト所有権モデルを実現するには、これらのステートメントを実行することをお勧めします。