Pengantar
PostgreSQL menggunakan berbagai mekanisme untuk mengimplementasikan otentikasi, otorisasi, dan kepemilikan objek dalam cluster database. Inti di antaranya adalah konsep peran.
Peran PostgreSQL adalah kombinasi dari ide-ide pengguna dan grup menjadi satu kesatuan yang fleksibel. Mereka adalah persona yang diadopsi pengguna dalam sistem database, adalah entitas di mana sistem otentikasi menerima atau menolak koneksi, dan subjek aturan manajemen hak istimewa dari semua cakupan.
Panduan ini akan membahas apa peran dan bagaimana mengelolanya dalam cluster database PostgreSQL. Lebih khusus lagi, panduan ini akan mencakup manajemen peran yang berkaitan dengan atribut peran. Untuk gambaran umum yang lebih luas tentang bagaimana peran sesuai dengan gambaran yang lebih besar, lihat pengantar panduan otentikasi dan otorisasi. Untuk mempelajari cara mengubah hak istimewa peran pada objek database tertentu, lihat panduan kami tentang pemberian peran.
Apa itu role?
Di PostgreSQL, peran adalah pengelompokan serangkaian kemampuan, izin, dan entitas "milik" tertentu. Alih-alih memiliki konsep yang berbeda dari "pengguna" dan "grup", PostgreSQL menggunakan peran untuk mewakili kedua ide ini. Sebuah peran dapat berhubungan dengan seseorang individu di dunia nyata, atau dapat beroperasi sebagai kelompok dengan akses tertentu yang dapat menjadi anggota peran lain.
Peran adalah titik jangkar dalam PostgreSQL yang menentukan kepada siapa kebijakan otentikasi dan otorisasi berlaku. Setiap kebijakan yang tidak berlaku secara universal memerlukan gagasan tentang identitas untuk menentukan siapa yang harus dibatasi dan siapa yang diizinkan. Di PostgreSQL, identitas ini diwakili oleh peran.
Sistem otentikasi PostgreSQL memiliki sejumlah komponen berbeda, yang masing-masing terkait dengan peran. Agar dapat digunakan untuk koneksi awal ke cluster database, peran harus memiliki LOGIN
terlebih dahulu kumpulan atribut. Aturan otentikasi itu sendiri didefinisikan dalam file konfigurasi berbasis host yang disebut pg_hba.conf
. Setiap aturan mendefinisikan metode otentikasi yang dapat dicakup untuk peran individu. Untuk peran yang dikonfigurasi untuk otentikasi kata sandi harus memiliki atribut kata sandi yang ditetapkan agar sistem dapat memvalidasi kata sandi pengguna yang diberikan.
Dalam hal otorisasi, peran didefinisikan pada tingkat klaster basis data, yang dalam PostgreSQL, berarti bahwa peran tersebut dibagikan di antara basis data. Karena peran menjangkau basis data, sistem otorisasi mengontrol tingkat akses yang dimiliki setiap peran ke setiap entitas basis data. Karena peran dapat mewakili sekelompok orang, ada banyak fleksibilitas dalam bagaimana akses dapat dikonfigurasi.
Peran juga penting untuk konsep kepemilikan objek dalam PostgreSQL. Setiap database dan tabel, misalnya, memiliki tepat satu peran yang dikonfigurasi sebagai pemilik. Selain superusers
, peran pemilik adalah satu-satunya peran yang dapat mengubah atau menghapus objek sebenarnya.
Singkatnya, peran adalah inti dari sebagian besar operasi basis data praktis. Fleksibilitas mereka memungkinkan mereka untuk bertindak baik sebagai pengenal pengguna dan kelas pengguna. Setiap tindakan dalam klaster database diperiksa berdasarkan hak istimewa peran dan keberhasilan setiap koneksi ke klaster database ditentukan oleh peran yang diautentikasi. Penting untuk menguasai manajemen peran dengan baik karena pentingnya dalam banyak operasi inti.
Atribut peran
Atribut peran adalah tanda pada peran itu sendiri yang menentukan beberapa hak istimewa inti yang dimilikinya di tingkat klaster basis data. Ini dapat disetel saat peran pertama kali dibuat, atau diubah kapan saja oleh peran apa pun dengan atribut yang sesuai (SUPERUSER
atau CREATEROLE
dalam hal ini).
Atribut yang dapat diterapkan pada peran meliputi:
LOGIN
:Memungkinkan pengguna untuk awalnya terhubung ke cluster database menggunakan peran ini.CREATE USER
perintah secara otomatis menambahkan atribut ini, sementaraCREATE ROLE
perintah tidak.SUPERUSER
:Mengizinkan peran melewati semua pemeriksaan izin kecuali hak untuk masuk. HanyaSUPERUSER
lainnya role dapat membuat peran dengan atribut ini.CREATEDB
:Memungkinkan peran untuk membuat database baru.CREATEROLE
:Memungkinkan peran untuk membuat, mengubah, dan menghapus peran lain. Atribut ini juga memungkinkan peran untuk menetapkan atau mengubah keanggotaan peran. Pengecualian adalah bahwa peran denganCREATEROLE
atribut tidak dapat mengubahSUPERUSER
peran tanpa juga memilikiSUPERUSER
atribut.REPLICATION
:Memungkinkan peran untuk memulai replikasi streaming. Peran dengan atribut ini juga harus memilikiLOGIN
atribut.PASSWORD
:Menetapkan kata sandi ke peran yang akan digunakan denganpassword
ataumd5
mekanisme otentikasi. Atribut ini menggunakan kata sandi dalam kutipan sebagai argumen langsung setelah kata kunci atribut.INHERIT
:Menentukan apakah peran mewarisi hak istimewa peran yang menjadi anggotanya. TanpaINHERIT
, anggota harus menggunakanSET ROLE
untuk berubah menjadi peran lain untuk mengakses hak eksklusif tersebut. Atribut ini disetel untuk peran baru secara default.
Anda dapat mengetahui lebih lanjut tentang atribut peran dengan melihat dokumentasi PostgreSQL tentang atribut peran dan CREATE ROLE
perintah.
Apa itu superuser
peran?
Seperti disebutkan secara singkat di atas, hak istimewa khusus yang disebut superuser
memungkinkan akses administratif tak terbatas ke cluster database. Ini mirip dengan root
akun di Linux dan sistem operasi mirip Unix, tetapi pada tingkat basis data.
Harus selalu ada setidaknya satu peran dengan superuser
hak istimewa di setiap cluster database. superuser
awal akun dibuat selama proses instalasi. Nama awal superuser
akun dapat bervariasi tergantung pada proses instalasi, tetapi paling sering, akun ini disebut postgres
.
Tidak disarankan untuk melakukan pekerjaan sehari-hari menggunakan akun dengan superuser
hak istimewa, baik karena potensinya untuk tindakan destruktif dan juga untuk meminimalkan kemungkinan membahayakan akun dengan akses luas. Sebagai gantinya, sebagian besar waktu, pengguna harus menggunakan akun yang didedikasikan untuk fungsi tertentu atau objek data yang mereka kerjakan, hanya menggunakan superuser
akun saat diperlukan akses yang lebih kuat.
Memeriksa atribut peran yang ada
Sekarang setelah Anda memiliki gagasan luas tentang atribut peran apa dan jenis hak istimewa apa yang diizinkan, Anda harus mempelajari cara menemukan atribut yang diterapkan ke peran di seluruh PostgreSQL. Bagian ini akan menunjukkan kepada Anda beberapa perintah untuk membantu Anda menemukan atribut yang ditetapkan pada peran secara umum dan pada peran Anda saat ini secara khusus.
Mencantumkan semua peran database dan atributnya
Ada beberapa cara berbeda untuk memeriksa atribut yang diterapkan ke peran di seluruh sistem.
Jika Anda menggunakan psql
klien baris perintah, Anda dapat memanfaatkan beberapa meta-perintah berguna yang memungkinkan Anda mendapatkan informasi atribut peran tanpa kueri.
\du
meta-command menunjukkan semua peran dan atributnya:
\du
List of roles Role name | Attributes | Member of-----------+------------------------------------------------------------+----------- postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
Dalam hal ini, postgres
role adalah peran default dengan superuser
hak istimewa yang dikonfigurasi untuk cluster database ini.
SQL yang setara untuk membuat daftar peran (dapat ditemukan dengan meneruskan -E
atau --echo-hidden
tandai saat memulai psql
) adalah:
SELECT r.rolname, r.rolsuper, r.rolinherit, r.rolcreaterole, r.rolcreatedb, r.rolcanlogin, r.rolconnlimit, r.rolvaliduntil, ARRAY(SELECT b.rolname FROM pg_catalog.pg_auth_members m JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid) WHERE m.member = r.oid) as memberof, r.rolreplication, r.rolbypassrlsFROM pg_catalog.pg_roles rWHERE r.rolname !~ '^pg_'ORDER BY 1;
Kueri serupa yang menyediakan informasi atribut peran (tanpa komponen keanggotaan peran) ada di bawah. Kami menggunakan psql
meta-command \x on
untuk menampilkan hasil secara vertikal agar lebih mudah dibaca di sini:
-- turn on vertical display\x onSELECT * FROM pg_roles WHERE rolname !~ '^pg_';-- turn off vertical display\x off
-[ RECORD 1 ]--+---------rolname | postgresrolsuper | trolinherit | trolcreaterole | trolcreatedb | trolcanlogin | trolreplication | trolconnlimit | -1rolpassword | ********rolvaliduntil | rolbypassrls | trolconfig | oid | 10
Jika Anda hanya tertarik untuk melihat peran mana yang memiliki superuser
atribut, Anda dapat meminta daftar secara eksplisit:
SELECT rolname FROM pg_roles WHERE rolsuper;
rolname---------- postgres(1 row)
Atau, Anda dapat membuat daftar semua pengguna dan superuser
mereka status untuk gambar lebih lengkap:
SELECT usename,usesuper FROM pg_user;
usename | usesuper----------+---------- postgres | t user1 | f(2 rows)
Informasi yang sama dapat diambil menggunakan paradigma "peran" PostgreSQL alih-alih hamparan "pengguna" (terkadang ambigu) dengan kueri yang sedikit lebih panjang ini:
SELECT rolname,rolsuper FROM pg_roles WHERE rolname !~ '^pg_';
rolname | rolsuper----------+---------- postgres | t user1 | f(2 rows)
Mencantumkan atribut Anda sendiri
Jika Anda ingin menemukan atribut peran yang sedang Anda gunakan, Anda dapat dengan mudah memfilter hasilnya.
Saat menggunakan psql
meta-perintah, Anda dapat menggunakan USER
variabel, yang akan diganti dengan peran terhubung saat ini. psql
menggunakan titik dua (:
) untuk menginterpolasi variabel:
\du :USER
List of roles Role name | Attributes | Member of-----------+------------------------------------------------------------+----------- postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
Untuk mendapatkan daftar yang menunjukkan nilai semua atribut peran yang mungkin, Anda dapat menggunakan kueri yang membandingkan nama peran dengan nilai yang dikembalikan oleh CURRENT_ROLE
fungsi PostgreSQL. Sekali lagi, kami menggunakan keluaran vertikal untuk keterbacaan:
-- First, turn on vertical output\x onSELECT * FROM pg_roles WHERE rolename = CURRENT_ROLE;-- Change back to normal output\x off
-[ RECORD 1 ]--+---------rolname | postgresrolsuper | trolinherit | trolcreaterole | trolcreatedb | trolcanlogin | trolreplication | trolconnlimit | -1rolpassword | ********rolvaliduntil |rolbypassrls | trolconfig |oid | 10
Untuk memeriksa apakah peran Anda saat ini memiliki superuser
hak istimewa, Anda dapat mengetik:
SHOW is_superuser;
is_superuser-------------- on(1 row)
Periksa apakah Anda memiliki hak istimewa pengelolaan peran
Untuk membuat, mengubah, atau menghapus peran, Anda harus memiliki superuser
atau CREATEROLE
hak istimewa.
Untuk memeriksa peran mana dalam sistem yang memiliki hak istimewa pengelolaan peran, ketik:
SELECT rolname as "Users who can manage roles" FROM pg_roles WHERE rolsuper OR rolcreaterole;
Users who can manage roles---------------------------- postgres(1 rows)
Jika Anda hanya ingin tahu apakah peran Anda saat ini memiliki hak istimewa pengelolaan peran, Anda dapat menggunakan:
SELECT 'Yes' AS "Can I manage roles?" FROM pg_roles WHERE rolname = :'USER' AND (rolsuper OR rolcreaterole);
Can I manage roles?--------------------- Yes(1 row)
Membuat peran
Setelah memverifikasi bahwa Anda memiliki hak istimewa pengelolaan peran, Anda dapat mulai membuat, mengubah, atau menghapus peran dalam PostgreSQL.
Salah satu opsi untuk menyetel atribut peran adalah mendeklarasikannya pada saat Anda membuat peran. Ini memungkinkan Anda untuk menyetel kondisi awal untuk peran tersebut, tetapi Anda masih dapat mengubahnya setelahnya jika Anda ingin mengubah tingkat akses peran tersebut. Anda dapat menemukan informasi lebih lanjut tentang CREATE ROLE
perintah yang akan kita gunakan untuk membiasakan diri dengan sintaks dasar.
Salah satu cara untuk membuat peran adalah dari baris perintah. PostgreSQL menyertakan createuser
perintah yang akan membuat peran dalam cluster database dengan LOGIN
hak istimewa.
Sintaks umumnya adalah:
createuser <options> <rolename>
Misalnya, untuk membuat peran bernama admin
dengan superuser
hak istimewa saat meminta kata sandi, Anda dapat mengetik:
createuser --superuser admin
Anda kemudian dapat masuk menggunakan admin
akun sesuai dengan metode otentikasi yang diuraikan dalam pg_hba.conf
berkas.
Untuk membuat peran menggunakan SQL
, sintaks umumnya terlihat seperti ini:
CREATE ROLE <role>;
Atribut dapat didefinisikan dengan menentukannya setelah nama peran menggunakan WITH
:
CREATE ROLE <role> WITH <options>;
Misalnya, untuk membuat peran bernama user1
yang bisa login dengan password secretpassword
, Anda dapat mengetik:
CREATE ROLE "user1" WITH LOGIN PASSWORD 'secretpassword';
Alih-alih membuat peran dengan superuser
hak istimewa (Anda juga harus menjadi superuser
untuk berhasil menjalankan perintah ini) yang tidak bisa login (pengguna harus menggunakan SET ROLE
untuk mengubah peran ini), Anda dapat mengetik:
CREATE ROLE "user2" WITH SUPERUSER;
Mengubah peran yang ada
Untuk mengubah atribut role yang ada, Anda dapat menggunakan ALTER ROLE
perintah sebagai gantinya. Seperti pembuatan peran, peran Anda saat ini juga harus memiliki superuser
atau CREATEROLE
hak istimewa. Pengguna yang tidak memiliki hak istimewa tersebut hanya dapat menggunakan ALTER ROLE
perintah untuk mengubah kata sandi mereka sendiri.
Mengubah peran memungkinkan Anda mengubah atribut yang ditetapkan ke peran setelah pembuatan. Atribut yang sama yang disebutkan di bagian pembuatan peran dapat digunakan dengan ALTER ROLE
sintaksis. Satu perbedaan adalah bahwa setiap jenis atribut dapat dinegasikan dengan menambahkan NO
awalan. Misalnya, untuk mengizinkan peran login ke cluster database, Anda dapat memberikan LOGIN
atribut. Untuk menghapus kemampuan itu, Anda akan mengubah peran dengan menentukan NOLOGIN
.
ALTER ROLE
perintah hanya mengubah atribut yang disebutkan secara eksplisit. Dengan kata lain, ALTER ROLE
perintah menentukan perubahan ke atribut, bukan set lengkap atribut baru.
Untuk mengizinkan user2
peran untuk login ke cluster database, Anda dapat mengetik:
ALTER ROLE "user2" WITH LOGIN;
Ingatlah bahwa meskipun ini memungkinkan kemampuan untuk masuk, metode autentikasi yang diizinkan masih dikontrol oleh pg_hba.conf
berkas.
Jika Anda ingin user2
untuk dapat login, membuat peran, dan membuat database sebagai gantinya, Anda dapat menentukan ketiga atribut tersebut, dipisahkan oleh spasi:
ALTER ROLE "user2" WITH LOGIN CREATEROLE CREATEDB;
Untuk mencabut superuser
status dari suatu peran (Anda hanya dapat menjalankan perintah ini menggunakan superuser
lain peran), ketik:
ALTER ROLE "user2" WITH NOSUPERUSER;
Untuk mengubah kata sandi peran, Anda dapat mengetikkan yang berikut (semua peran harus dapat menjalankan perintah ini pada perannya sendiri, terlepas dari CREATEROLE
atau superuser
hak istimewa):
ALTER ROLE <role> WITH PASSWORD '<password>';
Meskipun perintah di atas berfungsi, jika memungkinkan, sebaiknya gunakan psql
meta-perintah untuk mengubah kata sandi. psql
perintah secara otomatis meminta kata sandi dan mengenkripsinya sebelum mengirimnya ke server. Ini membantu menghindari kebocoran data sensitif di log.
Anda dapat mengubah sandi peran dengan psql
dengan mengetik berikut
-- To change your own password\password-- To change the password for another role\password <role>
Anda juga dapat menggunakan ALTER ROLE
perintah untuk mengganti nama peran:
ALTER ROLE <role> RENAME TO <newrole>
Ingatlah bahwa Anda tidak dapat mengganti nama peran sesi Anda saat ini.
Menghapus peran
Menghapus peran yang ada mengikuti pola yang mirip dengan perintah sebelumnya. Sekali lagi, Anda harus memiliki CREATEROLE
atau superuser
hak istimewa untuk menjalankan perintah ini.
Salah satu faktor yang memperumit adalah bahwa peran tidak bisa dihapus jika mereka masih direferensikan oleh objek dalam database. Ini berarti Anda harus menghapus atau mentransfer kepemilikan objek apa pun yang dimiliki peran tersebut. Setelah itu, Anda juga harus mencabut hak istimewa tambahan yang dimiliki peran tersebut pada objek database.
Penjelasan terperinci tentang cara menetapkan kembali dan melepaskan hak istimewa dengan tepat disediakan oleh Erwin Brandstetter di situs Database Administrators Stack Exchange. Proses yang sama digunakan di bawah ini.
Pertama, Anda dapat menetapkan ulang semua objek yang dimiliki peran menggunakan kode REASSIGNED OWNED
memerintah. Misalnya, jika Anda bersiap untuk menghapus user2
peran, Anda dapat menetapkan objeknya ke postgres
peran dengan mengetik:
REASSIGN OWNED BY "user2" TO "postgres";
Sekarang objek dimiliki oleh postgres
, kita bisa menggunakan DROP OWNED
perintah untuk mencabut semua hak istimewa lain yang telah kami berikan pada objek. Perintah ini juga menghapus objek yang kita miliki, tetapi karena kita baru saja mentransfernya ke postgres
peran, user2
role tidak lagi memiliki objek yang dimiliki. Karena itu, perintah hanya akan mencabut hak istimewa tambahan dari peran tersebut:
DROP OWNED BY "user2";
Tanpa DROP OWNED
pintasan di atas, Anda harus menjalankan REVOKE ALL PRIVILEGES
pada setiap objek individu atau jenis objek yang memiliki hak istimewa peran tersebut.
Setelah mencabut semua hak istimewa yang terkait, Anda dapat menghapus peran tersebut dengan mengetik:
DROP ROLE "user2";
Masuk menggunakan psql
Setelah Anda memiliki peran baru yang dikonfigurasi, dan telah mengonfigurasi detail otentikasi menggunakan pg_hba.conf
file, Anda dapat login ke cluster database menggunakan peran baru Anda. psql
klien baris perintah menyediakan cara mudah untuk melakukan ini.
Secara default, psql
mengasumsikan Anda ingin terhubung menggunakan peran yang cocok dengan nama pengguna sistem operasi Anda. Jadi jika Anda masuk ke komputer Anda sebagai john
, psql
akan berasumsi bahwa Anda ingin mencoba terhubung ke database menggunakan peran yang juga disebut john
.
Untuk mengganti perilaku ini, Anda dapat meneruskan -U
atau --username=
pilihan. Misalnya, jika Anda ingin masuk ke peran yang disebut kerry
, Anda dapat mengetik:
psql -U kerry
Keberhasilan psql
perintah akan tergantung pada keberadaan kerry
peran, aksesibilitas server yang Anda coba sambungkan, dan aturan otentikasi yang ditentukan di server.
Mengubah peran yang berbeda selama sesi
Terkadang, Anda mungkin ingin untuk sementara mengadopsi hak istimewa dan identitas peran lain yang dapat Anda akses. Misalnya, ini diperlukan jika Anda ingin mendapatkan hak istimewa dari peran tempat Anda menjadi anggota jika peran Anda saat ini tidak memiliki INHERIT
atribut.
Untuk memahami cara kerjanya, Anda harus mengetahui terminologi yang digunakan PostgreSQL untuk mengkategorikan peran aktif:
- Peran sesi :Peran sesi adalah peran yang Anda gunakan untuk masuk selama koneksi awal Anda ke cluster database PostgreSQL. Ini menetapkan hak istimewa awal Anda dan menentukan akses Anda ke sistem. Peran ini harus memiliki
LOGIN
atribut. - Peran saat ini :Sebaliknya, peran saat ini adalah peran yang Anda perankan saat ini. Hak istimewa yang terkait dengan peran saat ini, baik ditetapkan secara langsung atau diwarisi dari peran lain, menentukan tindakan yang boleh Anda lakukan dan objek yang dapat Anda akses.
Anda dapat melihat sesi Anda dan nilai peran saat ini dengan mengetik:
SELECT SESSION_USER, CURRENT_USER;
current_user | session_user--------------+-------------- postgres | postgres(1 row)
Meskipun satu-satunya cara untuk mengubah peran sesi Anda adalah memulai koneksi baru menggunakan peran yang berbeda, Anda dapat mengubah peran Anda saat ini menggunakan SET ROLE
memerintah. SET ROLE
perintah digunakan untuk sementara bertindak sebagai peran yang berbeda. Perintah juga secara opsional mengambil pengubah berikut:
SESSION
:Pengaturan default. Hal ini menyebabkanSET ROLE
perintah untuk mempengaruhi seluruh sesi database.LOCAL
:Modifier ini akan membuat perintah mengubah role hanya untuk transaksi saat ini.
Untuk mengubah peran saat ini menjadi user2
peran (untuk sisa sesi), ketik:
SET ROLE "user2";
Jika Anda memeriksa sesi Anda dan nilai peran saat ini, Anda akan melihat bahwa nilai peran saat ini telah berubah:
SELECT SESSION_USER, CURRENT_USER;
current_user | session_user--------------+-------------- user2 | postgres(1 row)
Semua tindakan Anda sekarang akan menggunakan user2
peran sebagai konteks mereka.
Untuk mengubah kembali ke peran sesi yang sebelumnya Anda gunakan, Anda dapat mengetik:
SET ROLE NONE;
Alternatif yang mencapai hasil yang sama adalah:
RESET ROLE;
Kesimpulan
Sistem peran, atribut peran, hibah, dan otentikasi PostgreSQL menciptakan sistem fleksibel yang memungkinkan administrator mengelola izin dan akses basis data secara efektif. Panduan ini menjelaskan apa sebenarnya peran itu dan bagaimana peran tersebut mencakup berbagai kasus penggunaan. Ini juga mencakup cara membuat, memodifikasi, dan menghapus peran serta mengelola atribut peran yang menentukan kemampuan globalnya. Memahami cara mengelola identitas ini diperlukan untuk mengamankan database Anda dan memberikan akses yang dapat digunakan ke pengguna sah Anda.