Role dan izin

Mengelola pengguna basis data dengan CREATE ROLE serta memberi hak akses melalui GRANT dan REVOKE.

Daftar isi

Topik ini membuka modul administrasi dengan role dan izin, yaitu identitas di sisi server beserta hak akses yang diberikan melalui GRANT dan dicabut melalui REVOKE. Role menutupi dua kebutuhan sekaligus, yaitu akun yang dapat masuk dan kelompok hak yang dipakai bersama, dan pemisahan keduanya menjadi dasar pengelolaan yang rapi.

Blok penyiapan dataset#

bash
# siapkan ulang tabel dan data contoh untuk topik ini
PGOPTIONS='-c client_min_messages=warning' psql -q -U postgres -d perpustakaan <<'SQL'
DROP TABLE IF EXISTS peminjaman, buku, anggota, kategori CASCADE;
CREATE TABLE kategori (id SERIAL PRIMARY KEY, nama TEXT NOT NULL UNIQUE);
CREATE TABLE anggota (id SERIAL PRIMARY KEY, nama TEXT NOT NULL, email TEXT UNIQUE, bergabung DATE NOT NULL, aktif BOOLEAN NOT NULL DEFAULT TRUE);
CREATE TABLE buku (id SERIAL PRIMARY KEY, judul TEXT NOT NULL, penulis TEXT NOT NULL, tahun INTEGER NOT NULL, kategori_id INTEGER REFERENCES kategori(id));
CREATE TABLE peminjaman (id SERIAL PRIMARY KEY, anggota_id INTEGER NOT NULL REFERENCES anggota(id), buku_id INTEGER NOT NULL REFERENCES buku(id), tanggal_pinjam DATE NOT NULL, tanggal_kembali DATE);
INSERT INTO kategori (nama) VALUES ('Pemrograman'), ('Sains'), ('Sejarah'), ('Fiksi'), ('Statistika');
INSERT INTO anggota (nama, email, bergabung, aktif) VALUES ('Ali Rahman', '[email protected]', '2024-01-15', TRUE), ('Budi Santoso', '[email protected]', '2024-03-02', TRUE), ('Citra Kirana', '[email protected]', '2024-05-20', FALSE), ('Dewi Lestari', '[email protected]', '2024-08-11', TRUE), ('Eka Pratama', NULL, '2025-01-30', TRUE);
INSERT INTO buku (judul, penulis, tahun, kategori_id) VALUES ('Dasar Basis Data', 'Sari Wulandari', 2021, 1), ('Jaringan Komputer', 'Ahmad Fauzi', 2019, 1), ('Fisika untuk Pemula', 'Rina Marlina', 2020, 2), ('Kimia Organik', 'Rina Marlina', 2022, 2), ('Sejarah Nusantara', 'Bambang Wijaya', 2018, 3), ('Cerita Kota Lama', 'Nur Aisyah', 2023, 4), ('Statistika Terapan', 'Sari Wulandari', 2022, 5), ('Algoritma dan Struktur Data', 'Ahmad Fauzi', 2021, 1);
INSERT INTO peminjaman (anggota_id, buku_id, tanggal_pinjam, tanggal_kembali) VALUES (1, 1, '2025-03-01', '2025-03-15'), (1, 7, '2025-03-05', '2025-03-20'), (2, 3, '2025-03-10', NULL), (3, 5, '2025-02-20', '2025-03-01'), (2, 1, '2025-04-02', NULL), (4, 6, '2025-04-07', NULL), (5, 8, '2025-04-09', '2025-04-25'), (4, 2, '2025-05-01', NULL);
DROP ROLE IF EXISTS pembaca;
CREATE ROLE pembaca LOGIN PASSWORD 'kata-sandi-belajar';
SQL

Role pembaca dibuat dengan hak masuk dan kata sandi latihan, sedangkan DROP ROLE IF EXISTS di awal menjaga blok tetap aman diulang. Aturan kata sandi nyata ditetapkan pada konfigurasi autentikasi server, dan topik ini cukup memakai nilai latihan yang ringan.

GRANT dan pembacaan dengan role baru#

GRANT memberi hak pada objek tertentu, dan SET ROLE memindahkan sesi untuk bertindak sebagai role lain tanpa memutus koneksi. Blok berikut memberi hak baca pada tabel anggota, lalu membaca dan menulis sebagai role pembaca.

bash
# hak baca diberikan, penulisan ditolak
psql -U postgres -d perpustakaan <<'SQL'
GRANT SELECT ON anggota TO pembaca;
SET ROLE pembaca;
SELECT COUNT(*) AS terlihat FROM anggota;
INSERT INTO anggota (nama, email, bergabung) VALUES ('Tamu', '[email protected]', '2025-08-01');
RESET ROLE;
SQL
text Keluaran
GRANT
SET
 terlihat
