كيفية تثبيت وتأمين ريديس على Rocky Linux 8

مقدمة

Redis هو مخزن بيانات مفتوح المصدر ذو قيمة مفتاحية في الذاكرة يتميز بالتخزين المؤقت. تُعتبر Redis قاعدة بيانات غير علاقية معروفة بمرونتها وأدائها وتوسعها ودعمها الواسع للغات البرمجة.

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

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

يمكنك أيضًا استخدام خدمة Redis المُدارة من قبل DigitalOcean.

الشروط المسبقة

لإكمال هذا البرنامج التعليمي، ستحتاج إلى خادم يعمل بنظام Rocky Linux 8. يجب أن يحتوي هذا الخادم على مستخدم غير جذري يمتلك امتيازات الإدارة وجدار ناري مكون باستخدام firewalld. لإعداد هذا، اتبع دليلنا إعداد الخادم الأولي لـ Rocky Linux 8.

الخطوة 1 — تثبيت وبدء Redis

يمكنك تثبيت Redis باستخدام مدير حزم DNF. باستخدام DNF، يمكنك تثبيت Redis وتبعياته، و nano، محرر نصوص سهل الاستخدام. لا يتعين عليك تثبيت nano، ولكننا سنستخدمه في الأمثلة طوال هذا الدليل:

  1. sudo dnf install redis nano

سيطلب منك هذا الأمر تأكيد رغبتك في تثبيت الحزم المحددة. اضغط على y ثم ENTER للقيام بذلك:

Output
. . . Total download size: 1.5 M Installed size: 5.4 M Is this ok [y/N]: y

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

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

  1. sudo nano /etc/redis.conf

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

/etc/redis.conf
. . .

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

. . .

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

بعد تعديل الملف، قم بتشغيل خدمة Redis:

  1. sudo systemctl start redis.service

إذا كنت ترغب في بدء تشغيل Redis عند التمهيد، يمكنك تمكينه باستخدام الأمر enable:

  1. sudo systemctl enable redis

يرجى ملاحظة أن هذا الأمر لا يتضمن اللاحقة .service بعد اسم ملف الوحدة. عادةً ما يمكنك ترك هذه اللاحقة بعيدة عن أوامر systemctl، لأنه يمكن تحليلها تلقائيًا من أسماء الخدمة.

يمكنك التحقق من حالة Redis عن طريق تشغيل الأمر التالي:

  1. sudo systemctl status redis
Output
● redis.service - Redis persistent key-value database Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled) Drop-In: /etc/systemd/system/redis.service.d └─limit.conf Active: active (running) since Tue 2022-09-06 22:11:52 UTC; 40s ago Main PID: 14478 (redis-server) Tasks: 4 (limit: 11152) Memory: 6.6M CGroup: /system.slice/redis.service └─14478 /usr/bin/redis-server 127.0.0.1:6379

بمجرد تأكيدك أن Redis يعمل بالفعل، يمكنك اختبار وظائفه باستخدام هذا الأمر:

  1. redis-cli ping

يجب أن يطبع هذا الأمر PONG كرد:

Output
PONG

إذا كانت هذه هي الحالة، فهذا يعني أنك الآن قمت بتشغيل Redis على خادمك ويمكنك البدء في تكوينه لتعزيز أمانه.

الخطوة 2 — تكوين Redis وتأمينه بجدار ناري

طريقة فعالة لحماية Redis هي تأمين الخادم الذي يعمل عليه. يمكنك القيام بذلك عن طريق التأكد من أن Redis مقيد إما بـ localhost أو بعنوان IP خاص وأيضًا التأكد من وجود جدار ناري يعمل على الخادم.

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

لحل هذه المشكلة، افتح ملف تكوين Redis مرة أخرى باستخدام محرر النص الخاص بك:

  1. sudo nano /etc/redis.conf

ابحث عن السطر الذي يبدأ بـ bind وتأكد من أنه لم يتم تعليقه أو تعطيله، عن طريق إزالة علامة # في بداية السطر إذا كان ذلك ضرورياً:

/etc/redis.conf
. . .
bind 127.0.0.1

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

/etc/redis.conf
. . .
bind your_private_ip

بعد التأكد من أن التوجيه bind لم يتم تعليقه، يمكنك حفظ الملف وإغلاقه.

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

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

للبدء، أضف منطقة Redis مخصصة إلى سياسة firewalld الخاصة بك:

  1. sudo firewall-cmd --permanent --new-zone=redis

ثم حدد أي منفذ ترغب في فتحه. يستخدم Redis المنفذ \code{6379} افتراضيًا:

  1. sudo firewall-cmd --permanent --zone=redis --add-port=6379/tcp

بعد ذلك، حدد أي عناوين IP خاصة يجب السماح لها بالمرور من خلال جدار الحماية والوصول إلى Redis:

  1. sudo firewall-cmd --permanent --zone=redis --add-source=client_server_private_IP

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

  1. sudo firewall-cmd --reload

في إعداد هذا، عندما يواجه جدار الحماية حزمة من عنوان IP الخاص بعميلك، سيقوم بتطبيق القواعد في منطقة Redis المخصصة على تلك الاتصالة. سيتم معالجة جميع الاتصالات الأخرى بواسطة منطقة \code{public} الافتراضية. تطبق الخدمات في المنطقة الافتراضية على كل اتصال، لا فقط تلك التي لا تتطابق صراحة، لذلك لا يلزمك إضافة خدمات أخرى (مثل SSH) إلى منطقة Redis لأن تلك القواعد سيتم تطبيقها على هذا الاتصال تلقائيًا.

