Manajemen akses di server fleksibel Azure Database for PostgreSQL

Mengelola akses ke sumber daya server fleksibel Azure Database for PostgreSQL Anda adalah bagian penting untuk menjaga keamanan dan kepatuhan. Artikel ini menjelaskan cara menggunakan peran PostgreSQL dan fitur Azure untuk mengontrol izin dan menerapkan praktik terbaik untuk manajemen akses.

Manajemen peran

Cara terbaik untuk mengelola Azure Database for PostgreSQL izin akses server fleksibel dalam skala besar adalah dengan menggunakan konsep peran. Peran dapat berupa pengguna database atau sekelompok pengguna database. Peran dapat memiliki objek database dan menetapkan hak istimewa pada objek tersebut ke peran lain untuk mengontrol siapa yang memiliki akses ke objek mana. Anda dapat memberikan keanggotaan suatu peran kepada peran lain, yang memungkinkan peran anggota menggunakan hak istimewa yang ditetapkan untuk peran lain. Azure Database for PostgreSQL server fleksibel memungkinkan Anda memberikan izin langsung kepada pengguna database. Sebagai praktik keamanan yang baik, buat peran dengan serangkaian izin tertentu berdasarkan aplikasi minimum dan persyaratan akses. Tetapkan peran yang sesuai untuk setiap pengguna. Gunakan peran untuk menerapkan model hak istimewa paling sedikit untuk mengakses objek database.

Selain peran bawaan yang dibuat PostgreSQL, server fleksibel Azure Database for PostgreSQL mencakup tiga peran default. Anda dapat melihat peran ini dengan menjalankan perintah berikut:

SELECT rolname FROM pg_roles;

Perannya adalah:

  • azure_pg_admin
  • azuresu
  • peran administrator

Saat Anda membuat server fleksibel Azure Database for PostgreSQL, Anda memberikan kredensial untuk peran administrator. Gunakan peran administrator ini untuk membuat lebih banyak peran PostgreSQL.

Misalnya, Anda dapat membuat pengguna atau peran bernama demouser.

CREATE USER demouser PASSWORD password123;

Jangan gunakan peran administrator untuk aplikasi.

Di lingkungan PaaS berbasis cloud, akses ke akun superuser Azure Database for PostgreSQL dibatasi untuk mengontrol operasi sarana hanya oleh operator cloud. Oleh karena itu, akun azure_pg_admin berfungsi sebagai akun pseudo-superuser. Peran administrator Anda merupakan anggota dari peran azure_pg_admin. Namun, akun admin server bukan bagian dari peran azuresu, yang memiliki hak istimewa superuser dan digunakan untuk melakukan operasi control plane. Karena layanan ini adalah layanan PaaS terkelola, hanya Microsoft yang merupakan bagian dari peran superuser.

Anda dapat secara berkala mengaudit daftar peran di server Anda.

Misalnya, Anda dapat menyambungkan dengan menggunakan psql klien dan mengkueri pg_roles tabel, yang mencantumkan semua peran bersama dengan hak istimewa seperti membuat peran lain, membuat database, replikasi, dan banyak lagi.

select * from pg_roles where rolname='demouser';
-[ RECORD 1 ]--+---------
rolname        | demouser
rolsuper       | f
rolinherit     | t
rolcreaterole  | f
rolcreatedb    | f
rolcanlogin    | f
rolreplication | f
rolconnlimit   | -1
rolpassword    | ********
rolvaliduntil  |
rolbypassrls   | f
rolconfig      |
oid            | 24827

Penting

Baru-baru ini, Azure Database for PostgreSQL mengaktifkan kemampuan untuk membuat perintah CAST. Untuk menjalankan CREATE pernyataan CAST, pengguna harus menjadi anggota grup azure_pg_admin . Saat ini, Anda tidak dapat menghapus CAST setelah membuatnya.

Azure Database for PostgreSQL hanya mendukung perintah CAST yang menggunakan opsi WITH FUNCTION dan WITH INOUT. Opsi WITHOUT FUNCTION tidak didukung.

Pencatatan audit di Azure Database for PostgreSQL juga tersedia di Azure Database for PostgreSQL untuk melacak aktivitas di basis data Anda.

Mengontrol akses skema

