كيفية تثبيت وتأمين Redis على أوبونتو 22.04

المقدمة

Redis هو مخزن مفاتيح قيمة في الذاكرة المعروف بمرونته وأدائه ودعمه الواسع للغات. يوضح هذا البرنامج التعليمي كيفية تثبيت وتكوين وتأمين Redis على خادم Ubuntu 22.04.

المتطلبات الأولية

لإكمال هذا الدليل، ستحتاج إلى الوصول إلى خادم Ubuntu 22.04 يحتوي على مستخدم غير جذري لديه امتيازات sudo وجدار ناري مكون بـ ufw. يمكنك إعداد هذا عن طريق اتباع دليلنا إعداد الخادم الأولي لـ Ubuntu 22.04.

الخطوة 1 — تثبيت وتكوين Redis

سنستخدم مدير حزم APT لتثبيت redis من مستودعات Ubuntu الرسمية. حتى تاريخ كتابة هذا النص، الإصدار المتاح في المستودعات الافتراضية هو 6.0.16.

ابدأ بتحديث ذاكرة التخزين المؤقتة المحلية لحزمة apt:ثم قم بتثبيت Redis عبر كتابة:

  1. sudo apt update

ثمقم بتثبيت Redis عن طريقكتابة الأمر:

  1. sudo apt install redis-server

هذا سيقوم بتنزيل وتثبيت Redis ومرتبطاته. بعد ذلك،هناك تغيير واحد مهمفي ملف تكوين Redis، الذي تم إنشاؤه تلقائيًا أثناء التثبيت.

افتحهذا الملف باستخدام محرر النص المفضللديك:

  1. sudo nano /etc/redis/redis.conf

داخل الملف، ابحث عن توجيه supervised.يسمحلكهذا التوجيه بتحديد نظام initلإدارة Redisكخدمة، ممايمنحك المزيد من التحكمفي عملها.يتم تعيين توجيه supervised إلى no بشكل افتراضي. بما أنك تعمل على Ubuntu، الذييستخدم نظام init systemd،قم بتغييرهذا إلى systemd:

/etc/redis/redis.conf
. . .

# إذاقمت بتشغيل Redis من upstart أو systemd،يمكنلـ Redis التفاعل مع شجرة الإشراف الخاصة بك.
# الخيارات:
#   supervised no      -لا تفاعلللإشراف
#   supervised upstart - توجيه upstart عن طريق وضع Redisفي وضع SIGSTOP
#   supervised systemd - توجيه systemd عن طريقكتابة READY=1 إلى $NOTIFY_SOCKET
#   supervised auto    - الكشف عن طريقة upstart أو systemd بناءً على
#                        متغيرات البيئة UPSTART_JOB أو NOTIFY_SOCKET
# ملاحظة:هذه طرق الإشراف تشيرفقط إلى "العملية جاهزة."
#       لايتم تمكين الأصداء الحيوية المستمرة مرة أخرى إلى مراقبك.
supervised systemd

. . .

هذه هي الوحيدة التي تحتاج إلى تغييره في ملف تكوين Redis في هذه المرحلة، لذا قم بحفظه وإغلاقه عند الانتهاء. إذا استخدمت nano لتحرير الملف، فافعل ذلك عن طريق الضغط على CTRL + X، Y، ثم ENTER.

ثم، أعد تشغيل خدمة Redis لعرض التغييرات التي قمت بها في ملف التكوين:

  1. sudo systemctl restart redis.service

مع ذلك، لقد قمت بتثبيت وتكوين Redis وهو يعمل على جهازك. قبل البدء في استخدامه، من الحكمة التحقق أولاً مما إذا كان Redis يعمل بشكل صحيح.

الخطوة 2 — اختبار Redis

مثل أي برنامج جديد تم تثبيته، من الجيد التأكد من أن Redis يعمل كما هو متوقع قبل إجراء أي تغييرات أخرى في تكوينه. سنتناول في هذه الخطوة بعض الطرق للتحقق من أن Redis يعمل بشكل صحيح.

ابدأ بالتحقق مما إذا كانت خدمة Redis قيد التشغيل:

  1. sudo systemctl status redis

