Mengamankan dan mengontrol akses ke data aplikasi menggunakan tampilan aman berparameter

Tutorial ini menjelaskan cara menggunakan tampilan aman berparameter di AlloyDB untuk PostgreSQL guna membatasi akses pengguna ke tabel database. Dalam tutorial ini, Anda akan menyiapkan tampilan aman berparameter, mengonfigurasi peran dan hak istimewa database untuk membatasi akses ke tabel dasar, dan memverifikasi keamanan data. Tampilan aman yang diberi parameter membantu mengamankan aplikasi yang menggunakan kueri bahasa alami yang dibuat menggunakan QueryData API.

Contoh disertakan untuk mengilustrasikan kemampuan tampilan aman berparameter. Contoh ini hanya dimaksudkan untuk tujuan demonstrasi.

Apa itu tampilan aman berparameter?

Sebagai praktik terbaik umum, aplikasi Anda harus berjalan menggunakan akun layanan dengan akses minimal yang diperlukan ke database Anda. Misalnya, jika aplikasi Anda tidak boleh menulis ke database, aplikasi tersebut harus menggunakan peran dengan akses hanya baca. Anda harus mengonfigurasi kontrol akses ini di tingkat database.

Namun, terkadang aplikasi Anda memerlukan kontrol keamanan yang lebih terperinci daripada izin akses tingkat database standar. Tampilan aman berparameter memberikan keamanan data aplikasi dan kontrol akses baris menggunakan tampilan SQL. Fitur ini membantu memastikan bahwa pengguna aplikasi hanya dapat melihat data yang diizinkan untuk diakses.

Tampilan aman yang diparameterkan mengurangi risiko keamanan saat menangani kueri bahasa alami ad hoc atau yang dibuat LLM dengan memparameterkan tampilan menggunakan ID pengguna akhir, sehingga memastikan pengguna hanya mengakses data yang diizinkan terlepas dari susunan kata kueri. Pendekatan ini juga menyederhanakan pengelolaan pengguna dengan memungkinkan satu peran database melayani semua pengguna aplikasi secara aman, sehingga tidak perlu membuat peran database terpisah untuk setiap individu guna menerapkan keamanan tingkat baris.

Tujuan

  • Buat tampilan berparameter yang aman dengan parameter tampilan bernama.
  • Buat peran database yang digunakan oleh aplikasi untuk terhubung ke database dan mengakses tampilan aman berparameter.
  • Beri izin peran baru ke tampilan aman dan cabut akses ke tabel dasar.
  • Hubungkan menggunakan peran baru dan verifikasi bahwa tabel yang dibatasi tidak dapat diakses.
  • Jalankan kueri pada tampilan aman berparameter menggunakan fungsi execute_parameterized_query atau menggunakan QueryData API.

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga.

Pengguna Google Cloud baru mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Untuk menghindari penagihan berkelanjutan, hapus resource yang Anda buat setelah menyelesaikan tugas dalam dokumen ini. Untuk informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

Selesaikan prasyarat berikut sebelum membuat set konteks.

Mengaktifkan penagihan dan API yang diperlukan

  1. Di konsol Google Cloud , pilih project.

    Buka pemilih project

  2. Pastikan penagihan diaktifkan untuk project Google Cloud Anda.

  3. Aktifkan Cloud API yang diperlukan untuk membuat dan menghubungkan ke AlloyDB untuk PostgreSQL.

    1. Pada langkah Confirm project, klik Next untuk mengonfirmasi nama project yang akan Anda ubah.
    2. Pada langkah Enable APIs, klik Enable untuk mengaktifkan berikut ini:

      • AlloyDB untuk PostgreSQL API
      • Dataplex Universal Catalog API

Membuat dan menghubungkan ke database

  1. Buat cluster dan instance utamanya.
  2. Hubungkan ke instance dan buat database.

Menyiapkan lingkungan Anda

Untuk bersiap menjalankan kueri pada tampilan aman berparameter, siapkan database, peran database, ekstensi parameterized_view, dan skema aplikasi.

Aktifkan ekstensi yang diperlukan

Aktifkan flag database parameterized_views.enabled, yang memuat library ekstensi yang diperlukan. Untuk mengetahui informasi selengkapnya, lihat Mengonfigurasi flag database instance.

Menyiapkan database

  • Buat database bernama database untuk data aplikasi dan tampilan berparameter. Untuk mengetahui informasi selengkapnya, lihat Membuat database.

