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.

Part 24 dari 25 ± 40 menit Gratis

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.

HakArtinya
SELECTMembaca data
INSERT / UPDATE / DELETEMenambah / mengubah / menghapus data
CREATEMembuat objek baru
ALL PRIVILEGESSemuanya (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.conf dan 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 postgres untuk 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.

Praktikkan langsung, gratis

Tulis dan jalankan kode langsung di browser, dapatkan penilaian otomatis. Daftar gratis kapan saja untuk menyimpan progres dan meraih sertifikat.

Coba latihan sekarang, tanpa daftar
Bagikan: WhatsApp Facebook LinkedIn X