パラメータ化されたセキュアなビューを使用して、アプリケーション データへのアクセスの保護と制御を行う。

ドキュメントのバージョンを選択してください。

このチュートリアルでは、AlloyDB Omni でパラメータ化されたセキュアビューを使用して、AlloyDB Omni Studio または psql を使い、ユーザーがパラメータ化されたビューにアクセスできる範囲を制限する方法について説明します。

パラメータ化されたセキュアビューの機能を示す例が含まれています。これらの例はデモを目的としています。

目標

  • 名前付きビュー パラメータを使用して、セキュアなパラメータ化されたビューを作成します。
  • アプリケーションがデータベースに接続し、パラメータ化されたセキュアビューにアクセスするために使用するデータベースロールを作成します。
  • 新しいロールにセキュアビューに対する権限を付与し、ベーステーブルへのアクセス権を取り消します。
  • 新しいロールを使用して接続し、制限付きテーブルにアクセスできないことを確認します。
  • execute_parameterized_query 関数を使用して、パラメータ化されたセキュアビューに対してクエリを実行します。

データベースをインストールして接続する

  1. AlloyDB Omni(Kubernetes 用、コンテナ用)をインストールします。
  2. クラスタとそのプライマリ インスタンスを作成します
  3. インスタンスに接続します(Kubernetes 用コンテナ用)。

環境を準備する

パラメータ化されたセキュアビューでクエリを実行する準備をするには、まずパラメータ化されたビュー、データベースとデータベースのロール、parameterized_view 拡張機能、アプリケーション スキーマを設定する必要があります。

パラメータ化されたセキュアビューを使用する前に、新しい postgres コンテナごとに次の操作を 1 回行う必要があります。各設定は、ALTER SYSTEM を使用するか、postgresql.conf を直接編集することで適用できます。

  1. shared_preload_libraries に「parameterized_views」を追加します。
  2. parameterized_views.enabled=on を設定して、この機能を有効にします。
  3. 変更を反映させるために postgres を再起動します。

データベースを設定する

  • アプリケーション データとパラメータ化されたビュー用に database というデータベースを作成します。詳細については、データベースを作成するをご覧ください。

データベース ロール、拡張機能、アプリケーション スキーマを作成する

  1. psql を使用して、postgres ユーザーとして、または AlloyDB Omni のスーパーユーザー権限を持つユーザーとしてデータベースに接続します。

    psql database -U postgres
    

    詳細については、AlloyDB Omni でのデータベース ユーザー管理についてをご覧ください。

  2. データベースに parameterized_views 拡張機能を作成します。

    -- Requires parameterized_views.enabled set to true
    CREATE EXTENSION parameterized_views;
    

    拡張機能が作成されると、parameterized_views という名前のスキーマも作成されます。これにより、API がそのスキーマの名前空間に含まれ、API が既存の API と競合しないようになります。

  3. AlloyDB Omni の管理者ロールを作成します。このロールがデータベースを所有し、管理します。

    CREATE ROLE admin_user WITH LOGIN PASSWORD '...';
    GRANT ALL PRIVILEGES ON DATABASE database TO admin_user;
    

    詳細については、CREATE USER をご覧ください。

  4. パラメータ化されたセキュアビューに対してクエリを実行する新しいデータベース ロールを作成します。このロールは AlloyDB Omni のロールで、アプリケーションがデータベースに接続してログインする際に使用されます。このロールには、必要最小限の公開関数やオブジェクトにのみアクセスできるよう制限された権限が与えられます。

    詳細については、CREATE USER をご覧ください。

  5. 管理者権限を持つユーザーとして接続します。

    SET role TO admin_user;
    
  6. テーブルを含むスキーマを作成します。

    CREATE SCHEMA schema;
    
  7. テーブルを作成してデータを挿入します。

    CREATE TABLE schema.checked_items(bag_id INT,timestamp TIMESTAMP, loc_code CHAR(3), scan_type CHAR(1), location TEXT, customer_id INT);
    
    INSERT INTO schema.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);
    

セキュアなパラメータ化されたビューを作成し、アクセス権限を設定する

セキュアなパラメータ化ビューを作成し、ベーステーブルとビューに適切なアクセス権を設定するには、次の操作を行います。

  1. psql を使用して、admin_user としてデータベースに接続します。

    psql database -U admin_user
    
  2. ビューへのアクセスを制限するには、パラメータ化されたセキュアビューを作成します。

    CREATE VIEW schema.secure_checked_items WITH (security_barrier) AS
    SELECT bag_id, timestamp, location
    FROM schema.checked_items t
    WHERE customer_id = $@app_end_userid;
    
  3. ビューへのアクセス権を付与します。

    GRANT SELECT ON schema.secure_checked_items TO psv_user;
    
  4. ビューにアクセスするには、スキーマへのアクセス権を付与します。

    GRANT USAGE ON SCHEMA schema TO psv_user;
    
  5. ベーステーブルへの直接アクセスを取り消します。

    REVOKE ALL PRIVILEGES ON schema.checked_items FROM psv_user;
    

データ セキュリティを確認する

パラメータ化されたセキュアビューが指定されたビューへのアクセスを制限していることを確認するには、psv_user として次のコマンドを実行します。これは、アプリケーションがデータベースに接続してログインし、クエリを実行するために使用する AlloyDB Omni データベース ロールです。

  1. パラメータ化されたセキュアビュー ユーザーとして接続します。

    psql database -U psv_user
    
  2. ベーステーブルにアクセスできないことを確認します。

    SELECT * FROM schema.checked_items;
    ERROR:  permission denied for table checked_items
    
  3. execute_parameterized_query 関数を使用して、パラメータ化されたセキュアビューにアクセスします。

    SELECT * FROM parameterized_views.execute_parameterized_query(
      query => 'SELECT * from schema.secure_checked_items',
      param_names => ARRAY ['app_end_userid'],
      param_values => ARRAY ['303']
    );
    
  4. 自然言語生成クエリのセキュリティを強化するには、自然言語を使用してパラメータ化されたセキュアビューを統合します。

クリーンアップ

クリーンアップするには、AlloyDB Omni インスタンスをアンインストールするか、インスタンスを保持して個々のオブジェクトを削除します。

次のステップ