Setelah Anda menyelesaikan proses instalasi server database PostgreSQL Anda, Anda perlu melindunginya sebelum masuk ke produksi. Dalam postingan ini, kami akan menunjukkan cara memperkuat keamanan di sekitar database Anda untuk menjaga keamanan dan keamanan data Anda.
1. Kontrol Otentikasi Klien
Saat menginstal PostgreSQL, sebuah file bernama pg_hba.conf dibuat di direktori data cluster database. File ini mengontrol otentikasi klien.
Dari dokumentasi resmi postgresql kita dapat mendefinisikan file pg_hba.conf sebagai kumpulan record, satu per baris, di mana setiap record menentukan tipe koneksi, rentang alamat IP klien (jika relevan untuk tipe koneksi), nama database, nama pengguna, dan metode otentikasi yang akan digunakan untuk koneksi yang cocok dengan parameter ini. Catatan pertama dengan jenis koneksi yang cocok, alamat klien, database yang diminta, dan nama pengguna digunakan untuk melakukan otentikasi.
Jadi format umumnya akan menjadi seperti ini:
# TYPE DATABASE USER ADDRESS METHOD
Contoh konfigurasinya bisa sebagai berikut:
# Allow any user from any host with IP address 192.168.93.x to connect
# to database "postgres" as the same user name that ident reports for
# the connection (typically the operating system user name).
#
# TYPE DATABASE USER ADDRESS METHOD
host postgres all 192.168.93.0/24 ident
# Reject any user from any host with IP address 192.168.94.x to connect
# to database "postgres
# TYPE DATABASE USER ADDRESS METHOD
host postgres all 192.168.94.0/24 reject
Ada banyak kombinasi yang dapat Anda buat untuk menyempurnakan aturan (dokumentasi resmi menjelaskan setiap opsi secara rinci dan memiliki beberapa contoh yang bagus), tetapi ingat untuk menghindari aturan yang terlalu permisif, seperti mengizinkan akses untuk jalur menggunakan DATABASE semua atau ALAMAT 0.0.0.0/0.
Untuk memastikan keamanan, bahkan jika Anda lupa menambahkan aturan, Anda dapat menambahkan baris berikut di bagian bawah:
# TYPE DATABASE USER ADDRESS METHOD
host all all 0.0.0.0/0 reject
Saat file dibaca dari atas ke bawah untuk menemukan aturan yang cocok, dengan cara ini Anda memastikan bahwa untuk mengizinkan izin, Anda perlu menambahkan aturan pencocokan di atas secara eksplisit.
2. Konfigurasi Server
Ada beberapa parameter pada postgresql.conf yang dapat kita modifikasi untuk meningkatkan keamanan.
Anda dapat menggunakan parameter listen_address untuk mengontrol ip mana yang diizinkan untuk terhubung ke server. Berikut adalah praktik yang baik untuk mengizinkan koneksi hanya dari IP yang dikenal atau jaringan Anda, dan menghindari nilai umum seperti “*”, “0.0.0.0:0” atau “::”, yang akan memberi tahu PostgreSQL untuk menerima koneksi dari IP mana pun.
Mengubah port yang akan didengarkan postgresql (secara default 5432) juga merupakan opsi. Anda dapat melakukannya dengan mengubah nilai parameter port.
Parameter seperti work_mem, maintenance_work_mem, temp_buffer , max_prepared_transactions, temp_file_limit penting untuk diingat jika Anda mengalami serangan penolakan layanan. Ini adalah parameter pernyataan/sesi yang dapat diatur pada tingkat yang berbeda (db, pengguna, sesi), jadi mengelolanya dengan bijak dapat membantu kami meminimalkan dampak serangan.
3. Manajemen Pengguna dan Peran
Aturan emas untuk keamanan terkait pengelolaan pengguna adalah memberikan jumlah akses minimum yang dibutuhkan pengguna.
Mengelola ini tidak selalu mudah dan bisa sangat berantakan jika tidak dilakukan dengan baik sejak awal.
Cara yang baik untuk menjaga hak istimewa tetap terkendali adalah dengan menggunakan peran, grup, strategi pengguna.
Di postgresql semuanya dianggap sebagai peran, tetapi kami akan membuat beberapa perubahan untuk ini.
Dalam strategi ini Anda akan membuat tiga jenis atau peran yang berbeda:
- peran peran (diidentifikasi dengan awalan r_)
- peran grup (diidentifikasi dengan awalan g_)
- peran pengguna (umumnya nama pribadi atau aplikasi)
Peran (r_ peran) akan menjadi yang memiliki hak istimewa atas objek. Peran grup ( peran g_ ) akan diberikan dengan peran r_ , jadi mereka akan menjadi kumpulan peran r_. Dan terakhir, peran pengguna akan diberikan dengan satu atau lebih peran grup dan akan menjadi orang yang memiliki hak akses masuk.
Mari kita tunjukkan contoh ini. Kami akan membuat grup hanya baca untuk skema_contoh dan kemudian memberikannya kepada pengguna:
Kami membuat peran hanya baca dan memberikan hak istimewa objek untuk itu
CREATE ROLE r_example_ro NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
GRANT USAGE ON SCHEMA example to r_example_ro;
GRANT SELECT ON ALL TABLES IN SCHEMA example to r_example_ro;
ALTER DEFAULT PRIVILEGES IN SCHEMA example GRANT SELECT ON TABLES TO r_example_ro;
Kami membuat grup hanya baca dan memberikan peran ke grup itu
CREATE ROLE g_example_ro NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION';
GRANT r_example_ro to g_example_ro;
Kami membuat peran app_user dan menjadikannya "bergabung" dengan grup hanya baca
CREATE ROLE app_user WITH LOGIN ;
ALTER ROLE app_user WITH PASSWORD 'somePassword' ;
ALTER ROLE app_user VALID UNTIL 'infinity' ;
GRANT g_example_ro TO app_user;
Dengan menggunakan metode ini Anda dapat mengelola perincian hak istimewa dan Anda dapat dengan mudah memberikan dan mencabut grup akses ke pengguna. Ingatlah untuk hanya memberikan hak istimewa objek ke peran alih-alih melakukannya secara langsung untuk pengguna dan untuk memberikan hak masuk hanya kepada pengguna.
Ini adalah praktik yang baik untuk secara eksplisit mencabut hak publik pada objek, seperti mencabut akses publik ke database tertentu dan hanya memberikannya melalui peran.
REVOKE CONNECT ON my_database FROM PUBLIC;
GRANT CONNECT ON my_database TO r_example_ro;
Batasi akses SUPERUSER, izinkan koneksi superuser hanya dari domain localhost/unix.
Gunakan pengguna tertentu untuk tujuan yang berbeda, seperti pengguna aplikasi tertentu atau pengguna cadangan, dan batasi koneksi untuk pengguna tersebut hanya dari ip yang diperlukan.
4. Manajemen Pengguna Super
Mempertahankan kebijakan kata sandi yang kuat adalah suatu keharusan untuk menjaga keamanan basis data Anda dan menghindari peretasan kata sandi. Untuk kebijakan yang kuat, gunakan karakter khusus, angka, huruf besar dan kecil, serta memiliki minimal 10 karakter.
Ada juga alat autentikasi eksternal, seperti LDAP atau PAM, yang dapat membantu Anda memastikan kedaluwarsa sandi dan kebijakan penggunaan kembali, dan juga menangani penguncian akun pada kesalahan autentikasi.
5. Enkripsi Data (pada ssl koneksi)
PostgreSQL memiliki dukungan asli untuk menggunakan koneksi SSL untuk mengenkripsi komunikasi klien/server untuk meningkatkan keamanan. SSL (Secure Sockets Layer) adalah teknologi keamanan standar untuk membuat tautan terenkripsi antara server web dan browser. Tautan ini memastikan bahwa semua data yang diteruskan antara server web dan browser tetap pribadi dan integral.
Karena klien postgresql mengirimkan kueri dalam teks biasa dan data juga dikirim tidak terenkripsi, hal ini rentan terhadap pemalsuan jaringan.
Anda dapat mengaktifkan SSL dengan menyetel parameter ssl ke on di postgresql.conf.
Server akan mendengarkan koneksi normal dan SSL pada port TCP yang sama, dan akan bernegosiasi dengan klien penghubung apakah akan menggunakan SSL. Secara default, ini adalah opsi klien, tetapi Anda memiliki opsi untuk mengatur server agar mengharuskan penggunaan SSL untuk beberapa atau semua koneksi menggunakan file konfigurasi pg_hba yang dijelaskan di atas.
6. Enkripsi Data Saat Istirahat (pg_crypto)
Ada dua jenis enkripsi dasar, satu arah dan dua arah. Di satu sisi Anda tidak pernah peduli tentang mendekripsi data ke dalam bentuk yang dapat dibaca, tetapi Anda hanya ingin memverifikasi bahwa pengguna mengetahui apa teks rahasia yang mendasarinya. Ini biasanya digunakan untuk kata sandi. Dalam enkripsi dua arah, Anda menginginkan kemampuan untuk mengenkripsi data serta mengizinkan pengguna yang berwenang untuk mendekripsinya ke dalam bentuk yang berarti. Data seperti kartu kredit dan SSN termasuk dalam kategori ini.
Untuk enkripsi satu arah, fungsi crypt yang dikemas dalam pgcrypto memberikan tingkat keamanan tambahan di atas cara md5. Alasannya adalah dengan md5, Anda dapat mengetahui siapa yang memiliki kata sandi yang sama karena tidak ada garam (Dalam kriptografi, garam adalah data acak yang digunakan sebagai input tambahan ke fungsi satu arah yang "meng-hash" data, kata sandi atau frasa sandi), jadi semua orang dengan kata sandi yang sama akan memiliki string md5 yang disandikan yang sama. Dengan crypt, mereka akan berbeda.
Untuk data yang ingin Anda ambil, Anda tidak ingin tahu apakah kedua informasi itu sama, tetapi Anda tidak mengetahui informasi itu, dan Anda hanya ingin pengguna yang berwenang yang dapat mengambilnya. Pgcrypto menyediakan beberapa cara untuk mencapai ini, jadi untuk membaca lebih lanjut tentang cara menggunakannya, Anda dapat memeriksa dokumentasi resmi postgresql di https://www.postgresql.org/docs/current/static/pgcrypto.html.
7. Masuk
Postgresql menyediakan berbagai macam parameter konfigurasi untuk mengontrol apa, kapan, dan di mana harus login.
Anda dapat mengaktifkan koneksi/pemutusan sesi, kueri yang berjalan lama, ukuran file sementara, dan sebagainya. Ini dapat membantu Anda mendapatkan pengetahuan yang lebih baik tentang beban kerja Anda untuk mengidentifikasi perilaku aneh. Anda bisa mendapatkan semua opsi untuk masuk pada tautan berikut https://www.postgresql.org/docs/9.6/static/runtime-config-logging.html
Untuk informasi lebih rinci tentang beban kerja Anda, Anda dapat mengaktifkan modul pg_stat_statements, yang menyediakan sarana untuk melacak statistik eksekusi semua pernyataan SQL yang dijalankan oleh server. Ada beberapa alat keamanan yang dapat menyerap data dari tabel ini dan akan menghasilkan daftar putih sql, untuk membantu Anda mengidentifikasi kueri yang tidak mengikuti pola yang diharapkan.
Untuk informasi lebih lanjut https://www.postgresql.org/docs/9.6/static/pgstatstatements.html.
Unduh Whitepaper Hari Ini Pengelolaan &Otomatisasi PostgreSQL dengan ClusterControlPelajari tentang apa yang perlu Anda ketahui untuk menerapkan, memantau, mengelola, dan menskalakan PostgreSQLUnduh Whitepaper8. Audit
Ekstensi Audit PostgreSQL (pgAudit) menyediakan sesi mendetail dan/atau logging audit objek melalui fasilitas logging PostgreSQL standar.
Pencatatan pernyataan dasar dapat disediakan oleh fasilitas pencatatan standar dengan log_statement =all. Ini dapat diterima untuk pemantauan dan penggunaan lainnya tetapi tidak memberikan tingkat detail yang umumnya diperlukan untuk audit. Tidaklah cukup memiliki daftar semua operasi yang dilakukan terhadap database. Juga harus dimungkinkan untuk menemukan pernyataan tertentu yang menarik bagi auditor. Fasilitas logging standar menunjukkan apa yang diminta pengguna, sedangkan pgAudit berfokus pada detail tentang apa yang terjadi saat database memenuhi permintaan.
9. Menambal
Periksa halaman informasi keamanan PostgreSQL secara teratur dan sering untuk pembaruan dan patch keamanan penting.
Perlu diingat bahwa bug keamanan OS atau library juga dapat menyebabkan kebocoran database, jadi pastikan Anda selalu memperbarui patch untuk ini.
ClusterControl menyediakan laporan operasional yang memberi Anda informasi ini dan akan menjalankan patch dan upgrade untuk Anda.
10. Keamanan Tingkat Baris
Selain sistem hak istimewa standar SQL yang tersedia melalui GRANT, tabel dapat memiliki kebijakan keamanan baris yang membatasi, berdasarkan per pengguna, baris mana yang dapat dikembalikan dengan kueri normal atau disisipkan, diperbarui, atau dihapus oleh perintah modifikasi data. Fitur ini juga dikenal sebagai Keamanan Tingkat Baris.
Ketika keamanan baris diaktifkan pada tabel, semua akses normal ke tabel untuk memilih baris atau memodifikasi baris harus diizinkan oleh kebijakan keamanan baris.
Berikut adalah contoh sederhana cara membuat kebijakan pada relasi akun untuk mengizinkan hanya anggota peran manajer yang mengakses baris, dan hanya baris akun mereka:
CREATE TABLE accounts (manager text, company text, contact_email text);
ALTER TABLE accounts ENABLE ROW LEVEL SECURITY;
CREATE POLICY account_managers ON accounts TO managers USING (manager = current_user);
Anda dapat memperoleh informasi lebih lanjut tentang fitur ini di dokumentasi resmi postgresql https://www.postgresql.org/docs/9.6/static/ddl-rowsecurity.html
Jika Anda ingin mempelajari lebih lanjut, berikut adalah beberapa sumber yang dapat membantu Anda untuk lebih memperkuat keamanan database Anda…
- https://www.postgresql.org/docs/9.6/static/auth-pg-hba-conf.html
- https://www.postgresql.org/docs/9.6/static/ssl-tcp.html
- https://www.postgresql.org/docs/current/static/pgcrypto.html
- http://www.postgresonline.com/journal/archives/165-Encrypting-data-with-pgcrypto.html
- https://github.com/pgaudit/pgaudit
- https://www.postgresql.org/docs/9.6/static/pgstatstatements.html
Kesimpulan
Jika Anda mengikuti tips di atas, server Anda akan lebih aman, tetapi ini tidak berarti bahwa itu tidak dapat dipecahkan.
Demi keamanan Anda sendiri, sebaiknya gunakan alat uji keamanan seperti Nessus, untuk mengetahui apa kerentanan utama Anda dan mencoba menyelesaikannya.
Anda juga dapat memantau database Anda dengan ClusterControl. Dengan ini, Anda dapat melihat secara real time apa yang terjadi di dalam database Anda dan menganalisisnya.