Install PostgreSQL dengan Docker Compose di server Ubuntu/Centos
Langkah – Langkah Install :
-
Buat folder untuk project Docker
Misalnya mau simpan project PostgreSQL di /opt/docker/postgres :
sudo mkdir -p /opt/docker/postgres
-
Pindah ke folder itu
cd /opt/docker/postgres
-
Buat file docker-compose.yml
saya menggunakan vi, bisa juga menggunakan nano tergantung kebiasaan sering pake nano atau vi
vi docker-compose.yml
isi dengan :
version: "3.9" services: postgres: image: postgres:17 container_name: postgres17 restart: always environment: POSTGRES_USER: usrX9QvP3LmA # superuser unik (bukan 'postgres', 'root', 'admin') sesuai standar owasp POSTGRES_PASSWORD: "T!s7@Nf9+qY2%LmVx4r$D1w*Zj8kPn3h" # password unik sesuai standar owasp ports: - "75332:5432" # port non-default di host volumes: - /opt/postgres17/data:/var/lib/postgresql/data - /opt/postgres17/conf/postgresql.conf:/etc/postgresql/postgresql.conf - /opt/postgres17/conf/pg_hba.conf:/etc/postgresql/pg_hba.conf command: ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"] networks: - dbnet security_opt: - no-new-privileges:true read_only: true tmpfs: - /var/run/postgresql - /tmp networks: dbnet: driver: bridge
untuk
– POSTGRES_USER: usrX9QvP3LmA
– POSTGRES_PASSWORD: “T!s7@Nf9+qY2%LmVx4r$D1w*Zj8kPn3h”
– untuk port jangan gunakan port standar misalnya di ganti dari 5432 menjadi 75332 contoh – “75332:5432”Catatan:
-
Superuser bukan postgres default, tapi user yang tidak umum.
-
Data dipisah ke volume /opt/postgres17/data (persisten).
-
Config manual: postgresql.conf & pg_hba.conf.
-
read_only: true → filesystem container readonly kecuali volume & tmpfs.
-
- Buat config folder & file
Karena kita akan melakukan custum pada file postgresql.conf & pg_hba.confLangkah 1sudo mkdir -p /opt/postgres17/{data,conf}
Langkah 2
sudo touch /opt/postgres17/conf/postgresql.conf
Langkah 3
sudo touch /opt/postgres17/conf/pg_hba.conf
Langkah 4
sudo chown -R 999:999 /opt/postgres17
-
Isi config /opt/postgres17/conf/postgresql.conf
vi /opt/postgres17/conf/postgresql.conf
listen_addresses = '*' port = 5432 # tetap 5432 di dalam container, host expose 35432 password_encryption = scram-sha-256 # Logging untuk audit log_connections = on log_disconnections = on log_line_prefix = '%m [%p] %u@%d '
-
Isi config /opt/postgres17/conf/pg_hba.conf
vi /opt/postgres17/conf/pg_hba.conf
# Akses lokal (untuk admin di dalam container) local all all peer
-
Jalankan PostgreSQL
docker compose up -d
Langkah – Langkah Create User, password for & DB :
-
Masuk ke PostgreSQL dengan user Yang Dibuat contoh di atas : usrX9QvP3LmA
docker exec -it postgres17 psql -U postgresdocker exec -it postgres17 psql -U usrX9QvP3LmA -d postgres
-
Buat user, database dan privilage
Langkah 1 buat user dan password
Catatan : agar aman buat user db tidak sama dengan aplikasi dan password
Contoh generate username unikecho "usr_$(openssl rand -hex 5)"
untuk genarate password acak 16 karakter
openssl rand -base64 16
Contoh hasil pembuatan user acak dan password random
CREATE ROLE appusr_x1x9r7 WITH LOGIN PASSWORD 'Tr9@Kp41#Zm814n';
Langkah 2 buat database khusus aplikasi
CREATE DATABASE appdb_x1xfz3 OWNER appusr_x1x9r7;
Langkah 3 batasi schema
\c appdb_x1xfz3
Langkah 4 Pastikan schema public milik user aplikasi
ALTER SCHEMA public OWNER TO appusr_x1x9r7;
Langkah 5 User hanya bisa create di schema public DB-nya sendiri
GRANT USAGE, CREATE ON SCHEMA public TO appusr_x1x9r7;
Langkah 6 Cabut akses default PUBLIC di schema public
REVOKE ALL ON SCHEMA public FROM PUBLIC;
Langkah 7 default privileges supaya semua objek baru otomatis jadi milik user
ALTER DEFAULT PRIVILEGES FOR ROLE appusr_x1x9r7 IN SCHEMA public GRANT ALL ON TABLES TO appusr_x1x9r7;
kemudian jalankan
ALTER DEFAULT PRIVILEGES FOR ROLE appusr_x1x9r7 IN SCHEMA public GRANT ALL ON SEQUENCES TO appusr_x1x9r7;
-
Batasi agar user ini hanya bisa akses DB ini
Edit pg_hba.conf (yang sudah kamu mount ke /opt/postgres17/conf/pg_hba.conf):
vi /opt/postgres17/conf/pg_hba.conf
Tambahkan misalnya kita buat aturan hanya user tersebut hanya bisa akses ip segmen 10.xx.xx.xx sesuaikan segmen yang di pakai d kantor agan ya ada yang pakai 192, ada juga yang 172
# User aplikasi hanya boleh akses DB miliknya dari segmen 10.x.x.x host appdb_x1xfz3 appusr_x1x9r7 10.0.0.0/8 scram-sha-256 # Tolak user aplikasi ke semua DB lain host all appusr_x1x9r7 10.0.0.0/8 reject # Superuser bisa akses semua host all usrX9QvP3LmA 10.0.0.0/8 scram-sha-256 # Izinkan akses lokal untuk maintenance local all all peer
Hasil Akhir
-
Superuser (usrX9QvP3LmA) hanya dipakai untuk administrasi.
-
User aplikasi (appusr_x1x9r7):
-
hanya bisa login ke DB appdb_x1xfz3,
-
tidak bisa akses DB lain (postgres, template1, dsb.),
-
hanya punya akses ke schema public dalam DB-nya,
-
tidak bisa lihat / create objek di DB lain.
-
-
Logging aktif untuk audit.
-
Port non-default untuk mengurangi serangan otomatis.
Sekian tutorial kali ini semoga bermanfaat