PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Mengelola peran dan atribut peran di PostgreSQL


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, sementara CREATE ROLE perintah tidak.
  • SUPERUSER :Mengizinkan peran melewati semua pemeriksaan izin kecuali hak untuk masuk. Hanya SUPERUSER 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 dengan CREATEROLE atribut tidak dapat mengubah SUPERUSER peran tanpa juga memiliki SUPERUSER atribut.
  • REPLICATION :Memungkinkan peran untuk memulai replikasi streaming. Peran dengan atribut ini juga harus memiliki LOGIN atribut.
  • PASSWORD :Menetapkan kata sandi ke peran yang akan digunakan dengan password atau md5 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. Tanpa INHERIT , anggota harus menggunakan SET 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 menyebabkan SET 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. LIMIT yang dikelompokkan di PostgreSQL:tampilkan N baris pertama untuk setiap grup?

  2. Tidak dapat terhubung ke postgres dari host jarak jauh

  3. Menggunakan docker-compose untuk membuat tabel di database postgresql

  4. array_agg untuk Tipe Array

  5. Tulis kerangka data panda cepat ke postgres