パラメータ化されたセキュアビューは、アプリケーションにデータ セキュリティと行アクセス制御を提供します。アプリケーション ユーザーの ID に基づいてクエリ結果をフィルタします。
このチュートリアルでは、Cloud SQL でパラメータ化されたセキュアビューを設定し、データベースのロールと権限を構成してベーステーブルへのアクセスを制限し、データ セキュリティを検証する方法について説明します。このドキュメントの例はデモ専用です。
パラメータ化されたセキュアビューとは
一般的なベスト プラクティスとして、アプリケーションは、データベースへのアクセスに必要な最小限の権限を持つサービス アカウントを使用して実行する必要があります。たとえば、アプリケーションがデータベースに書き込む必要がない場合は、読み取り専用アクセス権を持つロールを使用する必要があります。これらのアクセス制御は、データベース レベルで構成する必要があります。
アプリケーションで標準のデータベース レベルのアクセス許可よりもきめ細かいセキュリティが必要な場合は、パラメータ化されたセキュアビューを使用して、ユーザーが承認されたデータのみを表示できるようにします。パラメータ化されたセキュアビューは、マルチテナント SaaS アプリケーションに適した動的なデータ セキュリティと行アクセス制御を提供します。アプリケーションのエンドユーザーごとに個別のデータベース ロールは必要ありません。
パラメータ化されたセキュアビューを使用すると、主に次の 3 つのメリットがあります。
- 動的なデータ セキュリティと行アクセス制御: エンドユーザー識別子を使用してクエリをフィルタリングし、クエリのフレーズに関係なく、ユーザーが承認されたデータにのみアクセスできるようにします。
- ロール管理の簡素化: 各個人に個別のデータベース ロールを管理するのではなく、すべてのアプリケーション ユーザーに単一の共有データベース ロールを使用します。
目標
- 名前付きビュー パラメータを使用して、パラメータ化されたセキュアビューを作成します。
- アプリケーションがデータベースに接続し、パラメータ化されたセキュアビューにアクセスするために使用するデータベースロールを作成します。
- 新しいロールにパラメータ化されたセキュアビューに対する権限を付与し、ベーステーブルへのアクセス権を取り消します。
- 新しいロールを使用して接続し、制限付きテーブルにアクセスできないことを確認します。
execute_parameterized_query()関数または QueryData API を使用して、パラメータ化されたセキュアビューに対してクエリを実行します。
費用
このドキュメントでは、課金対象である次の Google Cloudコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを算出できます。
新規の Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。
このドキュメントのタスクを完了したら、作成したリソースを削除して、それ以上の請求が発生しないようにします。詳細については、クリーンアップをご覧ください。
始める前に
パラメータ化されたセキュアビューを作成する前に、次の前提条件を満たしてください。
課金と必要な API を有効にする
Google Cloud コンソールでプロジェクトを選択します。
Cloud SQL の作成と接続に必要な Cloud APIs を有効にします。
[プロジェクトを確認] の手順で、[次へ] をクリックして、変更するプロジェクトの名前を確認します。
[API を有効にする] の手順で、[有効にする] をクリックして、次の機能を有効にします。
- Cloud SQL for PostgreSQL API
- Knowledge Catalog API
- Data Analytics API with Gemini(
geminidataanalytics.googleapis.com)
データベースを作成して接続する
- インスタンスを作成する。
- インスタンスに接続してデータベースを作成します。
QueryDataAPI がクエリを実行できるように、Cloud SQL for PostgreSQL インスタンスで Cloud SQL Data API を有効にします。gcloud sql instances patch INSTANCE_ID \ --project=PROJECT_ID \ --data-api-access=ALLOW_DATA_API次のように置き換えます。
INSTANCE_ID: Cloud SQL for PostgreSQL インスタンスの ID。PROJECT_ID: 実際の Google Cloud プロジェクト ID。
必要なロールを付与して IAM データベース ユーザーを作成する
Identity and Access Management(IAM)で認証し、パラメータ化されたセキュアビューに対して queryData リクエストを実行するには、IAM ユーザーまたはサービス アカウントを構成します。
Google Cloud プロジェクトの
IAM_USER_EMAILに次の IAM ロールを付与します。roles/geminidataanalytics.queryDataUserroles/serviceusage.serviceUsageConsumerroles/cloudsql.instanceUser
IAM ロールの付与の詳細については、プロジェクトの IAM ポリシー バインディングを追加するをご覧ください。
Cloud SQL インスタンスで IAM データベース認証を有効にし、インスタンスに IAM データベース ユーザーとして
IAM_USER_EMAILを追加します。この IAM データベース ユーザーにpsv_userデータベース ロールを付与する前に、この IAM データベース ユーザーを作成する必要があります。IAM データベース ユーザーの設定の詳細については、IAM データベース認証でユーザーを管理するをご覧ください。
環境を準備する
パラメータ化されたセキュアビューでクエリを実行する準備をするには、データベース、データベースのロール、parameterized_views 拡張機能、アプリケーション スキーマを設定します。
データベース フラグを有効にする
必要な拡張機能ライブラリを読み込むcloudsql.enable_parameterized_views データベース フラグを有効にします。詳細については、インスタンスのデータベース フラグを構成するをご覧ください。
データベースを設定する
- アプリケーション データとパラメータ化されたセキュアビュー用に
databaseというデータベースを作成します。詳細については、データベースを作成するをご覧ください。
データベース ロール、拡張機能、アプリケーション スキーマを作成する
Google Cloud コンソールで、[Cloud SQL] ページに移動します。
リストからインスタンスを選択します。
ナビゲーション メニューで [Cloud SQL Studio] をクリックします。
管理者アカウント認証を使用して Studio にログインします。
[認証] をクリックします。[エクスプローラ] ペインに、データベースにあるオブジェクトのリストが表示されます。
[新しい SQL エディタタブ] または [新しいタブ] をクリックして、新しいタブを開きます。
パラメータ化ビューを使用するには、データベースに
parameterized_views拡張機能を作成します。-- Requires parameterized_views.enabled set to true CREATE EXTENSION parameterized_views;拡張機能が作成されると、データベースは
parameterized_viewsという名前のスキーマも作成します。これにより、API がそのスキーマの名前空間に含まれ、API が既存の API と競合しないようになります。組み込みの
postgresユーザーなど、スーパーユーザー権限を持つユーザーとしてログインします。パラメータ化されたセキュアビューに対してクエリを実行する新しいデータベース ロールを作成します。これは、アプリケーションがデータベースに接続してログインし、公開関数またはオブジェクトへのアクセスを最小限に制限してクエリを実行するために使用する Cloud SQL ロールです。
CREATE ROLE psv_user WITH LOGIN PASSWORD '...';詳細については、
CREATE USERをご覧ください。管理者権限を持つユーザーとして接続します。
SET role TO postgres;テーブルを含むスキーマを作成します。
CREATE SCHEMA store;テーブルを作成してデータを挿入します。
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);
パラメータ化されたセキュアビューを作成し、アクセス権限を設定する
パラメータ化されたセキュアビューを作成し、ベーステーブルとビューに適切なアクセス権を設定するには、次の操作を行います。
Google Cloud コンソールで、[Cloud SQL] ページに移動します。
リストからインスタンスを選択します。
ナビゲーション メニューで [Cloud SQL Studio] をクリックします。
Studio にログインし、
postgresユーザーとして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;注: パラメータ化ビューのオーナーには、ベーステーブルに対する
SELECT権限が必要です。また、パラメータ化されたビューのユーザーには、ビューのスキーマに対するUSAGEと、ビューに対するSELECTが必要です。たとえば、postgresユーザーはパラメータ化されたビューを所有しているため、ベーステーブルに対するSELECT権限を持っています。一方、psv_userはstoreスキーマに対するUSAGEとビューに対するSELECTを持っている必要があります。IAM_USER_EMAILが IAM データベース ユーザーとしてインスタンスに追加されていることを確認し、postgresユーザーとしてログインして、IAM 認証済みユーザーにpsv_userロールを付与します。GRANT psv_user TO "IAM_USER_EMAIL";IAM_USER_EMAILは、IAM ユーザーのメールアドレスに置き換えます。
データ セキュリティを確認する
パラメータ化されたセキュアビューが指定されたビューへのアクセスを制限していることを確認するには、IAM 認証ユーザーとしてデータベースにログインします。Cloud SQL では、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'] );gcloud auth application-default loginを実行してIAM_USER_EMAILとして Google Cloud CLI にログインし、gcloud auth application-default print-access-tokenが制限付き IAM データベース ユーザーのトークンを生成するようにします。次に、PSV パラメータを指定してqueryDataメソッドを使用し、パラメータ化されたセキュアビューをクエリします。curl -X POST \ "https://geminidataanalytics.googleapis.com/v1beta/projects/PROJECT_ID/locations/REGION:queryData" \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "x-goog-user-project: PROJECT_ID" \ -H "Content-Type: application/json; charset=utf-8" \ -d '{ "prompt": "Show me the checked items.", "context": { "datasource_references": { "cloud_sql_reference": { "database_reference": { "engine": "POSTGRESQL", "project_id": "PROJECT_ID", "region": "REGION", "instance_id": "INSTANCE_ID", "database_id": "DATABASE_ID", "table_ids": [ "store.secure_checked_items" ] } } }, "parameterized_secure_view_parameters": { "parameters": [ { "key": "app_end_userid", "value": "303" } ] } }, "generation_options": { "generate_query_result": true, "generate_natural_language_answer": true, "generate_explanation": true } }'database_referenceのtable_idsフィールドを使用して、QueryDataがstore.secure_checked_itemsパラメータ化されたセキュアビューに対してのみ SQL を生成するようにします。table_idsを省略し、データベース ロールにstore.checked_itemsベーステーブルに対するSELECTアクセス権がある場合、QueryDataはセキュアビューをバイパスしてベーステーブルに直接クエリを実行する可能性があります。table_idsの修飾されていない名前はデフォルトでpublicスキーマになるため、スキーマ修飾ビュー名を指定します。次のように置き換えます。
PROJECT_ID: 実際の Google Cloud プロジェクト ID。REGION: Cloud SQL for PostgreSQL インスタンスが配置されているリージョン。INSTANCE_ID: Cloud SQL for PostgreSQL インスタンスの ID。DATABASE_ID: Cloud SQL for PostgreSQL データベースの ID。このチュートリアルではdatabaseです。
クリーンアップ
インスタンスの削除
始める前にセクションで作成したインスタンスを削除すると、作成したすべてのオブジェクトも削除されます。
Google Cloud コンソールで、[Cloud SQL] ページに移動します。
リストからインスタンスを選択します。
[削除] をクリックします。
インスタンス名を入力し [削除] をクリックして、インスタンスの削除を確定します。
次のステップ
パラメータ化されたセキュアビューについて学習する。
パラメータ化されたセキュアビューを使用する方法を学習する。