Mengamankan dan mengontrol akses ke data aplikasi

Tampilan aman yang diberi parameter memberikan keamanan data tingkat baris dan kontrol akses dengan memfilter hasil kueri berdasarkan identitas pengguna aplikasi.

Tutorial ini menjelaskan cara menyiapkan tampilan aman yang diberi parameter di Cloud SQL, 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 yang diberi parameter?

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 Anda, 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 yang diberi parameter untuk memastikan bahwa pengguna hanya melihat data yang diizinkan.

Penggunaan tampilan aman yang diberi parameter memberikan dua manfaat utama:

  • Keamanan tingkat baris dinamis: Memfilter kueri menggunakan ID pengguna akhir sehingga pengguna hanya mengakses data yang diizinkan, terlepas dari frasa kueri.
  • Pengelolaan peran yang disederhanakan: Menggunakan satu peran database bersama untuk semua pengguna aplikasi, bukan mengelola peran database terpisah untuk setiap individu.

Tujuan

  • Membuat tampilan aman yang diberi parameter dengan parameter tampilan bernama.
  • Membuat peran database yang digunakan oleh aplikasi untuk terhubung ke database dan mengakses tampilan aman yang diberi parameter.
  • Memberikan izin peran baru ke tampilan aman yang diberi parameter dan mencabut akses ke tabel dasar.
  • Menghubungkan menggunakan peran baru dan memverifikasi bahwa tabel yang dibatasi tidak dapat diakses.
  • Menjalankan kueri pada tampilan aman yang diberi parameter menggunakan fungsi execute_parameterized_query() atau menggunakan QueryData API.

Biaya

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

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

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

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

Sebelum memulai

Sebelum membuat tampilan aman yang diberi parameter, selesaikan prasyarat berikut.

Mengaktifkan penagihan dan API yang diperlukan

  1. Di Google Cloud konsol, pilih project.

    Buka pemilih project

  2. Pastikan penagihan diaktifkan untuk Google Cloud project Anda.

  3. Aktifkan Cloud API yang diperlukan untuk membuat dan terhubung ke Cloud SQL.

    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:

      • Cloud SQL for PostgreSQL API
      • Knowledge Catalog API

Membuat dan terhubung ke database

  1. Buat instance.
  2. Hubungkan ke instance Anda dan buat database.

Menyiapkan lingkungan Anda

Untuk bersiap menjalankan kueri pada tampilan aman yang diberi parameter, siapkan database, peran database, ekstensi parameterized_views, dan skema aplikasi.

Mengaktifkan flag database

Aktifkan flag database cloudsql.enable_parameterized_views, 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 yang diberi parameter. Untuk mengetahui informasi selengkapnya, lihat Membuat database.

Membuat peran database, ekstensi, dan skema aplikasi

  1. Di Google Cloud konsol, buka halaman Cloud SQL.

    Buka Cloud SQL

  2. Pilih instance dari daftar.

  3. Di menu navigasi, klik Cloud SQL Studio.

  4. Login ke Studio menggunakan autentikasi postgres.

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

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

  7. Untuk menggunakan tampilan yang diberi parameter, 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 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.

  9. Buat peran database baru untuk menjalankan kueri terhadap tampilan aman yang diberi parameter. Ini adalah peran Cloud SQL yang digunakan aplikasi untuk terhubung dan login ke database untuk menjalankan kueri dengan akses terbatas ke fungsi atau objek publik ke kumpulan minimal yang diperlukan.

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

    Untuk mengetahui informasi selengkapnya, lihat CREATE USER.

  10. Terhubung sebagai pengguna administratif.

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

    CREATE SCHEMA store;
    
  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 aman yang diberi parameter dan menyiapkan hak akses

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

  1. Di Google Cloud konsol, buka halaman Cloud SQL.

    Buka Cloud SQL

  2. Pilih instance dari daftar.

  3. Di menu navigasi, klik Cloud SQL Studio.

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

  5. Klik Authenticate. 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 yang diberi parameter:

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

    REVOKE ALL PRIVILEGES ON store.checked_items FROM psv_user;
    

    Catatan: Pemilik tampilan yang diberi parameter harus memiliki hak istimewa SELECT pada tabel dasar. Selain itu, pengguna tampilan yang diberi parameter harus memiliki USAGE pada skema tampilan dan SELECT pada tampilan. Misalnya, pengguna postgres memiliki tampilan yang diberi parameter, sehingga memiliki hak istimewa SELECT pada tabel dasar, sedangkan psv_user harus memiliki USAGE pada skema store dan SELECT pada tampilan.

  11. Login sebagai administrator postgres, 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 yang diberi parameter membatasi akses ke tampilan yang ditentukan, login ke database sebagai pengguna yang diautentikasi IAM. Di Cloud SQL, pengguna IAM mewarisi izin peran database yang ditetapkan kepada mereka.

  1. Login ke database sebagai pengguna yang diautentikasi IAM.

  2. Verifikasi bahwa 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']
    );
    
    1. Buat kueri tampilan aman yang diberi parameter 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": {
                "cloud_sql_reference": {
                  "database_reference": {
                    "engine": "POSTGRESQL",
                    "project_id": "PROJECT_ID",
                    "region": "REGION",
                    "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 Anda Google Cloud .
      • REGION: Region tempat instance Cloud SQL untuk PostgreSQL Anda berada.
      • INSTANCE_ID: ID instance Cloud SQL untuk PostgreSQL Anda.
      • DATABASE_ID: ID database Cloud SQL 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 Google Cloud konsol, buka halaman Cloud SQL.

      Buka Cloud SQL

    2. Pilih instance dari daftar.

    3. Klik Delete.

    4. Konfirmasi bahwa Anda ingin menghapus instance dengan memasukkan nama instance dan mengklik Delete.