Cara Menginstal dan Mengamankan Redis pada Ubuntu 20.04

Versi sebelumnya dari tutorial ini ditulis oleh Justin Ellingwood

Pengantar

Redis adalah penyimpanan nilai kunci dalam memori yang dikenal karena fleksibilitas, kinerja, dan dukungan bahasanya yang luas. Tutorial ini mendemonstrasikan cara menginstal, mengonfigurasi, dan mengamankan Redis pada server Ubuntu 20.04.

Prasyarat

Untuk menyelesaikan panduan ini, Anda akan memerlukan akses ke server Ubuntu 20.04 yang memiliki pengguna non-root dengan privilese sudo dan firewall yang terkonfigurasi dengan ufw. Anda dapat menyiapkan ini dengan mengikuti Panduan Penyiapan Server Awal untuk Ubuntu 20.04 dari kami.

Langkah 1 — Menginstal dan Mengonfigurasi Redis

Kita akan menggunakan manajer paket APT untuk menginstal redis dari repositori Ubuntu resmi. Pada saat penulisan panduan ini, versi yang tersedia dalam repositori asali adalah 5.0.7.

Mulailah dengan memperbarui cache paket apt lokal Anda:

  • sudo apt update

Lalu instal Redis dengan mengetik:

  • sudo apt install redis-server

Ini akan mengunduh dan menginstal Redis serta dependensinya. Setelah ini, ada satu perubahan konfigurasi penting yang harus dibuat di dalam berkas konfigurasi Redis, yang dihasilkan secara otomatis selama instalasi.

Buka berkas ini dengan editor teks pilihan Anda:

  • sudo nano /etc/redis/redis.conf

Di dalam berkas itu, temukan arahan supervised. Arahan ini memungkinkan Anda untuk mendeklarasikan sistem init untuk mengelola Redis sebagai suatu layanan, yang memberi Anda kontrol lebih atas operasinya. Arahan supervised diatur sebagai no secara asali. Karena Anda menjalankan Ubuntu, yang menggunakan sistem init systemd, ubah ini menjadi systemd:

/etc/redis/redis.conf

. . .  # If you run Redis from upstart or systemd, Redis can interact with your # supervision tree. Options: #   supervised no      - no supervision interaction #   supervised upstart - signal upstart by putting Redis into SIGSTOP mode #   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET #   supervised auto    - detect upstart or systemd method based on #                        UPSTART_JOB or NOTIFY_SOCKET environment variables # Note: these supervision methods only signal "process is ready." #       They do not enable continuous liveness pings back to your supervisor. supervised systemd  . . . 

Itu adalah satu-satunya perubahan yang Anda perlu buat terhadap berkas konfigurasi Redis saat ini, jadi simpan dan tutup berkasnya ketika Anda selesai. Jika Anda menggunakan nano untuk mengedit berkas, lakukan itu dengan menekan CTRL + X, Y, lalu ENTER.

Lalu, mulai ulang layanan Redis untuk mencerminkan perubahan yang Anda buat ke berkas konfigurasi:

  • sudo systemctl restart redis.service

Dengan itu, Anda telah menginstal dan mengonfigurasi Redis dan Redis berjalan pada mesin Anda. Sebelum Anda mulai menggunakannya, merupakan hal bijaksana untuk memeriksa terlebih dahulu apakah Redis berfungsi dengan benar.

Langkah 2 — Menguji Redis

Seperti perangkat lunak yang baru terinstal lainnya, sebaiknya pastikan bahwa Redis berfungsi seperti yang diharapkan sebelum membuat perubahan apa pun terhadap konfigurasinya. Kita akan membahas beberapa cara untuk memeriksa bahwa Redis bekerja dengan benar dalam langkah ini.

Mulai dengan memeriksa bahwa layanan Redis sedang berjalan:

  • sudo systemctl status redis

Jika Redis berjalan tanpa kesalahan apa pun, perintah ini akan menghasilkan keluaran yang mirip dengan berikut ini:

