Keamanan

ACL pada Redis 8: pengguna, izin per kategori perintah, password, dan disiplin paparan jaringan.

Daftar isi

Server Redis yang baru dinyalakan tanpa pengaturan apa pun menerima koneksi dari siapa pun sebagai pengguna istimewa, sehingga keamanan tidak pernah selesai pada tumpukan aplikasi saja. Topik ini membahas ACL (access control list), yaitu mekanisme bawaan Redis 8 untuk mendefinisikan pengguna beserta password, pola key yang boleh disentuh, dan kategori perintah yang boleh dijalankan. Pembuatan pengguna terbatas, pengujian izin beserta penolakannya, pembacaan kembali konfigurasi ACL, dan batas kemampuan ACL dibahas dengan contoh yang dapat dijalankan ulang. Seluruh demo berjalan pada server lab terisolasi di port 6388 yang hanya mendengarkan 127.0.0.1, sehingga percobaan tidak pernah keluar dari mesin lokal.

Pengguna, password, dan pola key#

Server tanpa berkas ACL memiliki satu pengguna bernama default dengan seluruh izin dan tanpa password. Kondisi bawaan ini nyaman untuk percobaan, tetapi berbahaya bila port server terbuka ke jaringan. Perintah ACL SETUSER membentuk pengguna tambahan beserta aturan mainnya, yaitu status aktif, password, pola key, dan izin perintah. Aturan-aturan itu ditulis berurutan dalam satu perintah dan berlaku seketika tanpa memuat ulang server.

Server lab dinyalakan lebih dahulu agar seluruh contoh berjalan dari keadaan yang sama. Lab menggunakan port 6388 dengan direktori data /tmp/lab-acl, tanpa persistensi, dan log diarahkan ke berkas agar terminal tetap bersih.

bash
# hentikan sisa server lab dari sesi sebelumnya, bila ada
redis-cli -p 6388 shutdown nosave 2>/dev/null || true
# siapkan direktori data server lab keamanan
mkdir -p /tmp/lab-acl
# nyalakan server lab di port 6388 tanpa persistensi, log ke berkas
redis-server --port 6388 --bind 127.0.0.1 --daemonize yes --dir /tmp/lab-acl --save "" --protected-mode no --logfile /tmp/lab-acl-server.log
# tunggu server siap, lalu pastikan koneksi hidup
sleep 1
redis-cli -p 6388 PING
text Keluaran
PONG

Demo berikut membentuk pengguna bernama pembaca untuk aplikasi yang hanya boleh membaca data inventaris. Dua key contoh diisi lebih dahulu sebagai pengguna default agar pengujian izin pada bagian berikutnya punya sasaran.

bash
# buat pengguna pembaca: aktif, dengan password, pola key inventaris, izin baca
redis-cli -p 6388 acl setuser pembaca on '>sandikuas' '~inventaris:*' +get +mget -@dangerous
# isi dua key inventaris sebagai pengguna default
redis-cli -p 6388 set inventaris:gudang-a 120
redis-cli -p 6388 set inventaris:gudang-b 75
text Keluaran
OK
OK
OK

Setiap token pada perintah pembuatan pengguna memiliki arti tetap. Token on mengaktifkan pengguna, sedangkan >sandikuas memasang password dengan teks yang ditulis apa adanya. Token ~inventaris:* membatasi key yang boleh disentuh pada key berawalan inventaris:, lalu +get dan +mget memberi izin dua perintah pembacaan itu. Token -@dangerous menutup seluruh kategori perintah berbahaya sebagai pengaman tambahan, sehingga perintah yang kelak lupa ditutup tetap tidak bisa dijalankan oleh pengguna ini.

Menguji izin dan penolakan#

Pengujian dilakukan dengan terhubung sebagai pembaca melalui opsi -u redis-cli, yang URL-nya berbentuk redis://nama:password@host:port. redis-cli memberi peringatan bahwa password pada baris perintah dapat terbaca oleh proses lain, dan demo menekan pesan peringatan itu dengan 2>/dev/null agar keluarannya bersih. Tiga pengujian dijalankan berurutan, yaitu membaca key yang sesuai pola, menulis key yang sama, dan membaca key di luar pola.

bash
# pembaca boleh membaca key yang sesuai pola
redis-cli -u 'redis://pembaca:[email protected]:6388' get inventaris:gudang-a 2>/dev/null
# pembaca tidak boleh menulis
redis-cli -u 'redis://pembaca:[email protected]:6388' set inventaris:gudang-a 999 2>/dev/null
# pembaca tidak boleh membaca key di luar pola
redis-cli -u 'redis://pembaca:[email protected]:6388' get stok:lain 2>/dev/null
text Keluaran
120
NOPERM User pembaca has no permissions to run the 'set' command

NOPERM No permissions to access a key

Keluaran memperlihatkan tiga hasil yang berbeda. Pembacaan pertama berhasil dan mengembalikan 120 karena GET diizinkan dan key-nya sesuai pola. Penulisan ditolak dengan pesan NOPERM yang menyebut perintah set, sedangkan pembacaan key stok:lain ditolak dengan pesan NOPERM lain karena key-nya tidak sesuai pola. Dua pesan penolakan yang berbeda ini membantu membedakan kegagalan izin perintah dari kegagalan izin key.