إذا كانت تعمل دون أي أخطاء، فسينتج هذا الأمر إخراجًا مشابهًا لما يلي:

Output
● redis-server.service - Advanced key-value store Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2022-04-20 20:40:52 UTC; 4s ago Docs: http://redis.io/documentation, man:redis-server(1) Main PID: 2899 (redis-server) Status: "Ready to accept connections" Tasks: 5 (limit: 2327) Memory: 2.5M CPU: 65ms CGroup: /system.slice/redis-server.service └─2899 "/usr/bin/redis-server 127.0.0.1:6379 . . .

يشير هذا الإخراج إلى أن Redis يعمل بالفعل وممكّن بالفعل، مما يعني أنه مضبوط للبدء في كل مرة يتم فيها تشغيل الخادم.

ملاحظة: هذا الإعداد مرغوب فيه للعديد من حالات الاستخدام الشائعة لـ Redis. إذا كنت، ومع ذلك، تفضل بتشغيل Redis يدويًا في كل مرة يتم فيها تشغيل الخادم الخاص بك، يمكنك تكوين هذا باستخدام الأمر التالي:

  1. sudo systemctl disable redis

للاختبار ما إذا كان Redis يعمل بشكل صحيح، قم بالاتصال بالخادم باستخدام redis-cli، وهو عميل سطر الأوامر الخاص بـ Redis:

  1. redis-cli

في البرومبت الذي يأتي بعده، قم بفحص الاتصال باستخدام أمر ping:

  1. ping
Output
PONG

يؤكد هذا الإخراج أن اتصال الخادم لا يزال حيًا. بعد ذلك، تحقق من قدرتك على تعيين المفاتيح عن طريق تشغيل الأمر:

  1. set test "It's working!"
Output
OK

استرجع القيمة بكتابة:

  1. get test

بناءً على افتراض أن كل شيء يعمل، ستكون قادرًا على استرداد القيمة التي قمت بتخزينها:

Output
"It's working!"

بعد التأكد من قدرتك على استرداد القيمة، اخرج من موجه Redis للعودة إلى الشل:

  1. exit

كاختبار نهائي، سنتحقق مما إذا كان Redis قادرًا على الاحتفاظ بالبيانات حتى بعد إيقاف تشغيله أو إعادة تشغيله. للقيام بذلك، أعد تشغيل نسخة Redis أولاً:

  1. sudo systemctl restart redis

ثم اتصل مرة أخرى باستخدام عميل سطر الأوامر:

  1. redis-cli

وتأكد من أن قيمة الاختبار ما زالت متاحة:

  1. get test

يجب أن تظل قيمة مفتاحك قابلة للوصول:

Output
"It's working!"

اخرج مرة أخرى إلى الشل عندما تنتهي:بهذا، تكون تثبيت Redis الخاص بك جاهزًا للاستخدام بالكامل. ومع ذلك، بعض إعدادات التكوين الافتراضية له غير آمنة وتوفر للمهاجمين الفرص للهجوم والوصول إلى الخادم وبياناته. تغطي الخطوات المتبقية في هذا البرنامج التعليمي الطرق للتخفيف من هذه الضعف، كما يوصي بها موقع Redis الرسمي. على الرغم من أن هذه الخطوات اختيارية وسيعمل Redis بشكل طبيعي إذا اخترت عدم اتباعها، فمن موصىً به بشدة إكمالها لتعزيز أمان نظامك.

  1. exit

به ذلك، تثبيت Redis الخاص بكيعمل بشكلكامل وجاهزلاستخدامك. ومع ذلك، بعض إعدادات التكوين الافتراضية له تعد غير آمنة وتوفرللمتطفلين الأشخاص الضارة بالفرصة للهجوم والوصول إلى خادمك وبياناته. تغطي الخطوات المتبقية فيهذا البرنامج التعليمي طرقًاللتخفيف منهذه الثغرات الأمنية، وفقًالماهو موصى به منقبل موقع Redis الرسمي. على الرغم من أنهذه الخطوات اختيارية وستظل Redis تعمل إذالم تتبعها،فمن الموصى به بشدة أن تكملها من أجل تصون أمان نظامك.

الخطوة 3 – الربط بـ localhost