Output● redis-server.service - Advanced key-value store      Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)      Active: active (running) since Thu 2020-04-30 23:26:54 UTC; 4s ago        Docs: http://redis.io/documentation,              man:redis-server(1)     Process: 36552 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)    Main PID: 36561 (redis-server)       Tasks: 4 (limit: 2345)      Memory: 1.8M      CGroup: /system.slice/redis-server.service              └─36561 /usr/bin/redis-server 127.0.0.1:6379 . . . 

Di sini, Anda dapat melihat bahwa Redis sedang berjalan dan sudah diaktifkan, yang berarti bahwa sistem sudah disiapkan untuk memulai setiap kali server melakukan boot.

Catatan: Pengaturan ini diinginkan untuk banyak kasus penggunaan umum dari Redis. Namun, jika Anda lebih memilih untuk memulai Redis secara manual setiap kali server melakukan boot, Anda dapat mengonfigurasi ini dengan perintah berikut:

  • sudo systemctl disable redis

Untuk menguji bahwa Redis berfungsi dengan benar, hubungkan ke server menggunakan redis-cli, yang merupakan klien baris perintah Redis:

  • redis-cli

Dalam prompt selanjutnya, uji konektivitas dengan perintah ping:

  • ping
OutputPONG 

Keluaran ini mengonfirmasi bahwa koneksi server masih hidup. Selanjutnya, periksa apakah Anda dapat mengatur kunci dengan menjalankan:

  • set test "It's working!"
OutputOK 

Dapatkan nilainya dengan mengetik:

  • get test

Dengan asumsi semuanya berjalan lancar, Anda akan dapat mendapatkan nilai yang Anda simpan:

Output"It's working!" 

Setelah mengonfirmasi bahwa Anda dapat mengambil nilai, keluarlah dari prompt Redis untuk kembali ke shell:

  • exit

Sebagai uji coba terakhir, kita akan memeriksa apakah Redis dapat mempertahankan data bahkan setelah sistem dihentikan atau dimulai kembali. Untuk melakukan ini, pertama-tama mulai ulang instans Redis:

  • sudo systemctl restart redis

Lalu, hubungkan dengan klien baris perintah lagi:

  • redis-cli

Dan konfirmasikan bahwa nilai uji coba Anda masih ada

  • get test

Nilai dari kunci Anda harus masih dapat diakses:

Output"It's working!" 

Keluarlah dari shell lagi ketika Anda selesai:

  • exit

Dengan itu, instalasi Redis Anda sudah beroperasi sepenuhnya dan siap untuk digunakan. Namun, beberapa pengaturan konfigurasi asalinya tidak aman dan memberi peluang kepada aktor jahat untuk menyerang dan memperoleh akses ke server dan data Anda. Langkah-langkah selanjutnya dalam tutorial ini mencakup metode untuk mengurangi kerentanan ini, seperti yang disarankan oleh situs web Redis resmi. Meskipun langkah-langkah ini bersifat opsional dan Redis tetap akan berfungsi jika Anda memilih untuk tidak mengikutinya, tetapi Anda sangat disarankan untuk menyelesaikannya untuk memperkuat keamanan sistem Anda.

Langkah 3 — Mengikat ke localhost

Secara asali, Redis hanya dapat diakses dari localhost. Namun, jika Anda menginstal dan mengonfigurasi Redis dengan mengikuti tutorial yang berbeda dari tutorial ini, Anda mungkin telah memperbarui berkas konfigurasi untuk mengizinkan koneksi dari mana saja. Ini tidak seaman terikat ke localhost.

Untuk memperbaiki ini, buka berkas konfigurasi Redis untuk mengedit:

  • sudo nano /etc/redis/redis.conf

