Dokumen ini menjelaskan cara menggunakan tampilan aman berparameter di AlloyDB untuk PostgreSQL, yang memungkinkan Anda 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 menerapkan sejumlah batasan secara otomatis pada kueri yang dieksekusi.
Untuk informasi selengkapnya, lihat ringkasan tampilan aman berparameter dan tutorial tampilan aman berparameter.
Sebelum memulai
Dokumen ini mengasumsikan bahwa Anda telah membuat cluster dan instance AlloyDB. Untuk mengetahui informasi selengkapnya, lihat Membuat database.
Sebelum dapat menggunakan tampilan aman berparameter, Anda harus melakukan hal berikut:
Minta akses ke tampilan aman berparameter dan tunggu hingga Anda menerima konfirmasi pengaktifan sebelum memulai.
Tunggu tim AlloyDB mengaktifkan tanda database
parameterized_views.enabled
, yang memuat library ekstensi yang diperlukan. Flag database ini harus diaktifkan sebelum Anda dapat memulai.Setelah tim AlloyDB mengaktifkan flag database
parameterized_views.enabled
, database Anda akan dimulai ulang agar perubahan ini diterapkan.Gunakan AlloyDB Studio atau psql untuk membuat ekstensi
parameterized_views
di database mana pun tempat tampilan berparameter dibuat:-- Requires parameterized_views.enabled set to true CREATE EXTENSION parameterized_views;
Saat ekstensi dibuat, skema bernama
parameterized_views
juga dibuat oleh sistem sehingga API berada dalam namespace skema tersebut, dan agar API tidak bertentangan dengan API yang ada.
Membuat tampilan aman berparameter
Untuk membuat tampilan aman berparameter, ikuti langkah-langkah berikut:
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;
Pada contoh sebelumnya, tampilan aman berparameter memungkinkan akses ke tiga kolom dari tabel bernama
/users/checked_items/
. Tampilan membatasi hasil ke baris tempat/users.id/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 menggunakan
sintaksis
$@PARAMETER_NAME
dalam klausaWHERE
. Kasus penggunaan yang umum adalah memeriksa nilai kolom menggunakanWHERE COLUMN = $@PARAMETER_NAME
. $@PARAMETER_NAME
menunjukkan parameter tampilan yang telah diberi nama. Nilainya diberikan saat Anda menggunakanexecute_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, serta 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 dari$@parameter_name
.
- Buat tampilan menggunakan opsi
Berikan
SELECT
pada tampilan kepada pengguna database yang diizinkan untuk mengkueri tampilan.Berikan
USAGE
pada skema yang berisi tabel yang ditentukan dalam tampilan ke pengguna database 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 menggunakan tampilan aman berparameter, ikuti langkah-langkah berikut:
- Buat tampilan berparameter yang 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 berparameter. Ini adalah peran database AlloyDB yang digunakan aplikasi untuk terhubung dan login ke database, serta untuk menjalankan kueri terhadap tampilan berparameter.
- Berikan izin peran baru ke tampilan aman, yang
biasanya mencakup hak istimewa
SELECT
ke tampilan danUSAGE
pada skema. - Batasi objek yang dapat diakses oleh peran ini ke kumpulan fungsi dan objek publik minimum yang diperlukan oleh aplikasi. Hindari memberikan akses ke skema dan tabel yang tidak bersifat publik.
Saat Anda membuat kueri tampilan, aplikasi akan memberikan nilai parameter tampilan yang diperlukan, yang terikat dengan identitas pengguna aplikasi.
Untuk informasi selengkapnya, lihat Membuat pengguna database.
- Berikan izin peran baru ke tampilan aman, yang
biasanya mencakup hak istimewa
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 dalam satu kali dan menampilkan baris JSON.
- Berbasis CURSOR: 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_query
yang disediakan oleh ekstensiparameterized_views
menerima nama kursor. - Pernyataan
PREPARE EXECUTE
: Gunakan ini untuk pernyataan yang disiapkan yang dapat dijalankan beberapa kali dengan parameter value 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. Akibatnya, 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 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 nilai yang tepat disimpulkan dari kueri dan definisi tampilan berparameter. Konversi jenis dilakukan jika diperlukan dan jika memungkinkan untuk nilai parameter yang diberikan. Jika terjadi ketidakcocokan jenis, error akan ditampilkan.
- Daftar ini harus berukuran 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 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 set hasil berdasarkan ukuran yang dinyatakan dalam kilobyte (kB) hasil dan 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
CURSOR 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 berparameter.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 berukuran sama dengan daftarparam_names
, dengan urutan nilai yang cocok dengan urutan nama. Jenis nilai yang tepat diinferensi dari kueri dan definisi tampilan berparameter. 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 berparameter:
-- 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 non-sekuensial, 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 mereferensikan tampilan berparameter. Pernyataan yang disiapkan ini mendukung
parameter posisi dan menerapkan berbagai batasan saat Anda mengeksekusinya.
Untuk informasi selengkapnya, lihat Mekanisme keamanan.
Fitur ini memperluas
PREPARE
dan EXECUTE commands
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 terlebih dahulu 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 yang disiapkan 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 kueriRESTRICTED
.POSITIONAL_PARAM_VALUES
: nilai sebenarnya yang diganti untuk parameter posisional yang ditentukan dalam pernyataanPREPARE
.VIEW_PARAM_NAME
: nama parameter yang diharapkan oleh tampilan berparameter yang dirujuk dalam kueriRESTRICTED
.VIEW_PARAM_VALUE
: nilai sebenarnya yang diteruskan ke parameterviewParamName
yang sesuai dari tampilan berparameter.
Untuk menyertakan parameter dalam pernyataan yang disiapkan, Anda harus menyediakan daftar jenis data
dalam pernyataan PREPARE
. Dalam pernyataan yang Anda siapkan, Anda merujuk
parameter berdasarkan posisi menggunakan, misalnya, $1
dan $2
.
Gunakan perintah EXECUTE .. WITH VIEW PARAMETERS
untuk menjalankan pernyataan yang telah 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 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 yang dibatasi untuk kueri yang Anda jalankan menggunakan opsi yang dijelaskan dalam Mengkueri tampilan aman berparameter:
- Setiap pemanggilan API secara berulang—
execute_parameterized_query
, atau dengan menggunakanEXECUTE .. WITH VIEW PARAMETERS
— dilarang, sehingga hanya nilai yang ditentukan oleh aplikasi yang digunakan. Batasan ini juga mencegah kueri digunakan untuk mengakali amplop keamanan dari kumpulan parameter value tertentu. - 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 dan
dibatasi:
- Pernyataan
SELECT
hanya baca diizinkan. - Pernyataan
SHOW
, pernyataanCALL
, dan pernyataanDO
hanya baca diizinkan. - Pernyataan DML seperti
INSERT
,UPDATE
, danDELETE
tidak diizinkan. - Pernyataan DDL seperti
CREATE TABLE
danALTER TABLE
tidak diizinkan. - Jenis pernyataan lainnya seperti
LOAD
,SET
,CLUSTER
,LOCK
,CHECKPOINT
, danEXPLAIN
tidak diizinkan.
- Pernyataan
- Pernyataan
EXPLAIN
tidak diizinkan untuk menghindari kemungkinan serangan saluran covert menggunakan rencana kueri. Untuk mengetahui informasi selengkapnya, lihat Saluran covert.
Mencantumkan semua tampilan berparameter
Gunakan ekstensi parameterized_views
untuk mencantumkan semua tampilan berparameter
di 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 yang dinamai.
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
- Pelajari tampilan aman berparameter.
- Pelajari cara mengamankan dan mengontrol akses ke data aplikasi menggunakan tampilan aman berparameter.