Scroll untuk baca artikel
DockerPostgresql

Install PostgreSQL dengan Docker Compose

9
×

Install PostgreSQL dengan Docker Compose

Sebarkan artikel ini

Install PostgreSQL dengan Docker Compose

logo postgresql
logo postgresql
65 / 100 Skor SEO

Install PostgreSQL dengan Docker Compose di server Ubuntu/Centos

Langkah – Langkah Install :

  1. Buat folder untuk project Docker

    Misalnya mau simpan project PostgreSQL di /opt/docker/postgres :

    sudo mkdir -p /opt/docker/postgres
  2. Pindah ke folder itu

    cd /opt/docker/postgres
  3. 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.

  4. Buat config folder & file
    Karena kita akan melakukan custum pada file postgresql.conf & pg_hba.confLangkah 1
    sudo 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
  5. 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 '
  6. 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
  7. Jalankan PostgreSQL

    docker compose up -d

     

Langkah – Langkah Create User, password for & DB :

  1. Masuk ke PostgreSQL dengan user Yang Dibuat contoh di atas : usrX9QvP3LmA
    docker exec -it postgres17 psql -U postgres

    docker exec -it postgres17 psql -U usrX9QvP3LmA -d postgres
  2. 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 unik

    echo "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;
  3. 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

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses

Verified by MonsterInsights