Halaman ini menjelaskan cara menggunakan tampilan aman yang diberi parameter di AlloyDB untuk PostgreSQL, yang memungkinkan Anda membatasi akses data berdasarkan parameter bernama khusus aplikasi, seperti kredensial pengguna aplikasi. Tampilan aman yang diberi parameter meningkatkan keamanan dan kontrol akses dengan memperluas fungsi tampilan PostgreSQL. Tampilan ini juga mengurangi risiko menjalankan kueri yang tidak tepercaya dari aplikasi dengan otomatis menerapkan batasan pada kueri apa pun yang dijalankan.
Untuk mengetahui informasi selengkapnya, lihat Ringkasan tampilan aman yang diberi parameter dan Mengamankan dan mengontrol akses ke data aplikasi menggunakan tampilan aman yang diberi parameter.
Sebelum memulai
Halaman ini mengasumsikan bahwa Anda telah membuat cluster dan instance AlloyDB. Untuk mengetahui informasi selengkapnya, lihat Membuat database.
Sebelum menggunakan tampilan aman yang diberi parameter, Anda harus melakukan hal berikut:
Aktifkan flag database
parameterized_views.enabled, yang memuat library ekstensi yang diperlukan. Anda harus mengaktifkan flag ini, meskipun sebelumnya telah diaktifkan oleh tim AlloyDB. Untuk mengetahui informasi selengkapnya tentang cara mengaktifkan flag database, lihat Mengonfigurasi flag database instance.Gunakan AlloyDB Studio atau psql untuk membuat ekstensi
parameterized_viewsdi database mana pun tempat Anda ingin membuat tampilan yang diberi parameter:-- Requires parameterized_views.enabled set to true CREATE EXTENSION parameterized_views;Saat ekstensi dibuat, skema bernama
parameterized_viewsjuga dibuat oleh sistem sehingga API berada dalam namespace skema tersebut, dan API tidak bertentangan dengan API yang ada.
Membuat tampilan aman yang diberi parameter
Untuk membuat tampilan aman yang diberi parameter, ikuti langkah-langkah berikut:
Jalankan perintah
CREATE VIEWDDL, 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 yang diberi parameter memungkinkan akses ke tiga kolom dari tabel bernama
checked_items. Tampilan membatasi hasil ke baris tempatchecked_items.customer_idcocok 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 umum adalah memeriksa nilai kolom dalam klausaWHEREmenggunakanCOLUMN = $@PARAMETER_NAME. $@PARAMETER_NAMEmenunjukkan parameter tampilan bernama. Nilainya diberikan saat Anda menggunakanexecute_parameterized_queryAPI. 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, serta dapat menggunakan garis bawah (
_). - Karakter berikutnya dapat berupa huruf, garis bawah, atau digit (
0-9). - Parameter tampilan bernama tidak boleh berisi
$. - Parameter tampilan bernama peka huruf besar/kecil. Misalnya,
$@PARAMETER_NAMEditafsirkan berbeda dengan$@parameter_name.
- Buat tampilan menggunakan opsi
Berikan
SELECTpada tampilan kepada pengguna database mana pun yang diizinkan untuk membuat kueri tampilan.Berikan
USAGEpada 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 yang diberi parameter.
Mengonfigurasi keamanan untuk aplikasi Anda
Untuk mengonfigurasi keamanan aplikasi Anda menggunakan tampilan aman yang diberi parameter, ikuti langkah-langkah berikut:
- Buat tampilan yang diberi parameter aman sebagai pengguna administratif. Pengguna ini adalah pengguna database AlloyDB yang melakukan operasi administratif untuk aplikasi, termasuk penyiapan database dan administrasi keamanan.
Buat peran database baru untuk menjalankan kueri terhadap tampilan aman yang diberi parameter. Ini adalah peran database AlloyDB yang digunakan aplikasi untuk terhubung dan login ke database, serta untuk menjalankan kueri terhadap tampilan yang diberi parameter.
- Berikan izin peran baru ke tampilan aman, yang biasanya mencakup hak istimewa
SELECTke tampilan danUSAGEpada skema. - Batasi objek yang dapat diakses oleh peran ini ke kumpulan minimum fungsi dan objek publik yang diperlukan oleh aplikasi. Hindari memberikan akses ke skema dan tabel yang tidak bersifat publik.
- Untuk mengurangi risiko keamanan, cabut akses dari peran ini pada skema atau objek sensitif yang tidak benar-benar diperlukan oleh peran tersebut.
Saat Anda membuat kueri tampilan, aplikasi akan memberikan nilai parameter tampilan yang diperlukan, yang terikat dengan identitas pengguna aplikasi.
Untuk mengetahui informasi selengkapnya, lihat Membuat pengguna database.
- Berikan izin peran baru ke tampilan aman, yang biasanya mencakup hak istimewa
Membuat kueri tampilan aman yang diberi parameter
Untuk membuat kueri tampilan aman yang diberi parameter, gunakan salah satu opsi berikut yang paling mendukung kasus penggunaan Anda:
- Berbasis JSON: Gunakan API ini untuk menjalankan kueri dalam satu kali dan menampilkan baris JSON.
- Berbasis KURSOR: Gunakan API ini jika Anda memiliki kueri yang berjalan lebih lama atau jika Anda memiliki kueri besar dan ingin mengambil hasilnya dalam batch. Fungsi
execute_parameterized_queryyang disediakan oleh ekstensiparameterized_viewsmenerima nama kursor. - Pernyataan
PREPARE EXECUTE: Gunakan ini untuk pernyataan yang disiapkan yang dapat dijalankan beberapa kali dengan nilai parameter yang berbeda.
Untuk membuat kueri tampilan aman yang diberi parameter, Anda menggunakan fungsi execute_parameterized_query() yang disediakan oleh ekstensi parameterized_views.
JSON API
API ini memiliki batasan karena mendeklarasikan kursor untuk kueri yang diberikan. 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 klausaFROM-nya merujuk ke satu atau beberapa tampilan aman yang diberi parameter.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 nilai yang tepat disimpulkan dari kueri dan definisi tampilan yang diberi parameter. Konversi jenis dilakukan jika diperlukan dan jika memungkinkan untuk nilai parameter yang diberikan. Jika terjadi ketidakcocokan jenis, error akan ditampilkan.
- Daftar ini harus memiliki ukuran yang sama dengan daftar
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 yang diberi parameter:
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 menggunakan parameterized_views.json_results_max_size dan parameterized_views.json_results_max_rows.
CURSOR API
Jalankan fungsi execute_parameterized_query(), yang membuat dan menampilkan KURSOR cakupan transaksi yang Anda gunakan untuk mengambil hasil kueri:
SELECT * FROM
parameterized_views.execute_parameterized_query(
query => SQL_QUERY,
cursor_name => CURSOR_NAME,
param_names => ARRAY [PARAMETER_NAMES],
param_values => ARRAY [PARAMETER_VALUES]
)
Ganti kode berikut:
SQL_QUERY: kueri SQL yang klausaFROM-nya merujuk ke satu atau beberapa tampilan aman yang diberi parameter.CURSOR_NAME: nama kursor yang akan dideklarasikan.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 daftarparam_names, dengan urutan nilai yang cocok dengan urutan nama. Jenis nilai yang tepat disimpulkan dari kueri dan definisi tampilan yang diberi parameter. Konversi jenis dilakukan jika diperlukan dan jika memungkinkan untuk nilai parameter yang diberikan. Jika terjadi ketidakcocokan jenis, error akan ditampilkan.
Gunakan contoh berikut untuk membuat kueri tampilan aman yang diberi parameter:
-- start a transaction as the that is the default lifetime of a CURSOR
BEGIN;
-- create a cursor called 'mycursor'
SELECT * FROM parameterized_views.execute_parameterized_query(
query => 'SELECT * FROM secure_checked_items',
cursor_name => 'mycursor'
param_names => ARRAY ['app_end_userid'],
param_values => ARRAY ['40']
);
-- then, to actually fetch the results
FETCH ALL FROM mycursor;
-- end the transaction, which will clean up the cursor
END;
Kursor yang ditampilkan adalah kursor NO SCROLL WITHOUT HOLD. Anda tidak dapat menggunakan kursor untuk mengambil baris secara tidak berurutan, misalnya, dalam arah mundur. Anda tidak dapat menggunakan kursor di luar transaksi yang membuatnya.
Pernyataan PREPARE
Gunakan perintah PREPARE .. AS RESTRICTED untuk membuat pernyataan yang disiapkan yang merujuk ke tampilan yang diberi parameter. Pernyataan yang disiapkan ini mendukung parameter posisi dan menerapkan berbagai batasan saat Anda menjalankannya.
Untuk mengetahui informasi selengkapnya, lihat Mekanisme keamanan.
Fitur ini memperluas PREPARE dan EXECUTE commands untuk mendukung parameter tampilan bernama. Gunakan pernyataan yang disiapkan untuk menghindari overhead penguraian, analisis, dan penulisan ulang setiap kali pernyataan dijalankan, yang dapat menghasilkan peningkatan performa yang signifikan, terutama untuk kueri yang sering dijalankan atau kompleks. Pernyataan yang disiapkan adalah objek sisi server yang dapat mengoptimalkan performa dengan mengompilasi dan menyimpan pernyataan SQL yang diberi parameter untuk dijalankan 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 yang disiapkan yang merujuk ke tampilan yang diberi parameter, 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 kueriRESTRICTED.POSITIONAL_PARAM_VALUES: nilai sebenarnya yang diganti untuk parameter posisi yang ditentukan dalam pernyataanPREPARE.VIEW_PARAM_NAME: nama parameter yang diharapkan oleh tampilan yang diberi parameter yang dirujuk dalam kueriRESTRICTED.VIEW_PARAM_VALUE: nilai sebenarnya yang diteruskan ke parameterviewParamNameyang sesuai dari tampilan yang diberi parameter.
Untuk menyertakan parameter dalam pernyataan yang disiapkan, Anda harus menyediakan 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 disiapkan sebelumnya yang Anda buat menggunakan perintah PREPARE .. AS RESTRICTED.
Jika pernyataan PREPARE yang membuat pernyataan menentukan parameter posisi, Anda harus meneruskan kumpulan parameter yang kompatibel ke pernyataan EXECUTE. Anda harus meneruskan parameter tampilan bernama yang diperlukan oleh tampilan yang diberi parameter dalam klausa WITH VIEW PARAMETERS.
Gunakan contoh berikut untuk membuat kueri tampilan aman yang diberi parameter:
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 yang dibatasi untuk kueri yang Anda jalankan menggunakan opsi yang dijelaskan dalam Membuat kueri tampilan aman yang diberi parameter:
- Setiap pemanggilan rekursif API apa pun—
execute_parameterized_query, atau menggunakanEXECUTE .. WITH VIEW PARAMETERS—dilarang, sehingga hanya nilai yang ditentukan oleh aplikasi yang digunakan. Pembatasan ini juga mencegah kueri digunakan untuk menghindari amplop keamanan dari kumpulan nilai parameter yang diberikan. - Beberapa ekstensi yang memulai sesi latar belakang baru tidak diizinkan, termasuk ekstensi
dblink,pg_cron, danpg_background. - Berikut adalah daftar kumpulan konstruksi kueri yang diizinkan yang dibatasi:
- Pernyataan
SELECThanya baca diizinkan. - Pernyataan
SHOWhanya baca, pernyataanCALL, dan pernyataanDOdiizinkan. - Pernyataan DML seperti
INSERT,UPDATE, danDELETEtidak diizinkan. - Pernyataan DDL seperti
CREATE TABLEdanALTER TABLEtidak diizinkan. - Jenis pernyataan lain seperti
LOAD,SET,CLUSTER,LOCK,CHECKPOINT, danEXPLAINtidak diizinkan.
- Pernyataan
- Pernyataan
EXPLAINtidak diizinkan secara default untuk menghindari kemungkinan serangan saluran tersembunyi menggunakan rencana kueri. Untuk mengetahui informasi selengkapnya, lihat Saluran tersembunyi. Namun, untuk menjalankan pernyataanEXPLAIN, pengguna database mana pun dengan hak istimewa superuser AlloyDB dapat menetapkan GUC tingkat sesiparameterized_views.enable_explainkeon. - Tampilan aman yang diberi parameter menyediakan setelan untuk membantu Anda mengelola resource yang digunakan oleh API untuk membuat kueri tampilan yang diberi parameter, seperti
parameterized_views.statement_timeout. Untuk mengetahui informasi selengkapnya, lihat Flag database yang didukung.
Mencantumkan semua tampilan yang diberi parameter
Gunakan ekstensi parameterized_views untuk mencantumkan semua tampilan yang diberi parameter
dalam database menggunakan tampilan all_parameterized_views. Output
tampilan ini sama dengan pg_views
tampilan katalog, tetapi all_parameterized_views hanya mencantumkan tampilan dengan parameter tampilan bernama.
Untuk mencantumkan tampilan yang diberi parameter, 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 yang diberi parameter di all_parameterized_views, pastikan tampilan yang diberi parameter berisi setidaknya satu parameter tampilan bernama dalam definisinya.
Langkah berikutnya
- Pelajari tampilan aman yang diberi parameter.
- Pelajari cara mengamankan dan mengontrol akses ke data aplikasi menggunakan tampilan aman yang diberi parameter.