Database yang baru dibuat di Azure Database for PostgreSQL menyertakan serangkaian hak istimewa default dalam skema publik database yang memberi semua pengguna database dan peran kemampuan untuk membuat objek. Untuk membatasi akses pengguna aplikasi dengan lebih baik ke database yang Anda buat di server fleksibel Azure Database for PostgreSQL Anda, pertimbangkan untuk mencabut hak istimewa publik default ini. Setelah mencabut hak istimewa ini, berikan hak istimewa tertentu kepada pengguna database secara lebih terperinci. Contohnya:

  • Cabut hak akses untuk membuat pada skema public dari peran public untuk mencegah pengguna basis data aplikasi membuat objek di skema publik.

    REVOKE CREATE ON SCHEMA public FROM PUBLIC;
    
  • Buat database baru.

    CREATE DATABASE Test_db;
    
  • Cabut semua hak istimewa dari skema PUBLIK pada database baru ini.

    REVOKE ALL ON DATABASE Test_db FROM PUBLIC;
    
  • Buat peran kustom untuk pengguna database aplikasi.

    CREATE ROLE Test_db_user;
    
  • Beri pengguna database dengan peran ini kemampuan untuk menyambungkan ke database.

    GRANT CONNECT ON DATABASE Test_db TO Test_db_user;
    GRANT ALL PRIVILEGES ON DATABASE Test_db TO Test_db_user;
    
  • Buat pengguna database.

    CREATE USER user1 PASSWORD 'Password_to_change'
    
  • Berikan peran tersebut, beserta hak istimewa CONNECT dan SELECT-nya, kepada pengguna.

    GRANT Test_db_user TO user1;
    

Dalam contoh ini, pengguna1 dapat terhubung dan memiliki semua hak istimewa dalam database pengujian Test_db, tetapi tidak ada database lain di server. Alih-alih memberikan pengguna atau peran ini SEMUA HAK ISTIMEWA pada database tersebut dan objeknya, pertimbangkan untuk memberikan izin yang lebih selektif, seperti SELECT, , INSERTEXECUTE, dan lainnya. Untuk informasi selengkapnya tentang hak istimewa dalam database PostgreSQL, lihat perintah GRANT dan REVOKE di dokumen PostgreSQL.

Perubahan kepemilikan skema publik di Azure Database for PostgreSQL

Di PostgreSQL 15 dan yang lebih baru, kepemilikan skema publik berubah menjadi peran baru pg_database_owner , yang memungkinkan pemilik database untuk mengontrolnya. Untuk informasi selengkapnya, lihat catatan rilis PostgreSQL. Namun, di Azure Database for PostgreSQL, perubahan ini tidak berlaku. Skema publik dimiliki oleh peran azure_pg_admin di semua versi PostgreSQL yang didukung. Perilaku layanan terkelola ini memberikan keamanan dan konsistensi.

Perubahan pada PostgreSQL 16 dengan keamanan berbasis peran

Di PostgreSQL, peran database dapat memiliki banyak atribut yang menentukan hak istimewanya. Salah satu atribut tersebut adalah atribut CREATEROLE, yang penting untuk manajemen database PostgreSQL pengguna dan peran. Di PostgreSQL 16, perubahan signifikan diperkenalkan pada atribut ini.

Di PostgreSQL 16, pengguna dengan atribut CREATEROLE tidak lagi memiliki kemampuan untuk membagikan keanggotaan dalam peran apa pun kepada siapa pun. Sebaliknya, seperti pengguna lain tanpa atribut ini, mereka hanya dapat membagikan keanggotaan dalam peran yang mereka miliki ADMIN OPTION. Selain itu, di PostgreSQL 16, atribut CREATEROLE masih memungkinkan nonsuperuser kemampuan untuk memprovisikan pengguna baru. Namun, mereka hanya dapat menjatuhkan pengguna yang mereka buat sendiri. Upaya untuk menghapus pengguna mengakibatkan error jika pengguna tersebut tidak dibuat oleh pengguna yang memiliki atribut CREATEROLE.

PostgreSQL 16 juga memperkenalkan peran bawaan baru dan yang ditingkatkan. Peran pg_create_subscription memungkinkan superuser untuk membuat langganan.

Di server Azure Database for PostgreSQL Fleksibel, peran azure_pg_admin adalah peran yang dikelola sistem, dibatasi dan tidak dapat dimodifikasi oleh pengguna. Mencoba mengubahnya, seperti memberikan peran lain padanya, mengakibatkan kesalahan seperti:


  GRANT <db_user> TO azure_pg_admin;
ERROR: permission denied to alter restricted role "azure_pg_admin"

Kesalahan ini adalah perlindungan bawaan untuk mencegah perubahan pada peran administratif penting. Jika Anda perlu menetapkan hak istimewa atau peran, pertimbangkan untuk membuat peran kustom sebagai gantinya dan memberikan izin yang diperlukan untuk peran tersebut.

Kontrol yang ditingkatkan untuk azure_pg_admin

Di PostgreSQL 16, struktur hierarki peran yang ketat diterapkan untuk pengguna dengan hak istimewa CREATEROLE , khususnya terkait dengan peran pemberian. Untuk meningkatkan fleksibilitas administratif dan mengatasi batasan yang diperkenalkan di PostgreSQL 16, Azure Database for PostgreSQL meningkatkan kemampuan peran azure_pg_admin di semua versi PostgreSQL. Dengan pembaruan ini, anggota peran azure_pg_admin dapat mengelola peran dan mengakses objek yang dimiliki oleh peran yang tidak terbatas, bahkan jika peran tersebut juga merupakan anggota azure_pg_admin. Peningkatan ini memastikan bahwa pengguna administratif mempertahankan kontrol yang konsisten dan komprehensif atas peran dan manajemen izin, memberikan pengalaman yang mulus dan andal tanpa memerlukan akses superuser.