Membuat peran database, ekstensi, dan skema aplikasi

  1. Di konsol Google Cloud , buka halaman AlloyDB.

    Buka AlloyDB

  2. Pilih cluster dari daftar.

  3. Di menu navigasi, klik AlloyDB Studio.

  4. Login ke Studio menggunakan autentikasi postgres.

  5. Klik Autentikasi. Panel Explorer menampilkan daftar objek di database Anda.

  6. Klik New SQL editor tab atau New tab untuk membuka tab baru

  7. Buat ekstensi parameterized_views di database.

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

    Saat ekstensi dibuat, sistem juga membuat skema bernama parameterized_views sehingga API berada dalam namespace skema tersebut dan API tersebut tidak berkonflik dengan API yang ada.

  8. Login sebagai pengguna dengan hak istimewa superuser, seperti pengguna postgres bawaan. Jika Anda ingin membuat pengguna super baru, misalnya admin_user, jalankan perintah berikut:

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

    Untuk informasi selengkapnya, lihat CREATE USER.

  9. Buat peran database baru untuk menjalankan kueri terhadap tampilan aman yang diparameterkan. Ini adalah peran AlloyDB yang digunakan aplikasi untuk terhubung dan login ke database untuk menjalankan kueri dengan akses terbatas ke fungsi atau objek publik ke set minimum yang diperlukan.

    CREATE ROLE psv_user WITH LOGIN PASSWORD '...';
    

    Untuk informasi selengkapnya, lihat CREATE USER.

  10. Hubungkan sebagai pengguna administratif.

    SET role TO admin_user;
    
  11. Buat skema yang berisi tabel.

    CREATE SCHEMA schema;
    
  12. Buat tabel dan masukkan data.

    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);
    

Membuat tampilan berparameter yang aman dan menyiapkan hak akses

Untuk membuat tampilan berparameter yang aman dan menyiapkan hak akses yang sesuai untuk tabel dan tampilan dasar, ikuti langkah-langkah berikut:

  1. Di konsol Google Cloud , buka halaman AlloyDB.

    Buka AlloyDB

  2. Pilih cluster dari daftar.

  3. Di menu navigasi, klik AlloyDB Studio.

  4. Login ke Studio dan hubungkan ke database sebagai admin_user.

  5. Klik Autentikasi. Panel Explorer menampilkan daftar objek di database Anda.

  6. Klik New SQL editor tab atau New tab untuk membuka tab baru.

  7. Untuk memberikan akses terbatas ke tampilan, buat tampilan aman berparameter:

    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;
    
  8. Memberikan akses ke tampilan.

    GRANT SELECT ON store.secure_checked_items TO psv_user;
    
  9. Untuk mengakses tampilan, berikan akses ke skema.

    GRANT USAGE ON SCHEMA store TO psv_user;
    
  10. Mencabut akses langsung ke tabel dasar.

    REVOKE ALL PRIVILEGES ON store.checked_items FROM psv_user;
    
  11. Login sebagai administrator admin_user, lalu berikan peran psv_user kepada pengguna yang diautentikasi IAM

    GRANT psv_user TO "IAM_USER_EMAIL";
    

    Ganti IAM_USER_EMAIL dengan alamat email pengguna IAM Anda.

Memverifikasi keamanan data

Untuk memverifikasi bahwa tampilan aman berparameter membatasi akses ke tampilan yang ditentukan, login ke database sebagai pengguna yang diautentikasi IAM. Di AlloyDB, pengguna IAM mewarisi izin peran database yang ditetapkan kepada mereka.

  1. Login ke database sebagai pengguna yang diautentikasi IAM.

  2. Pastikan tabel dasar tidak dapat diakses.

    SELECT * FROM store.checked_items;
    ERROR:  permission denied for table checked_items
    
  3. Akses tampilan aman berparameter menggunakan fungsi execute_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']
    );
    
  4. Kueri tampilan aman berparameter menggunakan sintaksis SQL dan permintaan QueryData dengan parameter PSV.

    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
        }
      }'

Ganti nilai berikut:

  • PROJECT_ID: Project ID Google Cloud Anda.
  • REGION: Region tempat instance AlloyDB untuk PostgreSQL Anda berada.
  • CLUSTER_ID: ID cluster AlloyDB untuk PostgreSQL Anda.
  • INSTANCE_ID: ID instance AlloyDB untuk PostgreSQL Anda.
  • DATABASE_ID: ID database AlloyDB untuk PostgreSQL Anda.

Pembersihan

Menghapus cluster

Saat menghapus cluster yang Anda buat di bagian sebelum memulai, Anda juga menghapus semua objek yang Anda buat.

  1. Di konsol Google Cloud , buka halaman AlloyDB.

    Buka AlloyDB

  2. Pilih cluster dari daftar.

  3. Klik Hapus cluster.

  4. Di Hapus cluster, masukkan nama cluster untuk mengonfirmasi bahwa Anda ingin menghapus cluster.

Langkah berikutnya