Kodeloka
  1. Kodeloka
  2. Kelas Redis
  3. Materi

Security · Modul 21 dari 21

Keamanan: ACL, TLS & Pengerasan Server

Mengunci Redis dengan ACL berbasis peran, mengenkripsi lalu lintas dengan TLS, menonaktifkan perintah berbahaya, dan menutup celah konfigurasi yang sering dieksploitasi.

📌 Ringkasan Eksekutif Modul:
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 default itu tidak aman

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:

  1. Jangan pernah dengarkan alamat publik. Ini lapisan terpenting dan paling sering dilupakan.
  2. Wajibkan autentikasi (ACL, bukan sekadar requirepass).
  3. Batasi izin tiap pengguna seminimal mungkin.
  4. Nonaktifkan atau ganti nama perintah berbahaya.
  5. Enkripsi lalu lintas dengan TLS bila melintasi jaringan yang tidak tepercaya.

2. Lapisan Jaringan Dulu

redis.conf
# 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.

redis-cli
# 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:

SimbolArti
on / offMengaktifkan atau menonaktifkan pengguna
>passwordMenambahkan password
~polaPola key yang boleh disentuh
%R~pola / %W~polaPola khusus baca saja / tulis saja (Redis 7+)
+perintah / -perintahMengizinkan / melarang perintah tertentu
+@kategoriMengizinkan satu kategori penuh (@read, @write, @admin, @dangerous)
&polaChannel Pub/Sub yang boleh diakses
allkeys / allcommandsSetara ~* 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
📌 Prinsip hak akses terkecil

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

redis.conf
# 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"
⚠️ Untuk instalasi baru, pakai ACL saja

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

redis.conf
# 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

PeriksaKenapa
bind bukan 0.0.0.0Mencegah akses dari luar jaringan internal
protected-mode yesJaring pengaman bila bind terlupa
Pengguna default dimatikanMenutup akses tanpa identitas
Tiap layanan punya pengguna ACL sendiriMembatasi dampak kebocoran kredensial
CONFIG dilarang untuk aplikasiMenutup jalur eksploitasi tulis-berkas
aclfile dikonfigurasiACL tetap ada setelah restart
Redis berjalan sebagai pengguna non-rootMembatasi dampak bila proses dibajak
Berkas RDB/AOF berizin 600Isi database tidak terbaca pengguna lain di server
Firewall hanya mengizinkan IP aplikasiPertahanan berlapis di luar Redis