Cara Membuka Akses Remote MySQL dengan Aman
Cara mengizinkan koneksi MySQL dari server lain tanpa membuka database ke seluruh internet: bind-address, user per IP, firewall, TLS, dan SSH tunnel.
Jawaban singkat
Buka akses remote MySQL hanya untuk IP yang benar-benar perlu. Ubah bind-address, buat user khusus yang terikat ke IP aplikasi, batasi port 3306 di firewall, dan wajibkan TLS. Untuk akses admin sesekali, SSH tunnel lebih aman daripada membuka port.
Daftar isi
- Apakah kamu benar-benar butuh port terbuka?
- Langkah membuka akses remote
- 1. Ubah alamat yang didengarkan
- 2. Buat user yang terikat ke IP aplikasi
- 3. Batasi port di firewall
- 4. Wajibkan koneksi terenkripsi
- Bagaimana kalau hanya untuk akses admin?
- Bagaimana memastikan akses sudah benar-benar terbatas?
- Hal kecil yang sering terlupa
- Pertanyaan yang sering diajukan
Cara aman membuka akses remote MySQL adalah mengizinkan koneksi hanya dari alamat IP tertentu, dengan user khusus, lewat koneksi terenkripsi. Jangan pernah mengubah bind-address ke 0.0.0.0 lalu membiarkan port 3306 terbuka ke siapa saja.
Kenapa ini penting? Port database yang terbuka ke internet terus-menerus dipindai bot yang mencoba menebak password. Satu user dengan password lemah dan hak ALL PRIVILEGES sudah cukup untuk membuat datamu dicuri atau dihapus. Langkah di bawah berlaku untuk MySQL 8.x dan MariaDB di Ubuntu atau Debian; lokasi file di distro lain bisa berbeda.
Apakah kamu benar-benar butuh port terbuka?
Sebelum mengubah apa pun, pilih jalur aksesnya. Ada tiga pola yang umum:
| Kebutuhan | Cara yang disarankan | Port 3306 dibuka? |
|---|---|---|
| Aplikasi dan database di server yang sama | Tetap 127.0.0.1 atau socket | Tidak |
| Admin membuka database dari laptop sesekali | SSH tunnel | Tidak |
| Aplikasi di server lain (satu jaringan privat) | Bind ke IP privat, firewall per IP | Hanya di jaringan privat |
| Aplikasi di server lain lewat internet publik | Firewall per IP plus TLS wajib, atau VPN | Hanya untuk IP aplikasi |
Kalau kebutuhanmu ada di dua baris teratas, kamu tidak perlu membuka port sama sekali.
Langkah membuka akses remote
1. Ubah alamat yang didengarkan
Untuk MySQL di Ubuntu, buka /etc/mysql/mysql.conf.d/mysqld.cnf. Untuk MariaDB, file yang umum adalah /etc/mysql/mariadb.conf.d/50-server.cnf. Cari baris bind-address:
bind-address = 10.0.0.5
Isi dengan IP server database yang akan dipakai, sebaiknya IP privat. Sejak MySQL 8.0.13, bind-address juga bisa berisi beberapa alamat dipisah koma, misalnya 127.0.0.1,10.0.0.5. Setelah itu restart:
sudo systemctl restart mysql
Di MariaDB, nama layanannya bisa mariadb. Cek hasilnya dengan sudo ss -tlnp | grep 3306.
2. Buat user yang terikat ke IP aplikasi
Di MySQL, akun dikenali dari pasangan user dan host. Manfaatkan ini:
CREATE USER 'appuser'@'10.0.0.20' IDENTIFIED BY 'password-panjang-acak' REQUIRE SSL;
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'appuser'@'10.0.0.20';
User ini hanya bisa login dari 10.0.0.20, hanya ke database appdb, dan hanya dengan koneksi terenkripsi. Hindari host '%' (semua alamat) dan jangan pernah membuka root untuk remote. Tambahkan hak CREATE, ALTER, atau INDEX hanya bila aplikasi memang menjalankan migrasi skema.
3. Batasi port di firewall
sudo ufw allow from 10.0.0.20 to any port 3306 proto tcp
Firewall adalah lapisan kedua. Meski ada user yang salah konfigurasi, IP lain tetap tidak bisa menyentuh port 3306. Bila VPS-mu juga memakai firewall dari panel penyedia, terapkan aturan yang sama di sana. Dasar-dasar mengamankan server ada di langkah awal mengamankan VPS baru.
4. Wajibkan koneksi terenkripsi
MySQL 8 menyiapkan sertifikat TLS sendiri saat pertama dijalankan bila belum ada, sehingga koneksi terenkripsi bisa langsung dipakai. Untuk mewajibkannya bagi semua koneksi TCP, tambahkan di file konfigurasi:
require_secure_transport = ON
Dari server aplikasi, uji dengan klien MySQL:
mysql -h 10.0.0.5 -u appuser -p --ssl-mode=REQUIRED appdb
Ketik \s setelah masuk; baris SSL harus menampilkan cipher yang dipakai, bukan "Not in use". Sertifikat bawaan bersifat self-signed: cukup untuk enkripsi, tapi untuk verifikasi identitas server gunakan sertifikat dari CA milikmu dan --ssl-mode=VERIFY_IDENTITY. Opsi klien MariaDB sedikit berbeda (misalnya --ssl), jadi cek dokumentasinya.
Bagaimana kalau hanya untuk akses admin?
Untuk membuka database dari laptop dengan DBeaver, MySQL Workbench, atau HeidiSQL, pakai SSH tunnel. Database tetap mendengarkan 127.0.0.1, dan port 3306 tidak pernah terlihat dari luar.
ssh -N -L 3307:127.0.0.1:3306 user@ip-server
Selama perintah itu berjalan, sambungkan aplikasi di laptop ke 127.0.0.1 port 3307. Sebagian besar aplikasi GUI juga punya opsi "SSH tunnel" bawaan. Keamanannya bertumpu pada SSH, jadi pastikan login memakai kunci, bukan password, seperti dibahas di SSH key vs password.
Bagaimana memastikan akses sudah benar-benar terbatas?
Jangan berhenti setelah aplikasi berhasil terhubung. Uji juga dari arah sebaliknya, yaitu dari tempat yang seharusnya ditolak.
- Dari laptop atau server lain di luar daftar izin, coba
nc -zv ip-server 3306. Hasil yang diharapkan: koneksi timeout atau ditolak. - Dari server database sendiri, jalankan
sudo ss -tlnp | grep 3306dan pastikan alamat yang muncul hanya IP yang kamu tetapkan, bukan0.0.0.0. - Di MySQL, jalankan
SHOW GRANTS FOR 'appuser'@'10.0.0.20';untuk memastikan hak user tidak melebar ke database lain. - Di firewall, cek
sudo ufw status numbereddan hapus aturan lama seperti3306 ALLOW Anywhereyang mungkin tertinggal dari percobaan sebelumnya.
Ulangi pemeriksaan ini setiap kali ada perubahan server, misalnya saat aplikasi pindah ke IP baru. Aturan yang tertinggal untuk IP lama sering menjadi celah yang tidak disadari.
Hal kecil yang sering terlupa
- Password panjang dan unik untuk setiap user aplikasi, disimpan di file konfigurasi aplikasi dengan izin baca terbatas.
- Satu user per aplikasi. Kalau satu aplikasi bocor, aplikasi lain tidak ikut terbuka.
- Hapus user uji coba yang dibuat saat instalasi.
- Perbarui MySQL atau MariaDB lewat paket resmi distro agar perbaikan keamanan ikut terpasang.
- Backup tetap jalan dan disimpan di luar server database.
Setelah akses remote rapi, langkah berikutnya biasanya soal performa. Ringkasan parameter yang paling berpengaruh ada di setelan MySQL dan MariaDB.
Pertanyaan yang sering diajukan
Kenapa muncul "Host is not allowed to connect to this MySQL server"?
Artinya tidak ada akun dengan pasangan user dan host yang cocok dengan IP asal koneksi. Buat user untuk IP tersebut, jangan mengganti host menjadi '%'.
Apakah mengganti port 3306 ke port lain sudah cukup aman?
Tidak. Mengganti port hanya mengurangi pemindaian otomatis. Perlindungan sebenarnya tetap dari firewall per IP, user yang dibatasi, dan TLS.
Perlukah FLUSH PRIVILEGES setelah GRANT?
Tidak untuk perintah CREATE USER dan GRANT, karena perubahan langsung berlaku. FLUSH PRIVILEGES hanya dibutuhkan bila tabel izin diubah langsung dengan INSERT atau UPDATE.


