Mengelola keamanan data aplikasi menggunakan tampilan aman berparameter AlloyDB Omni

Pilih versi dokumentasi:

Anda dapat menggunakan tampilan aman berparameter di AlloyDB Omni untuk membatasi akses data berdasarkan parameter bernama khusus aplikasi, seperti kredensial pengguna aplikasi. Tampilan aman berparameter meningkatkan keamanan dan kontrol akses dengan memperluas fungsi tampilan PostgreSQL. Tampilan ini juga mengurangi risiko menjalankan kueri yang tidak tepercaya dari aplikasi dengan secara otomatis menerapkan batasan pada kueri apa pun yang dijalankan.

Untuk mengetahui informasi selengkapnya, lihat ringkasan Tampilan aman berparameter dan Mengamankan dan mengontrol akses ke data aplikasi menggunakan tampilan aman berparameter.

Sebelum memulai

Dukungan tampilan berparameter AlloyDB AI disediakan melalui parameterized_views, yang merupakan ekstensi AlloyDB untuk PostgreSQL.

Halaman ini mengasumsikan bahwa Anda telah menginstal AlloyDB Omni. Lihat Menginstal AlloyDB Omni (untuk container, untuk Kubernetes).

Sebelum menggunakan tampilan aman berparameter, Anda harus melakukan hal berikut satu kali di setiap penampung postgres baru. Setiap setelan dapat diterapkan menggunakan ALTER SYSTEM atau dengan mengedit postgresql.conf secara langsung.

  1. Tambahkan parameterized_views ke shared_preload_libraries.
  2. Aktifkan fitur dengan menyetel parameterized_views.enabled=on.
  3. Mulai ulang server PostgreSQL agar perubahan dapat diterapkan.

    -- See the current shared_preload_libraries
    SHOW shared_preload_libraries;
    ALTER SYSTEM SET shared_preload_libraries="...,parameterized_views";
    ALTER SYSTEM SET parameterized_views.enabled=on;
    
  4. Gunakan psql untuk membuat ekstensi parameterized_views di database mana pun tempat Anda ingin membuat tampilan berparameter:

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

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

Membuat tampilan aman berparameter

Untuk membuat tampilan aman berparameter, ikuti langkah-langkah berikut:

  1. Jalankan perintah DDL CREATE VIEW, seperti yang ditunjukkan dalam contoh berikut:

    CREATE VIEW secure_checked_items WITH (security_barrier) AS
    SELECT bag_id, timestamp, location
    FROM checked_items t
    WHERE customer_id = $@app_end_userid;
    

    Dalam contoh sebelumnya, tampilan aman berparameter memungkinkan akses ke tiga kolom dari tabel bernama checked_items. Tampilan membatasi hasil ke baris tempat checked_items.customer_id cocok dengan parameter yang diperlukan. Gunakan atribut berikut:

    • Buat tampilan menggunakan opsi security_barrier.
    • Untuk membatasi pengguna aplikasi agar hanya dapat melihat baris yang diizinkan untuk diakses, tambahkan parameter yang diperlukan dalam definisi tampilan menggunakan sintaksis $@PARAMETER_NAME. Kasus penggunaan yang umum adalah memeriksa nilai kolom dalam klausa WHERE menggunakan COLUMN = $@PARAMETER_NAME.
    • $@PARAMETER_NAME menunjukkan parameter tampilan bernama. Nilainya diberikan saat Anda menggunakan execute_parameterized_query API. Parameter tampilan bernama memiliki persyaratan berikut:
      • Parameter tampilan bernama harus diawali dengan huruf (a-z).
      • Anda dapat menggunakan huruf dengan tanda diakritik dan huruf non-Latin, dan Anda dapat menggunakan garis bawah (_).
      • Karakter berikutnya dapat berupa huruf, garis bawah, atau angka (0-9).
      • Parameter tampilan bernama tidak boleh berisi $.
      • Parameter tampilan bernama peka huruf besar/kecil. Misalnya, $@PARAMETER_NAME ditafsirkan secara berbeda dengan $@parameter_name.
  2. Berikan SELECT pada tampilan kepada pengguna database mana pun yang diizinkan untuk membuat kueri tampilan.

  3. Berikan USAGE pada skema yang berisi tabel yang ditentukan dalam tampilan kepada pengguna database mana pun yang diizinkan untuk membuat kueri tampilan.