افتراضيًا،يكون Redisفقطقابلاًللوصول من localhost. ومع ذلك، إذاقمت بتثبيت وتكوين Redis بعدة طرق غيرهذه البرنامج التعليمي،فقدقمت بتحديث ملف التكوينللسماح بالاتصالات من أي مكان.هذاليس آمنًا مثل الربط بـ localhost.

لتصحيح ذلك،فتح ملف تكوين Redisللتحرير:

  1. sudo nano /etc/redis/redis.conf

ابحث عنهذا السطر وتأكد منفصله (إزالة الـ # إذاكان موجودًا):

/etc/redis/redis.conf
. . .
bind 127.0.0.1 ::1
. . .

احفظ وأغلق الملف عند الانتهاء (اضغط CTRL + X، Y، ثم ENTER).

ثم، أعد تشغيل الخدمة للتأكد منقراءة systemd تغييراتك:

  1. sudo systemctl restart redis

للتحقق من أنهذا التغييرقد تم تطبيقه، استخدم الأمر netstat التالي:

  1. sudo netstat -lnp | grep redis
Output
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 14222/redis-server tcp6 0 0 ::1:6379 :::* LISTEN 14222/redis-server

ملاحظة:قدلايكون الأمر netstat متاحًا على جهازك افتراضيًا. إذاكانهذاهو الحال،يمكنك تثبيته (جنبًا إلى جنب مع عدد من الأدوات الشبكية المفيدة) باستخدام الأمر التالي:

  1. sudo apt install net-tools

يظهرهذا الإخراج أن برنامج redis-server ملزم بـ localhost (127.0.0.1)، ممايعكس التغيير الذيقمت بهللملف التكوين. إذاكانهناك عنوان IP آخرفيهذا العمود (0.0.0.0، على سبيل المثال)،فيجب عليك التحقق مرة أخرى من أنكقمت بتعريف السطر الصحيح وإعادة تشغيل خدمة Redis مرة أخرى.

الآن بما أن تثبيت Redisيستمعفقط على localhost، سيكون من الصعب على المتسللين الأشخاص الضارين إجراء طلبات أو الوصول إلى خادمك. ومع ذلك،لايتم تعيين Redis حاليًالطلب من المستخدمين توثيق أنفسهمقبل إجراء تغييرات على تكوينه أو البيانات التييحملها.لحلهذه المشكلة،يسمحلك Redis بطلب من المستخدمين توثيق أنفسهم بكلمة مرورقبل إجراء تغييرات عبر عميل Redis (redis-cli).

الخطوة 4 – تكوينكلمة مرور Redis

# تحذير: نظرًا لأن ريديس سريع تمامًا ، يمكن للمستخدم الخارجي تجربة

  1. sudo nano /etc/redis/redis.conf

# ما يصل إلى 150 ألف كلمة مرور في الثانية ضد صندوق جيد. هذا يعني أنك يجب

/etc/redis/redis.conf
. . .
# استخدام كلمة مرور قوية جدًا وإلا ستكون من السهل كسرها.
. . .

وبالتالي ، من المهم أن تحدد قيمة طويلة قوية للغاية ككلمة مرور. بدلاً من ابتكار كلمة مرور بنفسك ، يمكنك استخدام أمر openssl لإنشاء واحدة عشوائية ، كما في المثال التالي. عن طريق توصيل إخراج الأمر الأول إلى الأمر openssl الثاني ، كما هو موضح هنا ، سيزيل أي علامات توقف للسطر الناتجة عن الأمر الأول:

سيعيد هذا الأمر نتائج مثل هذه:بعد نسخ ولصق إخراج ذلك الأمر كقيمة جديدة لـ requirepass ، يجب أن يقرأ:

/etc/redis/redis.conf
. . .
بعد تعيين الكلمة المرور ، احفظ وأغلق الملف. ثم أعد تشغيل ريديس:
لاختبار أن الكلمة المرور تعمل ، افتح عميل ريديس:
يوضح الأمر التالي سلسلة من الأوامر المستخدمة لاختبار ما إذا كانت كلمة مرور ريديس تعمل. يحاول الأمر الأول تعيين مفتاح إلى قيمة قبل التوثيق:
#
. . .

هذا لن ينجح لأنك لم تتوثق ، لذا يعيد ريديس خطأ:

  1. openssl rand 60 | openssl base64 -A

الأمر التالي يتوثق بكلمة المرور المحددة في ملف تكوين ريديس:

Output
RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

يقر ريديس:

/etc/redis/redis.conf
requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

بعد ذلك ، سينجح تشغيل الأمر السابق مرة أخرى:get key1 يستعرض ريديس لقيمة المفتاح الجديد.

  1. sudo systemctl restart redis.service

لاختبار أنكلمة المرور تعمل، افتح عميل Redis:

  1. redis-cli

الآتييوضح تسلسلًا من الأوامر المستخدمة لاختبار ما إذاكانتكلمة مرور Redis تعمل.يحاول الأمر الأول تعيين مفتاح إلىقيمة قبل التوثيق:

  1. set key1 10

هذالنينجحلأنكلم تتوثق،لذايعيد Redis خطأ:

Output
(error) NOAUTH Authentication required.

الأمر التالييتوثق بكلمة المرور المحددة في ملف تكوين Redis:

  1. auth your_redis_password

يقر Redis:

Output
OK

بعد ذلك، تشغيل الأمر السابق مرة أخرى سينجح:

  1. set key1 10
Output
OK

get key1يستعرض Redisلقيمة المفتاح الجديد.

  1. get key1
Output
"10"

بعد التأكد من أنكقادر على تشغيل الأوامرفي عميل Redis بعد التوثيق،يمكنك الخروج من redis-cli:

  1. quit

بعد ذلك، سنناقش إعادة تسمية أوامر Redis التي، إذا تم إدخالها بالخطأ أو منقبل متطفل خارجي،يمكن أنيكونلها تأثيرات خطيرة على بياناتك.

الخطوة 5 – إعادة تسمية أوامر خطيرة

الميزة الأمنية الأخرى المضمنة في Redis تتضمن إعادة تسمية أو تعطيل بعض الأوامر المعتبرة خطيرة.

عندمايتم تشغيل مثلهذه الأوامر منقبل مستخدمين غير مصرحلهم،يمكن استخدامهذه الأوامرلإعادة تكوين أو تدمير أو محو بياناتك. مثلكلمة المرور الخاصة بالتوثيق، إعادة تسمية أو تعطيل الأوامريتم تكوينهافي نفسقسم SECURITY من ملف /etc/redis/redis.conf.

بعض الأوامر المعتبرة خطيرة هي: FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME, و DEBUG. هذه ليست قائمة شاملة، لكن إعادة تسمية أو تعطيل جميع الأوامر في تلك القائمة هي نقطة بداية جيدة لتحسين أمان خادم Redis الخاص بك.

إذا كنت لا تستخدم أبدًا أمرًا قد يتم إساءة استخدامه، فقد تقرر تعطيله. وإلا فقد يكون من أفضل مصلحتك إعادة تسميته.

لإعادة تسمية أو تعطيل أوامر Redis، فتح ملف التكوين مرة أخرى:

  1. sudo nano /etc/redis/redis.conf

تحذير: الخطوات التالية التي توضح كيفية تعطيل وإعادة تسمية الأوامر هي مثال. يجب عليك فقط اختيار تعطيل أو إعادة تسمية الأوامر التي تبدو منطقية لك. يمكنك مراجعة القائمة الكاملة من الأوامر وتحديد كيف يمكن أن يتم إساءة استخدامها في redis.io/commands.

لتعطيل أمر، أعد تسميته إلى سلسلة فارغة (ممثلة بزوج من علامات الترقيم بدون أحرف بينهما)، كما هو موضح أدناه:

/etc/redis/redis.conf
. . .


# من الممكن أيضًا قتل أمر بالكامل عن طريق إعادة تسميته إلى

# سلسلة فارغة:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
. . .

لإعادة تسمية أمر، أعطه اسمًا آخر كما هو موضح في الأمثلة التالية. يجب أن يكون اسم الأوامر المعاد تسميتها صعب التخمين بالنسبة للآخرين، لكنها سهلة لك لتتذكرها:

/etc/redis/redis.conf
. . .
# سمية-الأوامر CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
. . .

احفظ التغييرات وأغلق الملف.

بعد إعادة تسمية الأمر، قم بتطبيق التغيير عن طريق إعادة تشغيل Redis:

  1. sudo systemctl restart redis.service

لاختبار الأمر الجديد، أدخل سطر أوامر Redis:

  1. redis-cli

ثم، توثيق:

  1. auth your_redis_password
Output
OK

لنفترض أنك أعادت تسمية الأمر CONFIG إلى ASC12_CONFIG، كما في المثال السابق. أولاً، حاول استخدام الأمر CONFIG الأصلي. يجب أن يفشل، لأنك أعدت تسميته:

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

استدعاء الأمر المعاد تسميته، من ناحية أخرى، سيكون ناجحًا. إنه غير حساس لحالة الأحرف:

  1. asc12_config get requirepass
Output
1) "requirepass" 2) "your_redis_password"