Temukan baris ini dan pastikan bahwa baris ini tidak dijadikan komentar (hapus # jika ada):

/etc/redis/redis.conf

bind 127.0.0.1 ::1 

Simpan dan tutup berkas saat selesai (tekan CTRL + X, Y, lalu ENTER).

Lalu, mulai ulang layanan untuk memastikan bahwa systemd membaca perubahan Anda:

  • sudo systemctl restart redis

Untuk memeriksa bahwa perubahan ini telah diterapkan, jalankan perintah netstat berikut:

  • sudo netstat -lnp | grep redis
Outputtcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      14222/redis-server   tcp6       0      0 ::1:6379                :::*                    LISTEN      14222/redis-server   

Catatan: Perintah netstat mungkin tidak tersedia di sistem Anda secara asali. Jika kasusnya seperti ini, Anda dapat menginstalnya (bersama dengan beberapa peralatan jejaring berguna lainnya) dengan perintah berikut :

  • sudo apt install net-tools

Keluaran ini menunjukkan bahwa program redis-server terikat ke localhost (127.0.0.1), yang mencerminkan perubahan yang Anda baru saja buat pada berkas konfigurasi. Jika Anda melihat alamat IP lain di dalam kolom itu (sebagai contoh: 0.0.0.0), maka Anda harus memeriksa ulang bahwa Anda telah menghapus tanda komentar pada baris yang benar dan memulai ulang layanan Redis lagi.

Kini setelah instalasi Redis Anda hanya mendengarkan localhost, maka akan lebih sulit bagi aktor jahat untuk membuat permintaan atau memperoleh akses ke server Anda. Namun, Redis saat ini tidak diatur untuk meminta pengguna melakukan autentikasi sendiri sebelum membuat perubahan ke konfigurasi atau data yang dimilikinya. Untuk memperbaiki ini, Redis mengizinkan Anda untuk meminta pengguna melakukan autentikasi dengan kata sandi sebelum membuat perubahan melalui klien Redis (redis-cli).

Langkah 4 — Mengonfigurasi Kata sandi Redis

Mengonfigurasi kata sandi Redis akan mengaktifkan salah satu dari dua fitur keamanan bawaan — perintah auth, yang mengharuskan klien melakukan autentikasi untuk mengakses basis data. Kata sandi dikonfigurasi secara langsung di dalam berkas konfigurasi Redis, /etc/redis/redis.conf, jadi buka berkas itu lagi dengan editor pilihan Anda:

  • sudo nano /etc/redis/redis.conf

Gulir ke bagian SECURITY dan cari arahan dengan komentar yang berbunyi:

/etc/redis/redis.conf

. . . # requirepass foobared . . . 

Hapus status komentar dengan menghapus #, dan ubah foobared menjadi kata sandi yang aman.

Catatan: Di atas arahan requirepass di dalam berkas redis.conf, ada peringatan dengan komentar:

/etc/redis/redis.conf

. . . # Warning: since Redis is pretty fast an outside user can try up to # 150k passwords per second against a good box. This means that you should # use a very strong password otherwise it will be very easy to break. # . . . 

Maka dari itu, merupakan hal penting bagi Anda untuk menentukan nilai yang sangat kuat dan sangat panjang sebagai kata sandi Anda. Alih-alih membuat kata sandi sendiri, Anda dapat menggunakan perintah openssl untuk menghasilkan kata sandi acak, seperti dalam contoh berikut. Dengan memasukkan keluaran dari perintah pertama ke perintah openssl kedua, seperti yang ditunjukkan di sini, hal tersebut akan menghapus jeda baris apa pun yang dihasilkan oleh perintah pertama:

  • openssl rand 60 | openssl base64 -A

Keluaran Anda akan terlihat seperti:

OutputRBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE 

Setelah menyalin dan menempel keluaran dari perintah itu sebagai nilai baru untuk requirepass, maka keluarannya akan berbunyi:

/etc/redis/redis.confrequirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE 

Setelah menetapkan kata sandi, simpan dan tutup berkas, lalu mulai ulang Redis:

  • sudo systemctl restart redis.service

Untuk menguji bahwa kata sandi itu bekerja, buka klien Redis:

  • redis-cli

Yang berikut ini menunjukkan urutan perintah yang digunakan untuk menguji apakah kata sandi Redis berfungsi. Perintah pertama mencoba untuk mengatur kunci atas suatu nilai sebelum autentikasi:

  • set key1 10

Itu tidak akan berhasil karena Anda tidak melakukan autentikasi, jadi Redis merespons dengan pesan kesalahan:

Output(error) NOAUTH Authentication required. 

Perintah selanjutnya mengautentikasi dengan kata sandi yang ditentukan di dalam berkas konfigurasi Redis:

  • auth your_redis_password

Redis mengakui:

OutputOK 

Setelah itu, menjalankan perintah sebelumnya lagi akan menjadi berhasil:

  • set key1 10
OutputOK 

get key1 melakukan kueri terhadap Redis untuk nilai dari kunci yang baru.

  • get key1
Output"10" 

Setelah mengonfirmasi bahwa Anda dapat menjalankan perintah di dalam klien Redis setelah melakukan autentikasi, Anda dapat keluar dari redis-cli:

  • quit

Selanjutnya, kita akan membahas tentang mengganti nama perintah Redis yang, jika dimasukkan secara tidak sengaja atau oleh aktor jahat, dapat menyebabkan kerusakan serius pada mesin Anda.

Langkah 5 — Mengganti Nama Perintah Berbahaya

Fitur keamanan lain yang ditanam di dalam Redis melibatkan penggantian nama atau menonaktifkan secara penuh perintah-perintah tertentu yang dianggap berbahaya.

Ketika dijalankan oleh pengguna yang tidak sah, perintah seperti itu dapat digunakan untuk mengonfigurasi ulang, menghancurkan, atau menghapus data Anda. Seperti kata sandi autentikasi, mengganti nama atau menonaktifkan perintah dikonfigurasi pada bagian SECURITY yang sama dari berkas /etc/redis/redis.conf.

Beberapa perintah yang dianggap berbahaya termasuk: FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME, dan DEBUG. Ini bukanlah daftar yang lengkap, tetap mengganti nama atau menonaktifkan semua perintah di dalam daftar itu adalah titik awal yang baik untuk menambah keamanan server Redis Anda.

Apakah Anda harus menonaktifkan atau mengganti nama perintah bergantung pada kebutuhan spesifik Anda atau situs Anda. Jika Anda tahu bahwa Anda tidak akan pernah menggunakan perintah yang dapat disalahgunakan, maka Anda dapat menonaktifkan perintah itu. Jika tidak, mungkin akan lebih baik untuk mengganti nama.

Untuk mengganti nama atau menonaktifkan perintah Redis, buka berkas konfigurasi sekali lagi:

  • sudo nano /etc/redis/redis.conf

Peringatan: Langkah berikut yang menunjukkan cara menonaktifkan dan mengganti nama perintah adalah contoh. Anda harus hanya memilih untuk menonaktifkan atau mengganti nama perintah yang masuk akal bagi Anda. Anda dapat meninjau daftar lengkap perintah untuk Anda dan menentukan bagaimana perintah itu mungkin dapat disalahgunakan di redis.io/commands.

Untuk menonaktifkan perintah, cukup ganti namanya menjadi string kosong (yang ditandai oleh sepasang tanda kutip tanpa karakter di dalamnya), seperti yang ditunjukkan di bawah ini:

/etc/redis/redis.conf

. . . # It is also possible to completely kill a command by renaming it into # an empty string: # rename-command FLUSHDB "" rename-command FLUSHALL "" rename-command DEBUG "" . . . 

Untuk mengganti nama perintah, beri nama lain seperti yang ditunjukkan dalam contoh di bawah ini. Perintah yang diganti namanya harus sulit ditebak oleh orang lain, tetapi mudah untuk Anda ingat:

/etc/redis/redis.conf

. . . # rename-command CONFIG "" rename-command SHUTDOWN SHUTDOWN_MENOT rename-command CONFIG ASC12_CONFIG . . . 

Simpan perubahan Anda dan tutup berkas.

Setelah mengganti nama perintah, terapkan perubahan dengan memulai ulang Redis:

  • sudo systemctl restart redis.service

Untuk menguji perintah baru, masuk ke baris perintah Redis:

  • redis-cli

Lalu, lakukan autentikasi:

  • auth your_redis_password
OutputOK 

Mari kita berasumsi bahwa Anda telah mengganti nama perintah CONFIG menjadi ASC12_CONFIG, seperti dalam contoh sebelumnya. Pertama-tama, coba gunakan perintah CONFIG yang asli. Ini akan gagal, karena Anda telah mengubah namanya:

  • config get requirepass
Output(error) ERR unknown command `config`, with args beginning with: 

Namun, menggunakan perintah yang telah diubah namanya akan berhasil. Ini tidak peka huruf kapital:

  • asc12_config get requirepass
Output1) "requirepass" 2) "your_redis_password" 