Untuk mengetahui informasi selengkapnya, lihat Mengamankan dan mengontrol akses ke data aplikasi menggunakan tampilan aman berparameter.

Mengonfigurasi keamanan untuk aplikasi Anda

Untuk mengonfigurasi keamanan aplikasi Anda menggunakan tampilan aman berparameter, ikuti langkah-langkah berikut:

  1. Buat tampilan berparameter yang aman sebagai pengguna administratif. Pengguna ini adalah pengguna database AlloyDB Omni yang melakukan operasi administratif untuk aplikasi, termasuk penyiapan database dan administrasi keamanan.
  2. Buat peran database baru untuk menjalankan kueri terhadap tampilan aman yang diparameterkan. Ini adalah peran database AlloyDB Omni yang digunakan aplikasi untuk terhubung dan login ke database, serta untuk menjalankan kueri terhadap tampilan yang diberi parameter.
  3. Beri izin peran baru ke tampilan aman, yang biasanya mencakup hak istimewa SELECT ke tampilan dan USAGE pada skema.
  4. Batasi objek yang dapat diakses oleh peran ini ke set minimum fungsi dan objek publik yang diperlukan oleh aplikasi. Hindari memberikan akses ke skema dan tabel yang tidak bersifat publik.
  5. Saat Anda membuat kueri tampilan, aplikasi akan memberikan nilai parameter tampilan yang diperlukan, yang terkait dengan identitas pengguna aplikasi.

Membuat kueri tampilan aman berparameter

Untuk membuat kueri tampilan aman berparameter, gunakan salah satu opsi berikut yang paling mendukung kasus penggunaan Anda:

  • Berbasis JSON: Gunakan API ini untuk menjalankan kueri sekali jalan dan menampilkan baris JSON.
  • BERBASIS KURSOR: Gunakan API ini saat Anda memiliki kueri yang berjalan lebih lama atau saat Anda memiliki kueri besar dan ingin mengambil hasilnya dalam batch. Fungsi execute_parameterized_query yang disediakan oleh ekstensi parameterized_views menerima nama kursor.
  • Pernyataan PREPARE EXECUTE: Gunakan ini untuk pernyataan siap pakai yang dapat dieksekusi beberapa kali dengan nilai parameter yang berbeda.

Untuk membuat kueri tampilan aman berparameter, Anda menggunakan fungsi execute_parameterized_query() yang disediakan oleh ekstensi parameterized_views.

JSON API

API ini memiliki batasan karena mendeklarasikan kursor untuk kueri tertentu. Oleh karena itu, kueri harus kompatibel dengan kursor PostgreSQL. Misalnya, CURSOR API tidak mendukung pernyataan DO atau SHOW.

API ini juga tidak membatasi hasil berdasarkan ukuran atau jumlah baris yang ditampilkan.

Jalankan fungsi execute_parameterized_query(), yang memiliki sintaksis berikut:

SELECT * FROM
parameterized_views.execute_parameterized_query(
    query => SQL_QUERY,
    param_names => ARRAY [PARAMETER_NAMES],
    param_values => ARRAY [PARAMETER_VALUES]
)

Ganti kode berikut:

  • SQL_QUERY: kueri SQL yang klausa FROM-nya merujuk ke satu atau beberapa tampilan aman berparameter.
  • PARAMETER_NAMES: daftar nama parameter yang akan diteruskan sebagai string.
  • PARAMETER_VALUES: daftar nilai parameter yang akan diteruskan.
    • Daftar ini harus berukuran sama dengan daftar param_names, dengan urutan nilai yang cocok dengan urutan nama.
    • Jenis pasti nilai disimpulkan dari kueri dan definisi tampilan berparameter. Konversi jenis dilakukan saat diperlukan dan jika memungkinkan untuk nilai parameter tertentu. Jika terjadi ketidakcocokan jenis, error akan ditampilkan.