أخيرًا، يمكنك الخروج من redis-cli:

  1. exit

لاحظ أنه إذا كنت تستخدم سطر أوامر Redis وأعدت تشغيل Redis، فستحتاج إلى إعادة التوثيق. وإلا فسوف تتلقى هذا الخطأ إذا أدخلت أمر:

Output
NOAUTH Authentication required.

تحذير: بخصوص ممارسة إعادة تسمية الأوامر، هناك بيان محذر في نهاية قسم SECURITY في /etc/redis/redis.conf يقرأ:

/etc/redis/redis.conf
. . .
# يرجى ملاحظة أن تغيير اسم الأوامر التي يتم تسجيلها في
# ملف AOF أو نقلها إلى الموالين قد يسبب مشاكل.
. . .

ملاحظة: يختار مشروع Redis استخدام المصطلحات “master” و “slave”، بينما يفضل DigitalOcean بشكل عام البدائل “primary” و “secondary.” من أجل تجنب الارتباك قمنا باستخدام المصطلحات المستخدمة في وثائق Redis هنا.

يعني ذلك إذا لم تكن الأمر المعروفة باسم آخر في ملف AOF ، أو إذا كان موجودًا في الملف ولكن لم يتم نقل ملف AOF إلى العبارات ، فلا ينبغي أن يكون هناك مشكلة.

