Azure HorizonDB へのアクセスの管理は、セキュリティとコンプライアンスを維持する上で重要な部分です。 この記事では、PostgreSQL ロールと Azure 機能を使用してアクセス許可を制御し、アクセス管理のベスト プラクティスを実装する方法について説明します。
ロール管理
Azure HorizonDB データベースのアクセス許可を大規模に管理する最適な方法は、ロールの概念を使用することです。 ロールには、データベース ユーザーまたはデータベース ユーザーのグループを指定できます。 ロールは、データベース オブジェクトを所有し、それらのオブジェクトに対する権限を他のロールに割り当てて、どのオブジェクトにアクセスできるかを制御できます。 ロールのメンバーシップを別のロールに付与できます。これにより、メンバー ロールは別のロールに割り当てられた特権を使用できます。 HorizonDB Azure、データベース ユーザーに直接アクセス許可を付与できます。 適切なセキュリティ プラクティスとして、最小限のアプリケーションとアクセスの要件に基づいて、特定のアクセス許可セットを持つロールを作成します。 各ユーザーに適切なロールを割り当てます。 ロールを使用して、データベース オブジェクトにアクセスするための 最小特権モデル を適用します。
PostgreSQL によって作成される組み込みロールに加えて、Azure HorizonDB クラスターには 3 つの既定のロールが含まれています。 これらのロールは、次のコマンドを実行して確認できます。
SELECT rolname FROM pg_roles;
ロールは次のとおりです。
azure_pg_adminazuresuadministrator role
Azure HorizonDB クラスターを作成するときに、administrator roleの資格情報を指定します。 この administrator role を使用して、より多くの PostgreSQL ロールを作成します。
たとえば、 exampleuserという名前のユーザーまたはロールを作成できます。
CREATE USER exampleuser PASSWORD password123;
アプリケーションには 管理者ロール を使用しないでください。
クラウドベースの PaaS 環境では、Azure HorizonDB スーパーユーザー アカウントへのアクセスは、コントロール プレーン操作のみに制限されます。
azuresu ロールにはスーパーユーザー特権がありますが、Azure HorizonDB クラスター管理者アカウントは、azuresu ロールの一部ではありません。
azure_pg_adminロールは、擬似スーパーユーザー アカウントとして存在します。 クラスターの作成時に構成した管理者ログインは、 azure_pg_admin ロールのメンバーです。
クラスター内のロールの一覧を定期的に監査できます。
たとえば、 psql クライアントを使用して接続し、 pg_roles テーブルに対してクエリを実行できます。このテーブルには、他のロールの作成、データベースの作成、レプリケーションなどの特権と共にすべてのロールが一覧表示されます。
select * from pg_roles where rolname='demouser';
-[ RECORD 1 ]--+---------
rolname | demouser
rolsuper | f
rolinherit | t
rolcreaterole | f
rolcreatedb | f
rolcanlogin | f
rolreplication | f
rolconnlimit | -1
rolpassword | ********
rolvaliduntil |
rolbypassrls | f
rolconfig |
oid | 24827
Important
HorizonDB Azure使用すると、CAST コマンドを作成できます。
CREATE CAST ステートメントを実行するには、ユーザーが azure_pg_admin ロールのメンバーである必要があります。 現時点では、作成後に CAST を削除することはできません。
Azure HorizonDB では、WITH FUNCTION オプションと WITH INOUT オプションを使用する CAST コマンドのみがサポートされます。
WITHOUT FUNCTION オプションはサポートされていません。
スキーマ アクセスの制御
Azure HorizonDB で新しく作成されたデータベースには、すべてのデータベース ユーザーとロールにオブジェクトを作成する権限を付与する既定の権限セットがデータベースのパブリック スキーマに含まれています。 Azure HorizonDB インスタンスで作成したデータベースへのアプリケーション ユーザー アクセスをより適切に制限するには、これらの既定のパブリック特権を取り消す必要があります。 これらの権限を取り消した後、より詳細にデータベース ユーザーに特定の権限を付与します。 例えば次が挙げられます。
アプリケーション データベース ユーザーがパブリック スキーマ内にオブジェクトを作成できないようにするために、
publicロールからpublicスキーマに対する作成特権を取り消します。REVOKE CREATE ON SCHEMA public FROM PUBLIC;新しいデータベースを作成します。
CREATE DATABASE Test_db;この新しいデータベースの PUBLIC スキーマからすべての特権を取り消します。
REVOKE ALL ON DATABASE Test_db FROM PUBLIC;アプリケーション データベース ユーザーのカスタム ロールを作成します。
CREATE ROLE Test_db_user;このロールを持つデータベース ユーザーに、データベースに接続する機能を付与します。
GRANT CONNECT ON DATABASE Test_db TO Test_db_user; GRANT ALL PRIVILEGES ON DATABASE Test_db TO Test_db_user;データベース ユーザーを作成します。
CREATE USER user1 PASSWORD 'Password_to_change'接続と選択の権限を持つロールをユーザーに割り当てます。
GRANT Test_db_user TO user1;
この例では、ユーザー user1 は接続でき、テスト データベース Test_db内のすべての特権を持ちますが、クラスター上の他のデータベースは持っていません。 このユーザーまたはロールに、そのデータベースとそのオブジェクトに対する ALL PRIVILEGES を付与するのではなく、 SELECT、 INSERT、 EXECUTEなどのより選択的なアクセス許可を提供することを検討してください。 PostgreSQL データベースの特権の詳細については、PostgreSQL ドキュメントの GRANT コマンドと REVOKE コマンドを参照してください。
HorizonDB でのパブリック スキーマの所有権の変更Azure
HorizonDB Azureでは、パブリック スキーマは、サポートされているすべての PostgreSQL バージョンにわたって azure_pg_admin ロールによって所有されます。
azure_pg_adminの制御の強化
Azure HorizonDB では、azure_pg_admin ロールはシステム管理の制限付きロールであり、変更することはできません。 別のロールを付与するなどして変更しようとすると、次のようなエラーが表示されます。
GRANT <db_user> TO azure_pg_admin;
ERROR: permission denied to alter restricted role "azure_pg_admin"
この制限は、重要な管理ロールの変更を防ぐための組み込みのセーフガードです。 特権またはロールを割り当てる必要がある場合は、代わりにカスタム ロールを作成し、そのロールに必要なアクセス許可を付与することを検討してください。
Azure HorizonDB は、すべての PostgreSQL バージョンでazure_pg_admin ロールの機能を強化します。
azure_pg_admin ロールのメンバーは、ロールがazure_pg_adminのメンバーでもある場合でも、ロールを管理したり、非制限ロールが所有するオブジェクトにアクセスしたりできます。 この機能により、管理ユーザーはロールとアクセス許可の管理に対して一貫した包括的な制御を維持し、スーパーユーザーアクセスを必要とせずにシームレスで信頼性の高いエクスペリエンスを提供します。
Important
Azure HorizonDB では、pg_write_all_data属性をユーザーに付与することはできません。これにより、ユーザーはすべてのデータ (テーブル、ビュー、シーケンス) を、それらのオブジェクトに対するINSERT、UPDATE、およびDELETE権限を持つかのように書き込み、明示的に付与しなくてもすべてのスキーマに対する USAGE 権限を持つことができるようになります。 回避策として、データベースとオブジェクトごとにより詳細なレベルで同様のアクセス許可を付与することをお勧めします。
行レベルのセキュリティ
Row-level security (RLS) は、データベース管理者が 1 つ以上のロールに対して特定のデータ行の表示方法と動作方法を制御するポリシーを定義できるようにする、Azure HorizonDB セキュリティ機能です。 行レベルのセキュリティにより、Azure HorizonDB データベース テーブルに追加のフィルターが追加されます。 ユーザーがテーブルに対してアクションを実行しようとすると、クエリ条件またはその他のフィルター処理の前にこのフィルターが適用され、セキュリティ ポリシーに従ってデータが絞り込まれるか拒否されます。
SELECT、INSERT、UPDATE、DELETEなどの特定のコマンドに対して行レベルのセキュリティ ポリシーを作成したり、すべてのコマンドに対して指定したりできます。 行レベルのセキュリティのユース ケースには、PCI 準拠の実装、分類された環境、共有ホスティングまたはマルチテナント アプリケーションなどがあります。
テーブルに行セキュリティ権限を適用できるのは、 SET ROW SECURITY 権限を持つユーザーだけです。 テーブル所有者は、テーブルの行セキュリティを設定できます。
OVERRIDE ROW SECURITYと同様に、この権限は現在暗黙的な権限です。 行レベルのセキュリティは、既存の GRANT のアクセス許可をオーバーライドしません。 より細かいレベルの制御が追加されます。 たとえば、特定のユーザーが行へのアクセスを許可するように ROW SECURITY FOR SELECT 設定すると、対象の列またはテーブルに対する SELECT 権限もユーザーに付与されます。
次の例は、カスタムで作成された マネージャーロール のメンバーのみが特定のアカウントの行にのみアクセスできるようにするポリシーを作成する方法を示しています。 次の例のコードは、 PostgreSQL ドキュメントで共有されています。
CREATE TABLE accounts (manager text, company text, contact_email text);
ALTER TABLE accounts ENABLE ROW LEVEL SECURITY;
CREATE POLICY account_managers ON accounts TO managers
USING (manager = current_user);
USING句は暗黙的にWITH CHECK句を追加し、マネージャー ロールのメンバーが他のマネージャーに属する行に対してSELECT、DELETE、またはUPDATE操作を実行できないこと、および別のマネージャーに属する新しい行をINSERTできないことを保証します。
次の例に示すように、 DROP POLICY コマンドを使用して行セキュリティ ポリシーを削除できます。
DROP POLICY account_managers ON accounts;
ポリシーを削除しても、ロール マネージャーは他のマネージャーに属しているデータを表示できません。 この制限は、アカウント テーブルで行レベルのセキュリティ ポリシーが引き続き有効になっているためです。 行レベルのセキュリティが既定で有効になっている場合、PostgreSQL では既定の拒否ポリシーが使用されます。
次の例に示すように、行レベルのセキュリティを無効にすることができます。
ALTER TABLE accounts DISABLE ROW LEVEL SECURITY;
行レベルのセキュリティをバイパスする
PostgreSQL には、ロールに割り当てることができる BYPASSRLS と NOBYPASSRLS のアクセス許可が含まれています。 既定では、 NOBYPASSRLS アクセス許可が割り当てられます。
Azure HorizonDB では、バイパス行レベルのセキュリティ特権 (BYPASSRLS) は次のように機能します。
azure_pg_admin管理者ロールによって作成された管理者以外のユーザーは、必要に応じて、BYPASSRLS属性または特権を持つロールを作成できます。azure_pg_adminユーザーを使用して、BYPASSRLS特権を必要とする管理タスクを実行します。
関連するコンテンツ
Azure HorizonDB (プレビュー)