Keamanan, Role & Hak Akses, SQL Injection, serta Backup
CREATE ROLE dan GRANT/REVOKE dengan prinsip hak akses minimum, mencegah SQL injection, serta backup dan restore dengan pg_dump dan pg_restore.
Analogi: Hak akses itu seperti kunci gedung bertingkat: satpam punya kunci pintu depan, petugas kebersihan punya kunci ruang tertentu, dan hanya direktur yang memegang kunci brankas. SQL injection seperti penyusup yang menyelipkan perintah palsu di kotak saran. Backup seperti fotokopi dokumen penting yang disimpan di lemari lain.
Role: akun pengguna di PostgreSQL
PostgreSQL memakai konsep role (gabungan "user" dan "group"). Setiap orang atau aplikasi yang terhubung memakai satu role dengan hak akses tertentu.
CREATE ROLE kasir LOGIN PASSWORD 'sandi_kuat_123'; -- role yang boleh login
CREATE ROLE tim_laporan; -- role tanpa login, untuk kelompok
GRANT & REVOKE: memberi dan mencabut hak
GRANT SELECT ON buku, kategori TO kasir; -- boleh baca
GRANT SELECT, INSERT ON pesanan, detail_pesanan TO kasir; -- boleh baca & tambah
REVOKE INSERT ON pesanan FROM kasir; -- cabut hak
GRANT tim_laporan TO kasir; -- kasir ikut kelompok tim_laporan
Prinsip hak akses minimum (least privilege): beri hanya hak yang benar-benar diperlukan. Aplikasi web biasa tidak perlu menjadi superuser postgres. Kalau akunnya bocor, kerusakannya terbatas.
| Hak | Artinya |
|---|---|
SELECT | Membaca data |
INSERT / UPDATE / DELETE | Menambah / mengubah / menghapus data |
CREATE | Membuat objek baru |
ALL PRIVILEGES | Semuanya (hindari!) |
SQL Injection: serangan paling terkenal
Misalkan aplikasi menyusun query dengan menempel teks dari pengguna:
"SELECT * FROM pelanggan WHERE email = '" + inputUser + "'"
Penyerang mengetik ' OR '1'='1 sebagai email. Query berubah menjadi:
SELECT * FROM pelanggan WHERE email = '' OR '1'='1' -- selalu benar: SEMUA data bocor!
Lebih parah lagi: '; DROP TABLE pelanggan; --
Aturan wajib: jangan pernah menempel input pengguna langsung ke dalam teks SQL.
Pertahanan: prepared statement / query berparameter
Kirim SQL dan datanya terpisah. Database memperlakukan input hanya sebagai nilai, tidak pernah sebagai perintah:
-- SQL-nya memakai penampung $1, data dikirim terpisah oleh driver
SELECT * FROM pelanggan WHERE email = $1;
Semua framework modern (Laravel, Django, Prisma, node-postgres, dll.) menyediakan fitur ini. Pakailah selalu.
Praktik keamanan lain
- Jangan simpan kata sandi polos. Simpan hash (bcrypt/argon2).
- Batasi koneksi jaringan lewat
pg_hba.confdan firewall (port 5432 jangan terbuka ke seluruh internet). - Gunakan koneksi terenkripsi (SSL/TLS).
- Pisahkan role: satu untuk aplikasi, satu khusus migrasi, satu hanya-baca untuk laporan.
Backup & restore
Database tanpa backup hanya tinggal menunggu hari sial. Alat bawaan PostgreSQL:
# backup satu database ke berkas SQL teks
pg_dump -U postgres bukukita > bukukita.sql
# backup format kustom (terkompresi, bisa dipulihkan selektif)
pg_dump -U postgres -Fc bukukita -f bukukita.dump
# restore dari SQL teks
psql -U postgres -d bukukita_baru -f bukukita.sql
# restore dari format kustom
pg_restore -U postgres -d bukukita_baru bukukita.dump
# backup SEMUA database
pg_dumpall -U postgres > semua.sql
Aturan 3-2-1: simpan 3 salinan data, di 2 jenis media berbeda, dengan 1 salinan di lokasi lain. Dan yang terpenting: uji restore secara berkala. Backup yang tidak pernah dicoba dipulihkan hanyalah harapan.
Perawatan rutin
VACUUM: membersihkan sisa baris lama (PostgreSQL menjalankannya otomatis lewat autovacuum).ANALYZE: memperbarui statistik agar planner memilih rencana query terbaik.
Catatan simulator: perintah akun dan hak akses hanya disimulasikan (tampil OK tanpa memengaruhi data). Pada latihan ini penilai memeriksa apakah perintah GRANT yang kamu tulis sudah tepat.
Kasus nyata: akun khusus laporan dan serangan di kolom pencarian
-- akun analis hanya boleh MEMBACA
CREATE ROLE analis LOGIN PASSWORD 'ganti-dengan-sandi-kuat';
GRANT SELECT ON buku, pesanan, detail_pesanan TO analis;
-- serangan: input pengguna ditempel mentah ke query
-- SELECT * FROM pelanggan WHERE nama = '' OR '1'='1';
-- pembelaan: gunakan prepared statement / parameter binding di aplikasi
-- cadangan rutin dari terminal
pg_dump -U postgres -Fc bukukita > bukukita_2026-10-13.dump
Kesalahan yang sering terjadi
- Memakai akun
postgresuntuk aplikasi. Jika bocor, penyerang menguasai seluruh server. - Menyusun query dengan menggabung string dari input pengguna. Selalu pakai parameter terikat.
- Punya backup yang tidak pernah dicoba dipulihkan. Backup baru terbukti berguna setelah berhasil di-restore.