لذا ، ضع ذلك في الاعتبار عند محاولة تغيير اسم الأوامر. أفضل وقت لتغيير اسم الأمر هو عندما لا تستخدم الاستمرارية الموجهة بالملفات AOF ، أو بعد التثبيت ، أي قبل نشر تطبيقك الذي يستخدم Redis.

عند استخدام AOF والتعامل مع تثبيت المعلم والعبيد ، ضع في اعتبارك هذه الإجابة من صفحة شوط المشروع على GitHub. الآتي هو ردًا على سؤال المؤلف:

يتم تسجيل الأوامر في ملف AOF وتكرارها إلى العبيد بنفس الطريقة التي يتم إرسالها بها ، لذلك إذا حاولت إعادة تشغيل ملف AOF على مثيل لا يمتلك نفس التعديل في التسمية ، قد تواجه عدم التناغم لأن الأمر لا يمكن تنفيذه (نفس الشيء بالنسبة للعبيد).

وبالتالي ، فإن أفضل طريقة للتعامل مع تغيير التسمية في مثل هذه الحالات هي التأكد من تطبيق الأوامر المعروفة باسم آخر على جميع المثيلات في تثبيتات المعلم والعبيد.

الخاتمة

في هذا البرنامج التعليمي ، قمت بتثبيت وتكوين Redis ، واختبرت أن تثبيت Redis الخاص بك يعمل بشكل صحيح ، واستخدمت ميزات الأمان المضمنة فيه لجعله أقل عرضة للهجوم من قبل الأطراف الضارة.

لذلك، يعد أهم ميزة أمان على خادم Redis الخاص بك هو جدار الحماية الخاص بك (الذي قمت بتكوينه إذا اتبعت الدليل الأساسي لإعداد الخادم Initial Server Setup)، حيث يجعل من الصعب للمهاجمين الخبيثين تجاوز تلك الحاجز.

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-22-04