---
title: "Cara Membuka Akses Remote MySQL dengan Aman"
description: "Cara mengizinkan koneksi MySQL dari server lain tanpa membuka database ke seluruh internet: bind-address, user per IP, firewall, TLS, dan SSH tunnel."
url: "https://nivelva.com/insight/cara-membuka-akses-remote-mysql-aman"
category: "Server \u0026 Infrastruktur"
tags: ["mysql","mariadb","database","keamanan server","firewall"]
author: "Theresia Candiawan"
published: "2026-11-07T04:59:00+07:00"
updated: "2026-11-07T04:59:00+07:00"
language: "id"
publisher: "Nivelva (https://nivelva.com)"
---

# Cara Membuka Akses Remote MySQL dengan Aman

> **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.

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](https://nivelva.com/insight/cara-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](https://nivelva.com/insight/ssh-key-vs-password).

> **Cek siapa saja yang bisa login dari luar:**
>
> Jalankan `SELECT user, host FROM mysql.user;` secara berkala. Setiap baris dengan host `%` atau IP yang tidak kamu kenal patut diperiksa ulang.

## 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 3306` dan pastikan alamat yang muncul hanya IP yang kamu tetapkan, bukan `0.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 numbered` dan hapus aturan lama seperti `3306 ALLOW Anywhere` yang 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](https://nivelva.com/insight/optimasi-mysql-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.

## Sumber

- <https://dev.mysql.com/doc/refman/8.4/en/server-system-variables.html>
- <https://dev.mysql.com/doc/refman/8.4/en/using-encrypted-connections.html>
- <https://dev.mysql.com/doc/refman/8.4/en/create-user.html>

---

Diterbitkan oleh Nivelva Insight (https://nivelva.com/insight/). Artikel ini: https://nivelva.com/insight/cara-membuka-akses-remote-mysql-aman
Kontak Nivelva: WhatsApp https://wa.me/6285111245007, email hello@nivelva.com
