このチュートリアルでは、AlloyDB for PostgreSQL でパラメータ化されたセキュアビューを使用して、データベース テーブルへのユーザー アクセスを制限する方法について説明します。このチュートリアルでは、パラメータ化されたセキュアビューを設定し、ベーステーブルへのアクセスを制限するようにデータベース ロールと権限を構成して、データ セキュリティを確認します。パラメータ化された セキュアビューは、自然言語クエリ を使用して生成されたQueryData APIを使用するアプリケーションの保護に役立ちます。
パラメータ化されたセキュアビューの機能を示す例が含まれています。これらの例はデモを目的としています。
パラメータ化されたセキュアビューとは
一般的な効果的な手法として、アプリケーションは、データベースへのアクセスに必要な最小限の権限を持つサービス アカウントを使用して実行する必要があります。たとえば、アプリケーションがデータベースに書き込まない場合は、読み取り専用アクセス権を持つロールを使用する必要があります。これらのアクセス制御はデータベース レベルで構成する必要があります。
ただし、アプリケーションで標準のデータベース レベルのアクセス許可よりもきめ細かいセキュリティ制御が必要になる場合があります。パラメータ化されたセキュアビューは、SQL ビューを使用してアプリケーション データ セキュリティと行レベルのアクセス制御を提供します。これにより、アプリケーション ユーザーは、アクセス権のあるデータのみを表示できます。
パラメータ化されたセキュアビューは、エンドユーザー ID でビューをパラメータ化することで、アドホックまたは LLM 生成の自然言語クエリを処理する際のセキュリティ リスクを軽減します。これにより、クエリの言い回しに関係なく、ユーザーは承認されたデータにのみアクセスできます。このアプローチでは、1 つのデータベース ロールですべてのアプリケーション ユーザーに安全に対応できるため、ユーザー管理も簡素化されます。行レベルのセキュリティを適用するために、個々のユーザーに個別のデータベース ロールを作成する必要はありません。
目標
- 名前付きビュー パラメータを使用して、セキュアなパラメータ化されたビューを作成します。
- アプリケーションがデータベースに接続し、パラメータ化されたセキュアビューにアクセスするために使用するデータベースロールを作成します。
- 新しいロールにセキュアビューに対する権限を付与し、ベーステーブルへのアクセス権を取り消します。
- 新しいロールを使用して接続し、制限付きテーブルにアクセスできないことを確認します。
execute_parameterized_query関数または QueryData API を使用して、パラメータ化されたセキュアビューに対してクエリを実行します。
費用
このドキュメントでは、課金対象である次のコンポーネントを使用します Google Cloud。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを算出できます。
新規の Google Cloud ユーザーの方は、無料トライアルをご利用いただける場合があります。
継続的な課金を避けるため、このドキュメントのタスクが完了したら、作成したリソースを削除してください。詳細については、クリーンアップをご覧ください。
始める前に
コンテキスト セットを作成する前に、次の前提条件を満たす必要があります。
課金と必要な API を有効にする
Google Cloud コンソールでプロジェクトを選択します。
AlloyDB for PostgreSQL の作成と接続に必要な Cloud APIs を有効にします。
- [プロジェクトを確認] の手順で、[次へ] をクリックして、変更するプロジェクトの名前を確認します。
[API を有効にする] の手順で、[有効にする] をクリックして、次の機能を有効にします。
- AlloyDB for PostgreSQL API
- Dataplex Universal Catalog API
データベースを作成して接続する
環境を準備する
パラメータ化されたセキュアビューでクエリを実行する準備をするには、データベース、データベース ロール、parameterized_view 拡張機能、アプリケーション スキーマを設定します。
必要な拡張機能を有効にする
必要な拡張機能ライブラリを読み込むparameterized_views.enabled データベース
フラグを有効にします。詳細については、
インスタンスのデータベース フラグを構成するをご覧ください。
データベースを設定する
- アプリケーション データとパラメータ化されたビュー用に
databaseというデータベースを作成します。詳細については、データベースを作成するをご覧ください。
データベース ロール、拡張機能、アプリケーション スキーマを作成する
コンソールで、AlloyDB の [ページ] に移動します。 Google Cloud
リストからクラスタを選択します。
ナビゲーション メニューで [AlloyDB Studio] をクリックします。
postgres 認証を使用して Studio にログインします。
[認証] をクリックします。[エクスプローラ] ペインに、データベースにあるオブジェクトのリストが表示されます。
[新しい SQL エディタタブ] または [新しいタブ] をクリックして、新しいタブを開きます。
データベースに
parameterized_views拡張機能を作成します。-- Requires parameterized_views.enabled set to true CREATE EXTENSION parameterized_views;拡張機能が作成されると、
parameterized_viewsという名前のスキーマも作成されます。これにより、API がそのスキーマの名前空間に含まれ、API が既存の API と競合しないようになります。組み込みの postgres ユーザーなど、スーパーユーザー権限を持つユーザーとしてログインします。新しいスーパーユーザー(
admin_userなど)を作成する場合は、次のコマンドを実行します。CREATE ROLE admin_user WITH LOGIN PASSWORD '...'; GRANT ALL PRIVILEGES ON DATABASE database TO admin_user;詳細については、
CREATE USERをご覧ください。パラメータ化されたセキュアビューに対してクエリを実行する新しいデータベース ロールを作成します。これは、アプリケーションがデータベースに接続してログインし、公開関数またはオブジェクトへのアクセスを最小限に制限してクエリを実行するために使用する AlloyDB ロールです。
CREATE ROLE psv_user WITH LOGIN PASSWORD '...';詳細については、
CREATE USERをご覧ください。管理者権限を持つユーザーとして接続します。
SET role TO admin_user;テーブルを含むスキーマを作成します。
CREATE SCHEMA schema;テーブルを作成してデータを挿入します。
CREATE TABLE store.checked_items(bag_id INT,timestamp TIMESTAMP, loc_code CHAR(3), scan_type CHAR(1), location TEXT, customer_id INT); INSERT INTO store.checked_items (bag_id, timestamp, loc_code, scan_type, location, customer_id) VALUES (101, '2023-10-26 10:00:00', 'ABC', 'I', 'Warehouse A', 123), (102, '2023-10-26 10:15:30', 'DEF', 'O', 'Loading Dock B', 456), (103, '2023-10-26 10:30:45', 'GHI', 'I', 'Conveyor Belt 1', 789), (104, '2023-10-26 11:00:00', 'JKL', 'O', 'Shipping Area C', 101), (105, '2023-10-26 11:45:15', 'MNO', 'I', 'Sorting Station D', 202), (106, '2023-10-26 12:00:00', 'PQR', 'O', 'Truck Bay E', 303);
セキュアなパラメータ化されたビューを作成し、アクセス権限を設定する
セキュアなパラメータ化ビューを作成し、ベーステーブルとビューに適切なアクセス権を設定するには、次の操作を行います。
コンソールで、AlloyDB の [ページ] に移動します。 Google Cloud
リストからクラスタを選択します。
ナビゲーション メニューで [AlloyDB Studio] をクリックします。
Studio にログインし、
admin_userとしてdatabaseに接続します。[認証] をクリックします。[エクスプローラ] ペインに、データベースにあるオブジェクトのリストが表示されます。
[新しい SQL エディタタブ] または [新しいタブ] をクリックして、新しいタブを開きます。
ビューへのアクセスを制限するには、パラメータ化されたセキュアビューを作成します。
CREATE VIEW store.secure_checked_items WITH (security_barrier) AS SELECT bag_id, timestamp, location FROM store.checked_items t WHERE customer_id = $@app_end_userid;ビューへのアクセス権を付与します。
GRANT SELECT ON store.secure_checked_items TO psv_user;ビューにアクセスするには、スキーマへのアクセス権を付与します。
GRANT USAGE ON SCHEMA store TO psv_user;ベーステーブルへの直接アクセスを取り消します。
REVOKE ALL PRIVILEGES ON store.checked_items FROM psv_user;admin_user管理者としてログインし、IAM 認証されたユーザーにpsv_userロールを付与します。GRANT psv_user TO "IAM_USER_EMAIL";IAM_USER_EMAILは、IAM ユーザーのメールアドレスに置き換えます。
データ セキュリティを確認する
パラメータ化されたセキュアビューが指定されたビューへのアクセスを制限していることを確認するには、IAM 認証されたユーザーとしてデータベースにログインします。AlloyDB では、IAM ユーザーは割り当てられたデータベース ロールの権限を継承します。
IAM 認証されたユーザーとしてデータベースにログインします。
ベーステーブルにアクセスできないことを確認します。
SELECT * FROM store.checked_items; ERROR: permission denied for table checked_itemsexecute_parameterized_query関数を使用して、パラメータ化されたセキュアビューにアクセスします。SELECT * FROM parameterized_views.execute_parameterized_query( query => 'SELECT * from store.secure_checked_items', param_names => ARRAY ['app_end_userid'], param_values => ARRAY ['303'] );SQL 構文と PSV パラメータを使用した
QueryDataリクエストを使用して、パラメータ化されたセキュアビューをクエリします。
curl -X POST \
"https://geminidataanalytics.googleapis.com/v1beta/projects/PROJECT_ID/locations/REGION:queryData" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d '{
"prompt": "Show me the checked items.",
"context": {
"datasource_references": {
"alloydb": {
"database_reference": {
"project_id": "PROJECT_ID",
"region": "REGION",
"cluster_id": "CLUSTER_ID",
"instance_id": "INSTANCE_ID",
"database_id": "DATABASE_ID"
}
}
},
"parameterized_secure_view_parameters": {
"parameters": {
"app_end_userid": "303"
}
}
},
"generation_options": {
"generate_query_result": true,
"generate_natural_language_answer": true,
"generate_explanation": true
}
}'次の値を置き換えます。
PROJECT_ID: 実際の Google Cloud プロジェクト ID。REGION: AlloyDB for PostgreSQL インスタンスが配置されているリージョン。CLUSTER_ID: AlloyDB for PostgreSQL クラスタの ID。INSTANCE_ID: AlloyDB for PostgreSQL インスタンスの ID。DATABASE_ID: AlloyDB for PostgreSQL データベースの ID。
クリーンアップ
クラスタの削除
始める前にセクションで作成したクラスタを削除すると、作成したすべてのオブジェクトも削除されます。
コンソールで、AlloyDB の [ページ] に移動します。 Google Cloud
リストからクラスタを選択します。
[クラスタを削除] をクリックします。
[クラスタを削除] でクラスタの名前を入力して、クラスタの削除を確認します。
次のステップ
- パラメータ化されたセキュアビューについて学習する。
- パラメータ化されたセキュアビューを使用してアプリケーション データ セキュリティを管理する方法を学習する。