Pengantar
Dalam artikel sebelumnya kami memperkenalkan dasar-dasar pemahaman skema PostgreSQL, mekanisme pembuatan dan penghapusan, dan meninjau beberapa kasus penggunaan. Artikel ini akan membahas dasar-dasar tersebut dan menjelajahi hak istimewa pengelolaan yang terkait dengan skema.
Lebih Banyak Terminologi Kelebihan Beban
Tapi ada satu hal awal yang membutuhkan klarifikasi. Ingatlah bahwa dalam artikel sebelumnya, kami membahas kemungkinan titik kebingungan terkait dengan istilah "skema" yang berlebihan. Arti khusus dari istilah tersebut dalam konteks database PostgreSQL berbeda dari cara istilah tersebut umumnya digunakan dalam sistem manajemen database relasional. Kami memiliki kerfuffle terminologi lain yang serupa untuk topik saat ini yang terkait dengan kata "publik".
Setelah pembuatan basis data awal, basis data Postgresql yang baru dibuat menyertakan skema yang telah ditentukan sebelumnya bernama "publik". Ini adalah skema seperti yang lain, tetapi kata yang sama juga digunakan sebagai kata kunci yang menunjukkan "semua pengguna" dalam konteks di mana jika tidak, nama peran yang sebenarnya dapat digunakan, seperti ... tunggu dulu ... manajemen hak istimewa skema . Signifikansi dan dua kegunaan yang berbeda akan dijelaskan dalam contoh di bawah ini.
Keistimewaan Skema Kueri
Sebelum membuat ini konkret dengan kode contoh untuk memberikan dan mencabut hak skema, kita perlu meninjau cara memeriksa hak skema. Menggunakan antarmuka baris perintah psql, kami mencantumkan skema dan hak istimewa terkait dengan perintah \dn+. Untuk database sampledb yang baru dibuat, kami melihat entri ini untuk skema publik:
sampledb=# \dn+
List of schemas
Name | Owner | Access privileges | Description
--------+----------+----------------------+------------------------
public | postgres | postgres=UC/postgres+| standard public schema
| | =UC/postgres |
(1 row)
Dua kolom pertama dan keempat cukup sederhana:seperti yang disebutkan sebelumnya menunjukkan skema yang dibuat secara default bernama "publik", dijelaskan sebagai "skema publik standar", dan dimiliki oleh peran "postgres". (Kepemilikan skema, kecuali ditentukan lain, disetel ke peran yang membuat skema.) Kolom ketiga yang mencantumkan hak akses menarik di sini. Format informasi hak istimewa menyediakan tiga item:penerima hak istimewa, hak istimewa, dan pemberi hak istimewa dalam format “grantee=privileges/grantor” yaitu, di sebelah kiri tanda kesetaraan adalah peran yang menerima hak istimewa, tepat di sebelah kanan tanda kesetaraan adalah sekelompok huruf yang menentukan hak istimewa tertentu, dan terakhir setelah garis miring peran yang diberikan kepada hak istimewa. Mungkin ada beberapa spesifikasi informasi hak istimewa tersebut, yang dicantumkan dipisahkan oleh tanda tambah karena hak istimewa bersifat aditif.
Untuk skema, ada dua kemungkinan hak istimewa yang dapat diberikan secara terpisah:U untuk “USAGE” dan C untuk “CREATE”. Yang pertama diperlukan agar peran memiliki kemampuan untuk mencari objek database seperti tabel dan tampilan yang terdapat dalam skema; hak istimewa terakhir memungkinkan peran untuk membuat objek database dalam skema. Ada huruf lain untuk hak istimewa lain yang berkaitan dengan berbagai jenis objek database, tetapi untuk skema, hanya U dan C yang berlaku.
Jadi untuk menafsirkan daftar hak istimewa di atas, spesifikasi pertama memberi tahu kita bahwa pengguna postgres diberikan pembaruan dan membuat hak istimewa sendiri pada skema publik.
Perhatikan bahwa untuk spesifikasi kedua di atas, string kosong muncul di sebelah kiri tanda sama dengan. Ini adalah bagaimana hak istimewa yang diberikan kepada semua pengguna, melalui kata kunci PUBLIC yang disebutkan sebelumnya, dilambangkan.
Spesifikasi terakhir tentang pemberian penggunaan dan pembuatan hak istimewa pada skema publik untuk semua pengguna dipandang oleh beberapa orang sebagai mungkin bertentangan dengan praktik terbaik prinsip keamanan umum, di mana seseorang mungkin lebih suka memulai dengan akses yang dibatasi secara default, yang mengharuskan administrator basis data untuk secara eksplisit memberikan izin yang sesuai dan hak akses minimal yang diperlukan. Hak istimewa liberal pada skema publik ini sengaja dikonfigurasi dalam sistem sebagai kenyamanan dan untuk kompatibilitas warisan.
Perhatikan juga bahwa kecuali untuk pengaturan hak istimewa permisif, satu-satunya hal khusus tentang skema publik adalah bahwa skema itu juga terdaftar di search_path, seperti yang telah kita bahas di artikel sebelumnya. Ini juga untuk kenyamanan:Konfigurasi search_path dan hak liberal bersama-sama menghasilkan database baru yang dapat digunakan seolah-olah tidak ada konsep seperti skema.
Latar Belakang Historis Skema Publik
Masalah kompatibilitas ini berasal dari sekitar lima belas tahun yang lalu (sebelum PostgreSQLversion 7.3, lih. versi 7.3 catatan rilis) ketika fitur skema bukan bagian dari PostgreSQL. Konfigurasi skema publik dengan hak istimewa liberal dan keberadaan jalur_pencarian saat skema diperkenalkan di versi 7.3 memungkinkan kompatibilitas aplikasi lama, yang tidak mengenali skema, berfungsi tanpa dimodifikasi dengan fitur database yang ditingkatkan.
Jika tidak, tidak ada hal lain yang khusus tentang skema publik:beberapa DBA menghapusnya jika kasus penggunaan mereka tidak memberikan persyaratan untuk itu; yang lain menguncinya dengan mencabut hak istimewa default.
Tunjukkan Kodenya - Mencabut Hak Istimewa
Mari kita buat beberapa kode untuk mengilustrasikan dan memperluas apa yang telah kita diskusikan sejauh ini.
Hak istimewa skema dikelola dengan perintah GRANT dan REVOKE untuk masing-masing menambah dan menarik hak istimewa. Kami akan mencoba beberapa contoh spesifik untuk mengunci skema publik, tetapi sintaks umumnya adalah:
REVOKE [ GRANT OPTION FOR ]
{ { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
ON SCHEMA schema_name [, ...]
FROM { [ GROUP ] role_name | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
Jadi, sebagai contoh penguncian awal, mari kita hapus hak istimewa buat dari skema publik. Perhatikan bahwa dalam contoh ini, kata kecil "publik" mengacu pada skema dan dapat diganti dengan nama skema valid lainnya yang mungkin ada dalam database. Huruf besar “PUBLIK” adalah kata kunci khusus yang menyiratkan “semua pengguna” dan sebagai gantinya dapat diganti dengan nama peran tertentu atau daftar nama peran yang dipisahkan koma untuk kontrol akses yang lebih halus.
sampledb=# REVOKE CREATE ON SCHEMA public FROM PUBLIC;
REVOKE
sampledb=# \dn+
List of schemas
Name | Owner | Access privileges | Description
--------+----------+----------------------+------------------------
public | postgres | postgres=UC/postgres+| standard public schema
| | =U/postgres |
(1 row)
Satu-satunya perbedaan dalam daftar hak skema ini dari yang pertama adalah tidak adanya "C" dalam spesifikasi hak istimewa kedua, memverifikasi perintah kami efektif:pengguna selain pengguna postgres tidak dapat lagi membuat tabel, tampilan, atau objek lain di skema publik.
Perhatikan bahwa perintah di atas mencabut hak istimewa buat dari skema publik adalah mitigasi yang disarankan untuk kerentanan yang baru-baru ini diterbitkan, CVE-2018-1058, yang muncul dari pengaturan hak istimewa default pada skema publik.
Tingkat penguncian lebih lanjut dapat menyebabkan penolakan akses pencarian ke skema sepenuhnya dengan menghapus hak penggunaan:
sampledb=# REVOKE USAGE ON SCHEMA public FROM PUBLIC;
REVOKE
sampledb=# \dn+
List of schemas
Name | Owner | Access privileges | Description
--------+----------+----------------------+------------------------
public | postgres | postgres=UC/postgres | standard public schema
(1 row)
Karena semua hak istimewa skema yang tersedia untuk pengguna non-pemilik telah dicabut, seluruh spesifikasi hak istimewa kedua menghilang dalam cantuman di atas.
Apa yang kami lakukan dengan dua perintah terpisah dapat diselesaikan secara ringkas dengan satu perintah yang menetapkan semua hak istimewa sebagai:
sampledb=# REVOKE ALL PRIVILEGES ON SCHEMA public FROM PUBLIC;
REVOKE
Selain itu, hak istimewa dari pemilik skema juga dapat dicabut:
sampledb=# REVOKE ALL PRIVILEGES ON SCHEMA public FROM postgres;
REVOKE
sampledb=# \dn+
List of schemas
Name | Owner | Access privileges | Description
--------+----------+-------------------+------------------------
public | postgres | | standard public schema
(1 row)
tetapi itu tidak benar-benar mencapai sesuatu yang praktis, karena pemilik skema mempertahankan hak penuh atas skema yang dimiliki terlepas dari penugasan eksplisit hanya berdasarkan kepemilikan.
Penetapan hak istimewa liberal untuk skema publik adalah artefak khusus yang terkait dengan pembuatan basis data awal. Skema yang dibuat selanjutnya dalam database yang ada memang sesuai dengan praktik terbaik untuk memulai tanpa hak istimewa yang ditetapkan. Misalnya, memeriksa hak istimewa skema setelah membuat skema baru bernama "pribadi" menunjukkan bahwa skema baru tidak memiliki hak istimewa:
sampledb=# create schema private;
CREATE SCHEMA
sampledb=# \dn+
List of schemas
Name | Owner | Access privileges | Description
---------+----------+----------------------+------------------------
private | postgres | |
public | postgres | | standard public schema
(2 rows)
Unduh Whitepaper Hari Ini Pengelolaan &Otomatisasi PostgreSQL dengan ClusterControlPelajari tentang apa yang perlu Anda ketahui untuk menerapkan, memantau, mengelola, dan menskalakan PostgreSQLUnduh Whitepaper Tunjukkan Kodenya - Memberikan Hak Istimewa
Bentuk umum dari perintah untuk menambahkan hak istimewa adalah:
GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
ON SCHEMA schema_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
where role_specification can be:
[ GROUP ] role_name
| PUBLIC
| CURRENT_USER
| SESSION_USER
Dengan menggunakan perintah ini, kita dapat, misalnya, mengizinkan semua peran untuk mencari objek database dalam skema pribadi dengan menambahkan hak istimewa penggunaan dengan
sampledb=# GRANT USAGE ON SCHEMA private TO PUBLIC;
GRANT
sampledb=# \dn+
List of schemas
Name | Owner | Access privileges | Description
---------+----------+----------------------+------------------------
private | postgres | postgres=UC/postgres+|
| | =U/postgres |
public | postgres | | standard public schema
(2 rows)
Perhatikan bagaimana hak istimewa UC muncul untuk pemilik postgres sebagai spesifikasi pertama, sekarang kami telah menetapkan hak istimewa selain default ke skema. Spesifikasi kedua, =U/postgres, sesuai dengan perintah GRANT yang baru saja kita panggil sebagai postgres pengguna yang memberikan hak istimewa penggunaan kepada semua pengguna (di mana, ingat, string kosong di kiri tanda sama dengan menyiratkan “semua pengguna”).
Peran tertentu, bernama “user1” misalnya, dapat diberikan hak membuat dan menggunakan untuk skema pribadi dengan:
sampledb=# GRANT ALL PRIVILEGES ON SCHEMA private TO user1;
GRANT
sampledb=# \dn+
List of schemas
Name | Owner | Access privileges | Description
---------+----------+----------------------+------------------------
private | postgres | postgres=UC/postgres+|
| | =U/postgres +|
| | user1=UC/postgres |
public | postgres | | standard public schema
(2 rows)
Kami belum menyebutkan klausa "DENGAN GRANT OPTION" dari formulir perintah umum. Seperti kedengarannya, klausa ini mengizinkan peran yang diberikan kekuatan untuk memberikan hak istimewa yang ditentukan kepada pengguna lain, dan itu dilambangkan dalam daftar hak istimewa dengan tanda bintang yang ditambahkan ke hak istimewa tertentu:
sampledb=# GRANT ALL PRIVILEGES ON SCHEMA private TO user1 WITH GRANT OPTION;
GRANT
sampledb=# \dn+
List of schemas
Name | Owner | Access privileges | Description
---------+----------+----------------------+------------------------
private | postgres | postgres=UC/postgres+|
| | =U/postgres +|
| | user1=U*C*/postgres |
public | postgres | | standard public schema
(2 rows)
Kesimpulan
Ini mengakhiri topik untuk hari ini. Namun, sebagai catatan terakhir, ingatlah bahwa kita hanya membahas hak akses skema. Sementara hak istimewa USAGE memungkinkan pencarian objek database dalam skema, untuk benar-benar mengakses objek untuk operasi tertentu, seperti membaca, menulis, eksekusi, dan lain-lain, peran juga harus memiliki hak yang sesuai untuk operasi tersebut pada objek database tertentu.