Fungsi ini menampilkan tabel objek JSON. Setiap baris dalam tabel setara dengan nilai ROW_TO_JSON() dari baris hasil kueri asli.

Gunakan contoh berikut untuk membuat kueri tampilan aman berparameter:

SELECT * FROM
parameterized_views.execute_parameterized_query(
    query => 'SELECT * FROM secure_checked_items',
    param_names => ARRAY ['app_end_userid'],
    param_values => ARRAY ['40']
)

Penggunaan API ini membatasi ukuran kumpulan hasil berdasarkan ukuran yang dinyatakan dalam kilobyte (kB) hasil dan berdasarkan jumlah baris. Anda dapat mengonfigurasi batas ini dengan menggunakan parameterized_views.json_results_max_size dan parameterized_views.json_results_max_rows.

API ini memiliki batasan karena mendeklarasikan kursor untuk kueri tertentu. Oleh karena itu, kueri harus kompatibel dengan kursor PostgreSQL. Misalnya, CURSOR API tidak mendukung pernyataan DO atau SHOW.

API ini juga tidak membatasi hasil berdasarkan ukuran atau jumlah baris yang ditampilkan.

Jalankan fungsi execute_parameterized_query(), yang memiliki sintaksis berikut:

SELECT * FROM
parameterized_views.execute_parameterized_query(
    query => SQL_QUERY,
    param_names => ARRAY [PARAMETER_NAMES],
    param_values => ARRAY [PARAMETER_VALUES]
)

Ganti kode berikut:

  • SQL_QUERY: kueri SQL yang klausa FROM-nya merujuk ke satu atau beberapa tampilan aman yang diparameterisasi.
  • PARAMETER_NAMES: daftar nama parameter yang akan diteruskan sebagai string.
  • PARAMETER_VALUES: daftar nilai parameter yang akan diteruskan.
  • Daftar ini harus memiliki ukuran yang sama dengan daftar param_names, dengan urutan nilai yang cocok dengan urutan nama.
  • Jenis pasti nilai disimpulkan dari kueri dan definisi tampilan yang diberi parameter. Konversi jenis dilakukan jika diperlukan dan jika memungkinkan untuk nilai parameter tertentu. Jika terjadi ketidakcocokan jenis, error akan ditampilkan.

Fungsi ini menampilkan tabel objek JSON. Setiap baris dalam tabel setara dengan nilai ROW_TO_JSON() dari baris hasil kueri asli.

Gunakan contoh berikut untuk membuat kueri tampilan aman berparameter:

SELECT * FROM
parameterized_views.execute_parameterized_query(
    query => 'SELECT * FROM secure_checked_items',
    param_names => ARRAY ['app_end_userid'],
    param_values => ARRAY ['40']
)

Penggunaan API ini membatasi ukuran kumpulan hasil berdasarkan ukuran yang dinyatakan dalam kilobyte (kB) hasil dan berdasarkan jumlah baris. Anda dapat mengonfigurasi batas ini dengan menggunakan parameterized_views.json_results_max_size dan parameterized_views.json_results_max_rows.

CURSOR API

API ini memiliki batasan karena mendeklarasikan kursor untuk kueri tertentu. Oleh karena itu, kueri harus kompatibel dengan kursor PostgreSQL. Misalnya, CURSOR API tidak mendukung pernyataan DO atau SHOW.

API ini juga tidak membatasi hasil berdasarkan ukuran atau jumlah baris yang ditampilkan.

Jalankan fungsi execute_parameterized_query(), yang memiliki sintaksis berikut:

SELECT * FROM
parameterized_views.execute_parameterized_query(
    query => SQL_QUERY,
    param_names => ARRAY [PARAMETER_NAMES],
    param_values => ARRAY [PARAMETER_VALUES]
)