Terakhir, Anda dapat keluar dari redis-cli:

  • exit

Perhatikan bahwa jika Anda sudah menggunakan baris perintah Redis lalu memulai ulang Redis, Anda akan perlu melakukan autentikasi ulang. Jika tidak, Anda akan mendapat pesan kesalahan ini jika Anda mengetik perintah:

OutputNOAUTH Authentication required. 

Mengenai praktik mengganti nama perintah, ada pernyataan peringatan di bagian akhir dari SECURITY di dalam /etc/redis/redis.conf yang berbunyi:

/etc/redis/redis.conf

. . . # Please note that changing the name of commands that are logged into the # AOF file or transmitted to replicas may cause problems. . . . 

Catatan: Proyek Redis memilih untuk menggunakan istilah “master” dan “slave”, sedangkan DigitalOcean secara umum lebih menyukai istilah alternatif “primary” dan “secondary”. Untuk menghindari kebingungan, kami memilih untuk menggunakan istilah yang digunakan dalam dokumentasi Redis di sini.

Artinya, jika penggantian nama perintah tidak ada dalam berkas AOF, atau jika itu ada tetapi berkas AOF belum dikirim ke slave, maka seharusnya tidak ada masalah.

Maka, ingatlah hal itu ketika Anda mencoba mengganti nama perintah. Waktu terbaik untuk mengganti nama perintah adalah saat Anda tidak menggunakan persistensi AOF, atau segera setelah instalasi, yang artinya, sebelum aplikasi yang menggunakan Redis disebarkan.

