Redis tanpa konfigurasi keamanan adalah salah satu target eksploitasi paling umum di internet. ACL (Redis 6+) memungkinkan pembuatan pengguna dengan izin per-perintah dan per-pola-key, jauh lebih baik daripada satu requirepass global. TLS mengenkripsi lalu lintas. Perintah berbahaya seperti FLUSHALL, CONFIG, dan KEYS sebaiknya diganti nama atau dilarang. Redis tidak boleh terekspos langsung ke internet dalam keadaan apa pun.
1. Bahaya Nyata Redis yang Terbuka
Redis tanpa password yang terjangkau dari internet bisa diambil alih sepenuhnya. Teknik klasiknya: penyerang memakai CONFIG SET dir dan CONFIG SET dbfilename untuk menulis berkas RDB ke ~/.ssh/authorized_keys atau ke direktori cron, lalu mendapat akses shell ke server. Ini bukan teori — ini penyebab ribuan server dibajak setiap tahun.
Pertahanan berlapis, dari yang paling penting:
- Jangan pernah dengarkan alamat publik. Ini lapisan terpenting dan paling sering dilupakan.
- Wajibkan autentikasi (ACL, bukan sekadar requirepass).
- Batasi izin tiap pengguna seminimal mungkin.
- Nonaktifkan atau ganti nama perintah berbahaya.
- Enkripsi lalu lintas dengan TLS bila melintasi jaringan yang tidak tepercaya.
2. Lapisan Jaringan Dulu
# Hanya dengarkan alamat internal. JANGAN 0.0.0.0. bind 127.0.0.1 10.0.0.5 # Protected mode: bila tidak ada bind & tidak ada password, # Redis hanya melayani localhost. Biarkan menyala. protected-mode yes # Mengganti port default mengurangi pemindaian otomatis port 6380
3. ACL: Pengguna dengan Izin Terbatas
Sebelum Redis 6, yang ada hanya requirepass — satu password untuk semua, dengan kuasa penuh. ACL mengubahnya total.
# Pengguna aplikasi web: hanya boleh baca-tulis pada key cache:*
ACL SETUSER webapp on >PasswordKuat123 \
~cache:* \
+get +set +del +expire +ttl +exists
# Pengguna dasbor: hanya boleh membaca, tanpa boleh menulis apa pun
ACL SETUSER dasbor on >PasswordLain456 \
~stat:* \
+@read
# Pengguna worker: boleh seluruh perintah stream pada antrian:*
ACL SETUSER worker on >PasswordWorker789 \
~antrian:* \
+@stream +ping
# Matikan pengguna default agar tidak ada akses tanpa nama
ACL SETUSER default off
Arti simbolnya:
| Simbol | Arti |
|---|---|
on / off | Mengaktifkan atau menonaktifkan pengguna |
>password | Menambahkan password |
~pola | Pola key yang boleh disentuh |
%R~pola / %W~pola | Pola khusus baca saja / tulis saja (Redis 7+) |
+perintah / -perintah | Mengizinkan / melarang perintah tertentu |
+@kategori | Mengizinkan satu kategori penuh (@read, @write, @admin, @dangerous) |
&pola | Channel Pub/Sub yang boleh diakses |
allkeys / allcommands | Setara ~* dan +@all — hindari untuk pengguna aplikasi |
# Memeriksa dan mengelola ACL LIST ACL GETUSER webapp ACL CAT # daftar semua kategori ACL CAT dangerous # perintah apa saja yang tergolong berbahaya ACL WHOAMI # saya login sebagai siapa ACL DELUSER dasbor # Simpan ACL ke berkas terpisah agar bertahan setelah restart # (di redis.conf: aclfile /etc/redis/users.acl) ACL SAVE
Layanan pembayaran tidak butuh FLUSHALL. Dasbor tidak butuh SET. Beri tiap layanan pengguna ACL sendiri dengan pola key yang sempit. Saat satu layanan diretas, kerusakannya terbatas pada key milik layanan itu saja.
4. Menonaktifkan Perintah Berbahaya
# Melumpuhkan perintah sepenuhnya (string kosong) rename-command FLUSHALL "" rename-command FLUSHDB "" rename-command KEYS "" rename-command DEBUG "" # Atau menyamarkannya agar hanya admin yang tahu namanya rename-command CONFIG "CONFIG_a8f3c19d2b"
rename-command adalah mekanisme lama yang kasar: ia berlaku global dan bisa membingungkan tim operasi. Dengan ACL Anda bisa melarang -@dangerous untuk pengguna aplikasi sambil tetap mengizinkannya untuk pengguna admin. Itu jauh lebih rapi dan bisa diaudit.
5. TLS
# Matikan port tanpa enkripsi sepenuhnya port 0 tls-port 6379 tls-cert-file /etc/redis/tls/redis.crt tls-key-file /etc/redis/tls/redis.key tls-ca-cert-file /etc/redis/tls/ca.crt # Wajibkan client menunjukkan sertifikat (mutual TLS) tls-auth-clients yes # TLS untuk lalu lintas replikasi dan cluster juga tls-replication yes tls-cluster yes
redis-cli --tls \ --cert /etc/redis/tls/client.crt \ --key /etc/redis/tls/client.key \ --cacert /etc/redis/tls/ca.crt \ -h redis.internal -p 6379
6. Daftar Periksa Sebelum Naik Produksi
| Periksa | Kenapa |
|---|---|
bind bukan 0.0.0.0 | Mencegah akses dari luar jaringan internal |
protected-mode yes | Jaring pengaman bila bind terlupa |
Pengguna default dimatikan | Menutup akses tanpa identitas |
| Tiap layanan punya pengguna ACL sendiri | Membatasi dampak kebocoran kredensial |
CONFIG dilarang untuk aplikasi | Menutup jalur eksploitasi tulis-berkas |
aclfile dikonfigurasi | ACL tetap ada setelah restart |
| Redis berjalan sebagai pengguna non-root | Membatasi dampak bila proses dibajak |
| Berkas RDB/AOF berizin 600 | Isi database tidak terbaca pengguna lain di server |
| Firewall hanya mengizinkan IP aplikasi | Pertahanan berlapis di luar Redis |