Keamanan tingkat baris

Keamanan tingkat baris (RLS) adalah fitur keamanan Azure Database for PostgreSQL yang memungkinkan administrator database menentukan kebijakan yang mengontrol bagaimana baris tertentu data ditampilkan dan beroperasi untuk satu atau beberapa peran. Keamanan tingkat baris menambahkan filter tambahan ke tabel database Azure Database for PostgreSQL. Saat pengguna mencoba melakukan suatu tindakan pada tabel, filter ini diterapkan sebelum kriteria kueri atau pemfilteran lainnya diterapkan, dan data akan dipersempit atau ditolak sesuai dengan kebijakan keamanan Anda. Anda dapat membuat kebijakan keamanan tingkat baris untuk perintah tertentu seperti SELECT, , INSERT, UPDATEdan DELETE, atau menentukannya untuk semua perintah. Kasus penggunaan untuk keamanan tingkat baris termasuk implementasi yang mematuhi PCI, lingkungan rahasia, dan hosting bersama atau aplikasi multipenyewa.

Hanya pengguna dengan SET ROW SECURITY hak yang dapat menerapkan hak keamanan baris ke tabel. Pemilik tabel dapat mengatur keamanan baris pada tabel. Seperti OVERRIDE ROW SECURITY, hak ini saat ini adalah hak implisit. Keamanan tingkat baris tidak menggantikan izin GRANT yang sudah ada. Ini menambahkan tingkat kontrol yang lebih halus. Misalnya, pengaturan ROW SECURITY FOR SELECT untuk mengizinkan pengguna tertentu mengakses baris hanya memberikan akses pengguna tersebut jika pengguna juga memiliki SELECT hak istimewa pada kolom atau tabel yang dimaksud.

Contoh berikut menunjukkan cara membuat kebijakan yang memastikan hanya anggota peranmanajer yang dibuat khusus yang hanya dapat mengakses baris untuk akun tertentu. Kode dalam contoh berikut dibagikan dalam dokumentasi PostgreSQL.

CREATE TABLE accounts (manager text, company text, contact_email text);

ALTER TABLE accounts ENABLE ROW LEVEL SECURITY;

CREATE POLICY account_managers ON accounts TO managers
  USING (manager = current_user);

Klausul USING secara implisit menambahkan klausul WITH CHECK, memastikan bahwa anggota peran manajer tidak dapat melakukan operasi SELECT, DELETE, atau UPDATE pada baris yang dimiliki manajer lain, dan tidak dapat INSERT baris baru yang dimiliki manajer lain.

Anda dapat menghapus kebijakan keamanan baris dengan menggunakan perintah DROP POLICY, seperti yang ditunjukkan dalam contoh ini:

DROP POLICY account_managers ON accounts;

Meskipun Anda mungkin menghapus kebijakan tersebut, pengelola peran tetap tidak dapat melihat data apa pun yang dimiliki manajer lain. Pembatasan ini ada karena kebijakan keamanan tingkat baris masih diaktifkan pada tabel akun. Jika keamanan tingkat baris diaktifkan secara default, PostgreSQL menggunakan kebijakan penolakan default.

Anda dapat menonaktifkan keamanan tingkat baris, seperti yang ditunjukkan dalam contoh berikut:

ALTER TABLE accounts DISABLE ROW LEVEL SECURITY;

Mengabaikan keamanan tingkat baris

PostgreSQL memiliki izin BYPASSRLS dan NOBYPASSRLS , yang dapat Anda tetapkan ke peran. NOBYPASSRLS ditetapkan secara default. Dengan server yang baru diprovisikan di Azure Database for PostgreSQL, hak istimewa untuk melewati keamanan tingkat baris (BYPASSRLS) diterapkan sebagai berikut:

  • Untuk server postgres 16 dan versi yang lebih baru, kami mengikuti perilaku PostgreSQL 16 standar. Pengguna nonadministratif yang dibuat oleh peran administrator azure_pg_admin memungkinkan Anda membuat peran dengan atribut ATAU hak istimewa BYPASSRLS seperlunya.

  • Untuk Postgres 15 dan server versi sebelumnya, Anda dapat menggunakan pengguna azure_pg_admin untuk melakukan tugas administratif yang memerlukan hak istimewa BYPASSRLS. Namun, Anda tidak dapat membuat pengguna nonadmin dengan hak istimewa BypassRLS, karena peran administrator tidak memiliki hak istimewa superuser, seperti umum dalam layanan PaaS PostgreSQL berbasis cloud.