Mengamankan dan mengontrol akses ke data aplikasi menggunakan tampilan aman berparameter

Tampilan aman berparameter memberikan keamanan data dan kontrol akses baris ke aplikasi. Aturan ini memfilter hasil kueri berdasarkan identitas pengguna aplikasi.

Tutorial ini menjelaskan cara menyiapkan tampilan aman berparameter di AlloyDB untuk PostgreSQL, mengonfigurasi peran dan hak istimewa database untuk membatasi akses ke tabel dasar, dan memverifikasi keamanan data. Contoh yang diberikan dalam dokumen ini hanya untuk tujuan demonstrasi.

Apa yang dimaksud dengan tampilan aman berparameter?

Sebagai praktik terbaik umum, aplikasi Anda harus berjalan menggunakan akun layanan dengan akses minimum 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.

Jika aplikasi Anda memerlukan keamanan yang lebih terperinci daripada izin akses tingkat database standar, Anda dapat menggunakan tampilan aman berparameter untuk memastikan bahwa pengguna hanya melihat data yang diizinkan. Tampilan aman berparameter memberikan keamanan data dinamis dan kontrol akses baris yang sesuai untuk aplikasi SaaS multi-tenant tanpa memerlukan peran database terpisah untuk setiap pengguna akhir aplikasi.

Penggunaan tampilan aman berparameter memberikan tiga manfaat utama:

  • Keamanan data dinamis dan kontrol akses baris: Memfilter kueri menggunakan ID pengguna akhir sehingga pengguna hanya mengakses data yang diizinkan, terlepas dari susunan kata kueri.
  • Pengelolaan peran yang lebih mudah: Menggunakan satu peran database bersama untuk semua pengguna aplikasi, bukan mengelola peran database terpisah untuk setiap individu.

Tujuan

  • Membuat tampilan aman berparameter dengan parameter tampilan bernama.
  • Buat peran database yang digunakan oleh aplikasi untuk terhubung ke database dan mengakses tampilan aman berparameter.
  • Berikan izin peran baru ke tampilan aman berparameter 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

Sebelum Anda membuat tampilan aman berparameter, selesaikan prasyarat berikut.

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. Mengaktifkan Cloud API yang diperlukan untuk membuat dan terhubung ke AlloyDB untuk PostgreSQL.

    1. Mengaktifkan API

    2. Pada langkah Confirm project, klik Next untuk mengonfirmasi nama project yang akan Anda ubah.

    3. Pada langkah Enable APIs, klik Enable untuk mengaktifkan hal berikut:

      • AlloyDB for PostgreSQL API
      • Knowledge Catalog API
      • Data Analytics API with Gemini (geminidataanalytics.googleapis.com)

Membuat dan menghubungkan ke database

  1. Buat cluster dan instance utamanya.
  2. Menghubungkan ke instance dan membuat database.

Memberikan peran yang diperlukan dan membuat pengguna database IAM

Untuk melakukan autentikasi dengan Identity and Access Management (IAM) dan menjalankan permintaan queryData terhadap tampilan aman berparameter, konfigurasikan pengguna atau akun layanan IAM:

  1. Berikan peran IAM berikut ke IAM_USER_EMAIL di project Google Cloud Anda:

    • roles/geminidataanalytics.queryDataUser
    • roles/serviceusage.serviceUsageConsumer
    • roles/alloydb.databaseUser

    Untuk mengetahui informasi selengkapnya tentang cara memberikan peran IAM, lihat Menambahkan binding kebijakan IAM untuk project.

  2. Aktifkan autentikasi IAM di instance AlloyDB Anda dan tambahkan IAM_USER_EMAIL sebagai pengguna database berbasis IAM di cluster Anda. Anda harus membuat pengguna database IAM ini sebelum memberikan peran database psv_user kepadanya. Untuk mengetahui informasi selengkapnya tentang cara menyiapkan pengguna database IAM, lihat Mengelola autentikasi IAM.

Menyiapkan lingkungan Anda

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

Mengaktifkan flag database

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 aman 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 akun administrator.

  5. Klik Authenticate. Panel Explorer menampilkan daftar objek dalam database Anda.

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

  7. Untuk menggunakan tampilan berparameter, buat ekstensi parameterized_views di database Anda:

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

    Saat ekstensi dibuat, database juga membuat skema bernama parameterized_views sehingga API dimuat dalam namespace skema tersebut dan agar API tersebut tidak bertentangan 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 diberi parameter, dan beri admin_user kemampuan untuk mengelola peran ini. Ini adalah peran AlloyDB yang digunakan aplikasi untuk terhubung dan login ke database guna menjalankan kueri dengan akses terbatas ke fungsi atau objek publik ke set minimum yang diperlukan.

    CREATE ROLE psv_user WITH LOGIN PASSWORD '...';
    GRANT psv_user TO admin_user WITH ADMIN OPTION;
    

    Untuk informasi selengkapnya, lihat CREATE USER.

  10. Hubungkan sebagai pengguna administratif.

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

    CREATE SCHEMA store;
    
  12. Membuat tabel dan menyisipkan 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 aman berparameter dan menyiapkan hak istimewa akses

Untuk membuat tampilan aman berparameter dan menyiapkan hak istimewa 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 bernama database sebagai pengguna admin_user.

  5. Klik Authenticate. Panel Explorer menampilkan daftar objek dalam database Anda.

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

  7. Untuk memberikan akses terbatas ke tampilan, buat tampilan 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 tabel virtual.

    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. Cabut akses langsung ke tabel dasar.

    REVOKE ALL PRIVILEGES ON store.checked_items FROM psv_user;
    

    Catatan: Pemilik tampilan berparameter harus memiliki hak istimewa SELECT di tabel dasar. Selain itu, pengguna tampilan berparameter harus memiliki USAGE pada skema tampilan dan SELECT pada tampilan. Misalnya, pengguna admin_user memiliki tampilan berparameter, sehingga memiliki hak istimewa SELECT pada tabel dasar, sedangkan psv_user harus memiliki USAGE pada skema store dan SELECT pada tampilan.

  11. Pastikan IAM_USER_EMAIL telah ditambahkan ke cluster sebagai pengguna database IAM, login sebagai pengguna postgres atau sebagai admin_user, dan 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 yang diberi parameter 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. Login ke Google Cloud CLI sebagai IAM_USER_EMAIL dengan menjalankan gcloud auth application-default login agar gcloud auth application-default print-access-token membuat token untuk pengguna database IAM yang dibatasi, lalu buat kueri tampilan aman berparameter menggunakan metode queryData dengan parameter PSV:

      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": {
              "alloydb": {
                "database_reference": {
                  "project_id": "PROJECT_ID",
                  "region": "REGION",
                  "cluster_id": "CLUSTER_ID",
                  "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
          }
        }'

    Gunakan kolom table_ids di database_reference untuk memastikan QueryData hanya membuat SQL terhadap tampilan aman berparameter store.secure_checked_items. Jika Anda menghilangkan table_ids dan peran database memiliki akses SELECT pada tabel dasar store.checked_items, QueryData mungkin akan mengkueri tabel dasar secara langsung, sehingga mengabaikan tampilan aman. Tentukan nama tampilan yang memenuhi syarat skema karena nama yang tidak memenuhi syarat di table_ids ditetapkan secara default ke skema public.

    Ganti kode 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, yaitu database dalam tutorial ini.

    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 Delete cluster.

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

    Langkah berikutnya