Ganti kode berikut:

  • SQL_QUERY: kueri SQL yang klausa FROM-nya merujuk ke satu atau beberapa tampilan aman berparameter.
  • PARAMETER_NAMES: daftar nama parameter yang akan diteruskan sebagai string.
  • PARAMETER_VALUES: daftar nilai parameter yang akan diteruskan.
    • Daftar ini harus berukuran sama dengan daftar param_names, dengan urutan nilai yang cocok dengan urutan nama.
    • Jenis pasti nilai disimpulkan dari kueri dan definisi tampilan berparameter. Konversi jenis dilakukan saat diperlukan dan jika memungkinkan untuk nilai parameter tertentu. Jika terjadi ketidakcocokan jenis, error akan ditampilkan.

Fungsi ini menampilkan tabel objek JSON. Setiap baris dalam tabel setara dengan nilai ROW_TO_JSON() dari baris hasil kueri asli.

Gunakan contoh berikut untuk membuat kueri tampilan aman berparameter:

SELECT * FROM
parameterized_views.execute_parameterized_query(
    query => 'SELECT * FROM secure_checked_items',
    param_names => ARRAY ['app_end_userid'],
    param_values => ARRAY ['40']
)

Penggunaan API ini membatasi ukuran kumpulan hasil berdasarkan ukuran yang dinyatakan dalam kilobyte (kB) hasil dan berdasarkan jumlah baris. Anda dapat mengonfigurasi batas ini dengan menggunakan parameterized_views.json_results_max_size dan parameterized_views.json_results_max_rows.

Pernyataan PREPARE

Gunakan perintah PREPARE .. AS RESTRICTED untuk membuat pernyataan siap pakai yang mereferensikan tampilan berparameter. Pernyataan siap pakai ini mendukung parameter posisional dan menerapkan berbagai batasan saat Anda menjalankannya. Untuk mengetahui informasi selengkapnya, lihat Mekanisme keamanan.

Fitur ini memperluas perintah PREPARE dan EXECUTE untuk mendukung parameter tampilan bernama. Gunakan pernyataan yang telah disiapkan untuk menghindari overhead penguraian, analisis, dan penulisan ulang setiap kali pernyataan dieksekusi, yang dapat menghasilkan peningkatan performa yang signifikan, terutama untuk kueri yang sering dieksekusi atau kompleks. Pernyataan yang disiapkan adalah objek sisi server yang dapat mengoptimalkan performa dengan mengompilasi dan menyimpan pernyataan SQL berparameter sebelumnya untuk dieksekusi nanti.

API ini memiliki batasan karena pernyataan harus diizinkan dalam pernyataan PREPARE, yang berarti hanya pernyataan SELECT dan VALUES yang didukung.

API ini juga tidak membatasi hasil berdasarkan ukuran atau jumlah baris yang ditampilkan.

Untuk membuat pernyataan siap pakai yang mereferensikan tampilan berparameter, jalankan perintah PREPARE .. AS RESTRICTED:

PREPARE pquery (/POSITIONAL_PARAM_TYPES/)
        AS RESTRICTED query % a query that may refer to parameterized views
EXECUTE pquery (/POSITIONAL_PARAM_VALUES/)
      WITH VIEW PARAMETERS (VIEW_PARAM_NAME1 = VIEW_PARAM_VALUE1[, ...]);

Ganti kode berikut:

  • POSITIONAL_PARAM_TYPES: satu atau beberapa parameter posisi yang digunakan dalam kueri RESTRICTED.
  • POSITIONAL_PARAM_VALUES: nilai sebenarnya yang digantikan untuk parameter posisional yang ditentukan dalam pernyataan PREPARE.
  • VIEW_PARAM_NAME: nama parameter yang diharapkan oleh tampilan berparameter yang dirujuk dalam kueri RESTRICTED.
  • VIEW_PARAM_VALUE: nilai sebenarnya yang diteruskan ke parameter viewParamName yang sesuai dari tampilan berparameter.

Untuk menyertakan parameter dalam pernyataan yang disiapkan, Anda memberikan daftar jenis data dalam pernyataan PREPARE. Dalam pernyataan yang Anda siapkan, Anda merujuk ke parameter berdasarkan posisi menggunakan, misalnya, $1 dan $2.