ضع في اعتبارك أن استخدام أي أداة جدار حماية سيكون فعالًا، سواء استخدمت \code{firewalld}، \code{ufw}، أو \code{iptables}. الأهم هو أن جدار الحماية قيد التشغيل حتى لا يتمكن الأفراد الغير معروفين من الوصول إلى خادمك. في الخطوة التالية، ستقوم بتكوين Redis لتكون متاحة فقط بكلمة مرور قوية.

الخطوة 3 — تكوين كلمة مرور Redis

تكوين كلمة مرور Redis يمكّن أحد ميزات الأمان المضمّنة فيه — أمر auth — الذي يتطلب من العملاء المصادقة قبل السماح لهم بالوصول إلى قاعدة البيانات. مثل إعداد bind، يتم تكوين كلمة المرور مباشرة في ملف تكوين Redis، /etc/redis.conf. قم بفتح هذا الملف:

  1. sudo nano /etc/redis.conf

انتقل إلى القسم SECURITY وابحث عن توجيه معلق يقرأ:

/etc/redis.conf
. . .
# requirepass foobared

ألغِ التعليق عنه بإزالة الرمز #، وغيّر foobared إلى كلمة مرور قوية جدًا من اختيارك.

ملاحظة: بدلاً من اختراع كلمة مرور بنفسك، يمكنك استخدام أداة مثل apg أو pwgen لتوليد واحدة. إذا كنت لا ترغب في تثبيت تطبيق فقط لتوليد كلمة مرور، فيمكنك استخدام الأمر التالي. هذا الأمر يقوم بإخراج قيمة سلسلة ويرسلها إلى الأمر sha256sum التالي، الذي سيعرض مؤشر التدقيق SHA256 للسلسلة.

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

  1. echo "digital-ocean" | sha256sum

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

/etc/redis.conf
. . .
requirepass password_copied_from_output

بدلاً من ذلك، إذا كنت تفضل كلمة مرور أقصر، يمكنك بدلاً من ذلك استخدام نتيجة تدقيق مختلفة. مرة أخرى، قم بتغيير الكلمة بين الاقتباسات حتى لا تُولد نفس كلمة المرور بهذا الأمر:

  1. echo "digital-ocean" | sha1sum

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

  1. sudo systemctl restart redis

للاختبار ما إذا كانت كلمة المرور تعمل، افتح عميل 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-cli. يمكنك أيضاً استخدام exit:

  1. quit

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

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

الخطوة 4 — إعادة تسمية الأوامر الخطرة

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

  • FLUSHDB
  • FLUSHALL
  • KEYS
  • PEXPIRE
  • DEL
  • CONFIG
  • SHUTDOWN
  • BGREWRITEAOF
  • BGSAVE
  • SAVE
  • SPOP
  • SREM
  • RENAME
  • DEBUG

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

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

  1. sudo nano /etc/redis.conf

ملاحظة: هذه أمثلة. يجب عليك اختيار تعطيل أو إعادة تسمية الأوامر التي تبدو منطقية بالنسبة لك. يمكنك معرفة المزيد عن أوامر Redis وتحديد كيف يمكن استخدامها بشكل غير صحيح على redis.io/commands.

لتعطيل أو قتل الأمر، أعد تسميته إلى سلسلة فارغة، مثل هذا:

/etc/redis.conf
# من الممكن أيضًا قتل الأمر تمامًا عن طريق إعادة تسميته إلى 
# سلسلة فارغة: 
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""

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

/etc/redis.conf
# من الممكن أيضًا قتل الأمر تمامًا عن طريق إعادة تسميته إلى 
# سلسلة فارغة: 
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
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'

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

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

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

  1. exit

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

/etc/redis.conf
. . .

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

. . .

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

الخطوة 5 — ضبط ملكية وأذونات دليل البيانات

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

يمكنك التحقق من ذلك عن طريق grep لدليل بيانات Redis في قائمة طويلة من دليله الرئيسي. يتم إعطاء هذا الأمر وإخراجه أدناه:

  1. ls -l /var/lib | grep redis
Output
drwxr-x---. 2 redis redis 22 Sep 6 22:22 redis

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

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

  1. sudo chmod 770 /var/lib/redis

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

  1. ls -l /etc/redis.conf
Output
-rw-r-----. 1 redis root 62192 Sep 6 22:20 /etc/redis.conf

هذه الأذونات (640) تعني أن ملف تكوين Redis قابل للقراءة فقط بواسطة مستخدم redis ومجموعة root. بما أن ملف التكوين يحتوي على كلمة المرور غير المشفرة التي قمت بتكوينها في الخطوة 4، يجب أن يملك ملف redis.conf من قبل مستخدم redis، مع ملكية ثانوية من قبل مجموعة redis. لتعيين ذلك، قم بتشغيل الأمر التالي:

  1. sudo chown redis:redis /etc/redis.conf

ثم قم بتغيير الأذونات بحيث يمكن لصاحب الملف فقط قراءته وكتابته:

  1. sudo chmod 600 /etc/redis.conf

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

  1. ls -l /var/lib | grep redis
Output
total 40 drwxrwx---. 2 redis redis 22 Sep 6 22:22 redis
  1. ls -l /etc/redis.conf
Output
total 40 -rw-------. 1 redis redis 62192 Sep 6 22:20 /etc/redis.conf

أخيرًا، قم بإعادة تشغيل Redis لعرض هذه التغييرات:

  1. sudo systemctl restart redis

بهذا، تم تأمين تثبيت Redis الخاص بك.

الختام

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

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-rocky-linux-8