Koneksi lewat URL pada dasarnya menjalankan AUTH dengan pasangan nama pengguna dan password tersebut. Perilakunya terlihat pada percobaan langsung berikut.

bash
# AUTH dengan pasangan yang benar
redis-cli -p 6388 auth pembaca sandikuas
# AUTH dengan password yang salah
redis-cli -p 6388 auth pembaca salah
text Keluaran
OK
WRONGPASS invalid username-password pair or user is disabled.

Membaca kembali konfigurasi ACL#

Konfigurasi yang berlaku dapat dibaca kembali tanpa menebak-nebak. ACL LIST melaporkan seluruh pengguna dalam satu baris per pengguna, ACL GETUSER merinci satu pengguna per field, sedangkan ACL CAT menyebutkan perintah-perintah yang termasuk sebuah kategori. Blok berikut membaca ketiganya untuk keadaan yang sama.

bash
# daftar seluruh pengguna dalam bentuk ternormalisasi
redis-cli -p 6388 acl list
# rincian medan commands dan keys milik pembaca
redis-cli -p 6388 acl getuser pembaca | grep -A1 -E '^(commands|keys)$'
# dua perintah pada kategori dangerous, diurutkan agar mudah dibandingkan
redis-cli -p 6388 acl cat dangerous | grep -E '^(flushall|flushdb)$' | sort
text Keluaran
user default on nopass sanitize-payload ~* &* +@all
user pembaca on sanitize-payload #6f6348faa20c9a49c54f854d18c0ceb6a8f52f8a4f8acde1e99124c5c7052205 ~inventaris:* resetchannels -@all +get +mget -@dangerous
commands
-@all +get +mget -@dangerous
keys
~inventaris:*
flushall
flushdb

Baris milik pembaca menunjukkan hal yang tidak terlihat saat pembuatan. Password sandikuas tersimpan sebagai hash, yaitu ringkasan kriptografis satu arah, sehingga ACL LIST tidak menampilkannya sebagai teks. Urutan aturan juga berubah dari penulisan aslinya karena Redis menormalkan bentuknya menjadi -@all +get +mget -@dangerous, yang maknanya tetap sama. Keluaran ACL CAT memperlihatkan FLUSHALL dan FLUSHDB sebagai anggota kategori dangerous, dan kedua perintah perusak itu kini berada di luar jangkauan pengguna pembaca.

Batas ACL dan disiplin jaringan#

ACL mengatur siapa boleh menjalankan apa, tetapi tidak menggantikan disiplin jaringan. Selama pengguna default masih tanpa password dan berizin penuh, siapa pun yang dapat mencapai port server masuk sebagai pengguna default tanpa perlu menyentuh pengguna pembaca sama sekali. Oleh karena itu, penguncian yang sungguhan mencakup tiga lapis sekaligus, yaitu password pada setiap pengguna aktif, pengikatan server pada antarmuka yang memang diperlukan melalui bind, dan pembatasan akses jaringan di luar Redis. Koneksi terenkripsi juga tersedia melalui TLS untuk jalur yang melintasi jaringan tidak terpercaya.

Lab pada topik ini ditutup dengan mereset pengguna demo terlebih dahulu, lalu mematikan servernya. Perubahan ACL pada lab tidak tersimpan ke berkas mana pun karena lab berjalan tanpa berkas ACL, sehingga penonaktifan ini sekaligus meninggalkan keadaan yang bersih.

bash
# nonaktifkan pengguna demo beserta password dan izinnya
redis-cli -p 6388 acl setuser pembaca off resetpass resetkeys resetchannels -@all
# matikan server lab keamanan
redis-cli -p 6388 shutdown nosave
text Keluaran
OK

Ringkasan#

  • ACL SETUSER membentuk pengguna dengan status aktif, password, pola key, dan izin per kategori perintah yang berlaku seketika tanpa memuat ulang server.
  • Penolakan ACL muncul dalam dua bentuk, yaitu NOPERM untuk perintah yang tidak diizinkan dan NOPERM atas key yang tidak sesuai pola, sedangkan password yang keliru dibalas WRONGPASS.
  • ACL LIST dan ACL GETUSER membaca kembali konfigurasi, dengan password tersimpan sebagai hash dan urutan aturan yang dinormalisasi oleh Redis.
  • ACL tidak menggantikan disiplin jaringan, sehingga password, bind, dan pembatasan jaringan diterapkan bersamaan.

Referensi#

  • ACL — Redis — Panduan resmi ACL beserta sintaks aturan pengguna dan kategori perintahnya.
  • ACL SETUSER — Redis — Dokumen perintah pembuatan pengguna beserta arti setiap token aturan.
  • ACL LIST — Redis — Format baris pengguna yang dinormalisasi, termasuk penyajian password sebagai hash.
  • ACL GETUSER — Redis — Rincian per field untuk satu pengguna, dari flags hingga pola key.
  • AUTH — Redis — Autentikasi koneksi beserta pesan WRONGPASS untuk pasangan yang tidak cocok.