Ketika Anda menggunakan AOF dan menangani instalasi master-slave, pertimbangkan jawaban dari laman masalah proyek Github ini. Berikut ini adalah jawaban dari pertanyaan penulis:

Perintah-perintah dicatat ke AOF dan direplikasi ke slave dengan cara pengiriman yang sama, maka jika Anda mencoba untuk memainkan AOF kembali pada suatu instans yang tidak memiliki penggantian nama yang sama, Anda mungkin akan menghadapi inkonsistensi karena perintah tidak dapat dieksekusi (sama untuk slave).

Dengan demikian, cara terbaik untuk menangani penggantian nama dalam kasus seperti itu adalah dengan memastikan bahwa mengganti nama perintah diterapkan pada semua instans dalam instalasi master-slave.

Kesimpulan

Dalam tutorial ini, Anda telah menginstal dan mengonfigurasi Redis, memvalidasi bahwa instalasi Redis Anda berfungsi dengan benar, dan menggunakan fitur keamanan bawaannya untuk membuatnya lebih tidak rentan terhadap serangan dari aktor-aktor jahat.

Harap diingat bahwa setelah seseorang log masuk ke server Anda, maka sangat mudah untuk mengakali fitur keamanan spesifik Redis yang kita sudah atur. Oleh karena itu, fitur keamanan yang paling penting pada server Redis adalah firewall (yang Anda konfigurasikan jika Anda mengikuti tutorial prasyarat Penyiapan Server Awal ini, karena ini membuat aktor jahat sangat kesulitan untuk melompati pagar keamanan.