----------
        5
(1 row)

ERROR:  permission denied for table anggota
RESET

SELECT sebagai pembaca berhasil dengan jumlah baris yang sah, sedangkan INSERT ditolak dengan pesan izin yang kurang, dan RESET ROLE kembali ke role pemilik sesi. Penolakan itu adalah perilaku yang benar, dan keputusan desainnya jelas, yaitu aplikasi pembaca tidak pernah diberi hak menulis sebelum butuh.

Role kelompok dan keanggotaan#

Role tanpa hak masuk berfungsi sebagai kelompok, dan hak akses diberikan pada kelompoknya alih-alih ke setiap akun. Blok berikut membentuk kelompok baca, memindahkan hak kepadanya, dan menjadikan pembaca anggotanya.

bash
# kelompok hak dengan keanggotaan
PGOPTIONS='-c client_min_messages=warning' psql -U postgres -d perpustakaan <<'SQL'
DROP ROLE IF EXISTS kelompok_baca;
CREATE ROLE kelompok_baca NOLOGIN;
GRANT SELECT ON buku, kategori TO kelompok_baca;
GRANT kelompok_baca TO pembaca;
SET ROLE pembaca;
SELECT COUNT(*) AS buku_terlihat FROM buku;
RESET ROLE;
REVOKE SELECT ON anggota FROM pembaca;
REVOKE kelompok_baca FROM pembaca;
DROP ROLE pembaca;
DROP ROLE kelompok_baca;
SQL
text Keluaran
DROP ROLE
CREATE ROLE
GRANT
GRANT ROLE
SET
 buku_terlihat
---------------
             8
(1 row)

RESET
REVOKE
REVOKE ROLE
DROP ROLE
ERROR:  role "kelompok_baca" cannot be dropped because some objects depend on it
DETAIL:  privileges for table kategori
privileges for table buku

Hak pada dua tabel diberikan sekali pada kelompoknya, dan pembaca mewarisinya melalui keanggotaan tanpa GRANT kedua. Pengelolaan yang sehat mengalokasikan hak pada kelompok berdasarkan peran kerja, sedangkan akun manusia dan aplikasi hanya diberi keanggotaan, sehingga perubahan hak berarti satu pernyataan pada kelompoknya.

REVOKE dan prinsip hak terkecil#

REVOKE mencabut hak yang diberikan, dan audit hak dilakukan dengan membaca pg_roles untuk role serta information_schema.role_table_grants untuk hak per tabel. Prinsip yang menopang semuanya adalah hak terkecil, yaitu memberi apa yang dipakai sekarang, bukan apa yang mungkin dipakai kelak.

Kebiasaan yang menyertai adalah memisahkan role pemilik skema dari role aplikasi, karena pemilik mewarisi hak penuh atas objeknya, sedangkan aplikasi cukup dengan INSERT, SELECT, dan UPDATE pada tabel yang benar-benar disentuhnya. Perubahan skema tetap menjadi wilayah pemiliknya, dan aplikasi yang dikompromikan tidak menuliskan skema.

Kesalahan umum#

Kesalahan pertama adalah aplikasi yang tersambung sebagai superuser atau pemilik skema, sehingga seluruh pagar izin melewati dirinya, dan role aplikasi yang haknya terkecil menjadi bawaan yang disarankan. Kesalahan kedua adalah membuat role tanpa LOGIN lalu mengira bisa dipakai masuk, atau sebaliknya memberi LOGIN pada role kelompok, keduanya kebingungan yang ditegaskan dokumentasi role.

Kesalahan ketiga adalah mengelola hak per akun tanpa kelompok, sehingga perubahan peran kerja menuntut GRANT dan REVOKE berulang pada setiap akunnya. Kesalahan keempat adalah mencabut hak dari role pemilik objek, yang tidak berpengaruh seperti harapan karena pemiliknya selalu memegang hak penuh, dan pemisahan pemilik serta pengguna menjadi penangkalnya.

Ringkasan#

  • CREATE ROLE membentuk identitas server, dengan LOGIN untuk akun masuk dan NOLOGIN untuk kelompok hak.
  • GRANT memberi hak per objek, SET ROLE memeriksa perilakunya dari sudut pandang role lain, dan REVOKE mencabutnya.
  • Hak dialokasikan pada role kelompok berdasarkan peran kerja, dan akun hanya menerima keanggotaan.
  • Prinsip hak terkecil memisahkan role pemilik skema dari role aplikasi agar kompromi aplikasi tidak menyentuh skema.

Referensi#