Wajibkan SSL, aktifkan SELinux, monitor log, dan gunakan versi PostgreSQL saat ini .
Sisi server
Membutuhkan SSL
Dalam postgresql.conf
set ssl=on
dan pastikan Anda telah menginstal keyfile dan certfile Anda dengan tepat (lihat dokumen dan komentar di postgresql.conf
).
Anda mungkin perlu membeli sertifikat dari CA jika Anda ingin dipercaya oleh klien tanpa pengaturan khusus pada klien.
Dalam pg_hba.conf
menggunakan sesuatu seperti:
hostssl theuser thedatabase 1.2.3.4/32 md5
... mungkin dengan "semua" untuk pengguna dan / atau basis data, dan mungkin dengan filter alamat IP sumber yang lebih luas.
Batasi pengguna yang dapat masuk, menolak masuk superuser jarak jauh
Jangan izinkan "semua" untuk pengguna jika memungkinkan; Anda tidak ingin mengizinkan login pengguna super jarak jauh jika Anda dapat menghindari kebutuhan untuk itu.
Batasi hak pengguna
Batasi hak-hak pengguna yang bisa masuk. Jangan beri mereka CREATEDB
atau CREATEUSER
hak.
REVOKE
yang CONNECT
benar dari PUBLIC
pada semua database Anda, kemudian memberikannya kembali kepada hanya pengguna / peran yang harus dapat mengakses bahwa database. (Kelompokkan pengguna ke dalam peran dan berikan hak untuk peran, alih-alih langsung ke pengguna individu).
Pastikan pengguna dengan akses jarak jauh hanya dapat terhubung ke DB yang mereka butuhkan, dan hanya memiliki hak untuk skema, tabel, dan kolom di dalam yang sebenarnya mereka butuhkan. Ini adalah praktik yang baik untuk pengguna lokal juga, itu hanya keamanan yang masuk akal.
Pengaturan klien
Di PgJDBC, berikan parameterssl=true
:
Untuk menginstruksikan driver JDBC untuk mencoba dan membangun koneksi SSL Anda harus menambahkan parameter URL koneksi ssl = true.
... dan instal sertifikat server di truststore klien, atau gunakan sertifikat server yang dipercaya oleh salah satu CA di truststore bawaan Java jika Anda tidak ingin pengguna harus menginstal sertifikat.
Tindakan yang sedang berlangsung
Sekarang pastikan Anda selalu memperbarui PostgreSQL . PostgreSQL hanya memiliki beberapa celah keamanan pra-auth, tapi itu lebih dari nol, jadi tetap up to date. Anda seharusnya tetap, perbaikan bug adalah hal yang baik untuk dimiliki.
Tambahkan firewall di depan jika ada netblock / daerah besar yang Anda tahu tidak perlu Anda akses.
Log koneksi dan pemutusan (lihat postgresql.conf
). Catat kueri jika praktis. Jalankan sistem deteksi intrusi atau fail2ban atau serupa di depan jika praktis. Untuk fail2ban dengan postgres, ada caranya di sini
Pantau file log.
Paranoia bonus
Langkah ekstra untuk dipikirkan ...
Membutuhkan sertifikat klien
Jika Anda ingin, Anda juga dapat menggunakan pg_hba.conf
agar klien menghadirkan sertifikat klien X.509 yang dipercaya oleh server. Tidak perlu menggunakan CA yang sama dengan server cert, Anda dapat melakukan ini dengan homebrew openssl CA. Seorang pengguna JDBC perlu mengimpor sertifikat klien ke Java Keystore mereka dengan keytool
dan mungkin mengkonfigurasi beberapa properti sistem JSSE untuk mengarahkan Java di keystore mereka, sehingga tidak sepenuhnya transparan.
Karantina contohnya
Jika Anda ingin menjadi benar-benar paranoid, jalankan instance untuk klien dalam wadah terpisah / VM, atau setidaknya di bawah akun pengguna yang berbeda, hanya dengan database yang dibutuhkan.
Dengan begitu jika mereka mengkompromikan instance PostgreSQL, mereka tidak akan melanjutkan.
Gunakan SELinux
Aku seharusnya tidak mengatakan ini, tapi ...
Jalankan mesin dengan dukungan SELinux seperti RHEL 6 atau 7, dan jangan matikan SELinux atau setel ke mode permisif . Simpan dalam mode menegakkan.
Gunakan port non-default
Keamanan hanya dengan ketidakjelasan adalah kebodohan. Keamanan yang menggunakan sedikit ketidakjelasan setelah Anda melakukan hal-hal yang masuk akal mungkin tidak akan sakit.
Jalankan Pg pada port non-default untuk membuat hidup sedikit lebih sulit bagi penyerang otomatis.
Letakkan proxy di depan
Anda juga dapat menjalankan PgBouncer atau PgPool-II di depan PostgreSQL, bertindak sebagai kumpulan koneksi dan proksi. Dengan begitu Anda dapat membiarkan proxy menangani SSL, bukan host database asli. Proxy dapat berada di VM atau mesin yang terpisah.
Penggunaan proksi penyatuan koneksi umumnya merupakan ide yang bagus dengan PostgreSQL, kecuali jika aplikasi klien sudah memiliki pool bawaan. Sebagian besar server aplikasi Java, Rails, dll memiliki pooling bawaan. Bahkan kemudian, proxy pooling sisi server pada terburuk tidak berbahaya.