Gunakan perintah EXECUTE .. WITH VIEW PARAMETERS untuk menjalankan pernyataan yang sebelumnya disiapkan dan dibuat menggunakan perintah PREPARE .. AS RESTRICTED. Jika pernyataan PREPARE yang membuat pernyataan menentukan parameter posisional, Anda harus meneruskan kumpulan parameter yang kompatibel ke pernyataan EXECUTE. Anda harus meneruskan parameter tampilan bernama yang diperlukan oleh tampilan berparameter dalam klausa WITH VIEW PARAMETERS.

Gunakan contoh berikut untuk membuat kueri tampilan aman berparameter:

  PREPARE pquery (timestamp) AS RESTRICTED SELECT * FROM secure_checked_items WHERE timestamp > $1;

  EXECUTE pquery (current_date - 1) WITH VIEW PARAMETERS (app_end_userid = 40);
  EXECUTE pquery (current_date - 30) WITH VIEW PARAMETERS (app_end_userid = 40);
  ```

Pembatasan yang diterapkan pada kueri

Berikut adalah daftar kumpulan operasi terbatas untuk kueri yang Anda jalankan menggunakan opsi yang dijelaskan dalam Mengirim kueri ke tampilan aman berparameter:

  • Setiap pemanggilan rekursif API apa pun—execute_parameterized_query atau dengan menggunakan EXECUTE .. WITH VIEW PARAMETERS—dilarang, sehingga hanya nilai yang ditentukan oleh aplikasi yang digunakan. Pembatasan ini juga mencegah kueri digunakan untuk mengakali amplop keamanan kumpulan nilai parameter tertentu.
  • Beberapa ekstensi yang memulai sesi latar belakang baru tidak diizinkan, termasuk ekstensi dblink, pg_cron dan pg_background.
  • Berikut daftar kumpulan konstruksi kueri yang diizinkan dan dibatasi:

    • Pernyataan SELECT hanya baca diizinkan.
    • Pernyataan SHOW hanya baca, pernyataan CALL, dan pernyataan DO diizinkan.
    • Pernyataan DML seperti INSERT, UPDATE dan DELETE tidak diizinkan.
    • Pernyataan DDL seperti CREATE TABLE dan ALTER TABLE tidak diizinkan.
    • Jenis pernyataan lain seperti LOAD, SET, CLUSTER, LOCK, CHECKPOINT, dan EXPLAIN tidak diizinkan.
  • Pernyataan EXPLAIN tidak diizinkan untuk menghindari kemungkinan serangan saluran rahasia menggunakan rencana kueri. Untuk mengetahui informasi selengkapnya, lihat Saluran rahasia.

  • Tampilan aman berparameter menyediakan setelan untuk membantu Anda mengelola resource yang digunakan oleh API untuk membuat kueri tampilan berparameter, seperti parameterized_views.statement_timeout. Untuk mengetahui informasi selengkapnya, lihat Flag AlloyDB untuk PostgreSQL.

Mencantumkan semua tampilan berparameter

Gunakan ekstensi parameterized_views untuk mencantumkan semua tampilan berparameter dalam database menggunakan tampilan all_parameterized_views. Output tampilan ini sama dengan tampilan katalog pg_views, tetapi all_parameterized_views hanya mencantumkan tampilan dengan parameter tampilan bernama.

Untuk mencantumkan tampilan berparameter, gunakan contoh berikut:

postgres=# select * from parameterized_views.all_parameterized_views ;
schemaname |      viewname      | viewowner |                       definition
-----------+--------------------+-----------+---------------------------------------------------------
public     | checked_items_view | postgres  |  SELECT checked_items.bag_id,                          +
           |                    |           |     checked_items."timestamp",                         +
           |                    |           |     checked_items.location                             +
           |                    |           |    FROM checked_items                                  +
           |                    |           |   WHERE (checked_items.customer_id = $@app_end_userid);

Untuk mencantumkan tampilan berparameter di all_parameterized_views, pastikan tampilan berparameter berisi setidaknya satu parameter tampilan bernama dalam definisinya.

Langkah berikutnya