المقدمة
Redis هو مخزن مفاتيح قيمة في الذاكرة المعروف بمرونته وأدائه ودعمه الواسع للغات. يوضح هذا البرنامج التعليمي كيفية تثبيت وتكوين وتأمين Redis على خادم Ubuntu 22.04.
المتطلبات الأولية
لإكمال هذا الدليل، ستحتاج إلى الوصول إلى خادم Ubuntu 22.04 يحتوي على مستخدم غير جذري لديه امتيازات sudo
وجدار ناري مكون بـ ufw
. يمكنك إعداد هذا عن طريق اتباع دليلنا إعداد الخادم الأولي لـ Ubuntu 22.04.
الخطوة 1 — تثبيت وتكوين Redis
سنستخدم مدير حزم APT لتثبيت redis من مستودعات Ubuntu الرسمية. حتى تاريخ كتابة هذا النص، الإصدار المتاح في المستودعات الافتراضية هو 6.0.16.
ابدأ بتحديث ذاكرة التخزين المؤقتة المحلية لحزمة apt
:
ثمقم بتثبيت Redis عن طريقكتابة الأمر:
هذا سيقوم بتنزيل وتثبيت Redis ومرتبطاته. بعد ذلك،هناك تغيير واحد مهمفي ملف تكوين Redis، الذي تم إنشاؤه تلقائيًا أثناء التثبيت.
افتحهذا الملف باستخدام محرر النص المفضللديك:
داخل الملف، ابحث عن توجيه supervised
.يسمحلكهذا التوجيه بتحديد نظام initلإدارة Redisكخدمة، ممايمنحك المزيد من التحكمفي عملها.يتم تعيين توجيه supervised
إلى no
بشكل افتراضي. بما أنك تعمل على Ubuntu، الذييستخدم نظام init systemd،قم بتغييرهذا إلى systemd
:
. . .
# إذاقمت بتشغيل 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 لعرض التغييرات التي قمت بها في ملف التكوين:
مع ذلك، لقد قمت بتثبيت وتكوين Redis وهو يعمل على جهازك. قبل البدء في استخدامه، من الحكمة التحقق أولاً مما إذا كان Redis يعمل بشكل صحيح.
الخطوة 2 — اختبار Redis
مثل أي برنامج جديد تم تثبيته، من الجيد التأكد من أن Redis يعمل كما هو متوقع قبل إجراء أي تغييرات أخرى في تكوينه. سنتناول في هذه الخطوة بعض الطرق للتحقق من أن Redis يعمل بشكل صحيح.
ابدأ بالتحقق مما إذا كانت خدمة 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 يدويًا في كل مرة يتم فيها تشغيل الخادم الخاص بك، يمكنك تكوين هذا باستخدام الأمر التالي:
للاختبار ما إذا كان Redis يعمل بشكل صحيح، قم بالاتصال بالخادم باستخدام redis-cli
، وهو عميل سطر الأوامر الخاص بـ Redis:
في البرومبت الذي يأتي بعده، قم بفحص الاتصال باستخدام أمر ping
:
OutputPONG
يؤكد هذا الإخراج أن اتصال الخادم لا يزال حيًا. بعد ذلك، تحقق من قدرتك على تعيين المفاتيح عن طريق تشغيل الأمر:
OutputOK
استرجع القيمة بكتابة:
بناءً على افتراض أن كل شيء يعمل، ستكون قادرًا على استرداد القيمة التي قمت بتخزينها:
Output"It's working!"
بعد التأكد من قدرتك على استرداد القيمة، اخرج من موجه Redis للعودة إلى الشل:
كاختبار نهائي، سنتحقق مما إذا كان Redis قادرًا على الاحتفاظ بالبيانات حتى بعد إيقاف تشغيله أو إعادة تشغيله. للقيام بذلك، أعد تشغيل نسخة Redis أولاً:
ثم اتصل مرة أخرى باستخدام عميل سطر الأوامر:
وتأكد من أن قيمة الاختبار ما زالت متاحة:
يجب أن تظل قيمة مفتاحك قابلة للوصول:
Output"It's working!"
اخرج مرة أخرى إلى الشل عندما تنتهي:
به ذلك، تثبيت Redis الخاص بكيعمل بشكلكامل وجاهزلاستخدامك. ومع ذلك، بعض إعدادات التكوين الافتراضية له تعد غير آمنة وتوفرللمتطفلين الأشخاص الضارة بالفرصة للهجوم والوصول إلى خادمك وبياناته. تغطي الخطوات المتبقية فيهذا البرنامج التعليمي طرقًاللتخفيف منهذه الثغرات الأمنية، وفقًالماهو موصى به منقبل موقع Redis الرسمي. على الرغم من أنهذه الخطوات اختيارية وستظل Redis تعمل إذالم تتبعها،فمن الموصى به بشدة أن تكملها من أجل تصون أمان نظامك.
الخطوة 3 – الربط بـ localhost
افتراضيًا،يكون Redisفقطقابلاًللوصول من localhost. ومع ذلك، إذاقمت بتثبيت وتكوين Redis بعدة طرق غيرهذه البرنامج التعليمي،فقدقمت بتحديث ملف التكوينللسماح بالاتصالات من أي مكان.هذاليس آمنًا مثل الربط بـ localhost.
لتصحيح ذلك،فتح ملف تكوين Redisللتحرير:
ابحث عنهذا السطر وتأكد منفصله (إزالة الـ #
إذاكان موجودًا):
. . .
bind 127.0.0.1 ::1
. . .
احفظ وأغلق الملف عند الانتهاء (اضغط CTRL + X
، Y
، ثم ENTER
).
ثم، أعد تشغيل الخدمة للتأكد منقراءة systemd تغييراتك:
للتحقق من أنهذا التغييرقد تم تطبيقه، استخدم الأمر netstat
التالي:
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
ملاحظة:قدلايكون الأمر netstat
متاحًا على جهازك افتراضيًا. إذاكانهذاهو الحال،يمكنك تثبيته (جنبًا إلى جنب مع عدد من الأدوات الشبكية المفيدة) باستخدام الأمر التالي:
يظهرهذا الإخراج أن برنامج redis-server
ملزم بـ localhost (127.0.0.1
)، ممايعكس التغيير الذيقمت بهللملف التكوين. إذاكانهناك عنوان IP آخرفيهذا العمود (0.0.0.0
، على سبيل المثال)،فيجب عليك التحقق مرة أخرى من أنكقمت بتعريف السطر الصحيح وإعادة تشغيل خدمة Redis مرة أخرى.
الآن بما أن تثبيت Redisيستمعفقط على localhost، سيكون من الصعب على المتسللين الأشخاص الضارين إجراء طلبات أو الوصول إلى خادمك. ومع ذلك،لايتم تعيين Redis حاليًالطلب من المستخدمين توثيق أنفسهمقبل إجراء تغييرات على تكوينه أو البيانات التييحملها.لحلهذه المشكلة،يسمحلك Redis بطلب من المستخدمين توثيق أنفسهم بكلمة مرورقبل إجراء تغييرات عبر عميل Redis (redis-cli
).
الخطوة 4 – تكوينكلمة مرور Redis
# تحذير: نظرًا لأن ريديس سريع تمامًا ، يمكن للمستخدم الخارجي تجربة
# ما يصل إلى 150 ألف كلمة مرور في الثانية ضد صندوق جيد. هذا يعني أنك يجب
. . .
# استخدام كلمة مرور قوية جدًا وإلا ستكون من السهل كسرها.
. . .
وبالتالي ، من المهم أن تحدد قيمة طويلة قوية للغاية ككلمة مرور. بدلاً من ابتكار كلمة مرور بنفسك ، يمكنك استخدام أمر openssl
لإنشاء واحدة عشوائية ، كما في المثال التالي. عن طريق توصيل إخراج الأمر الأول إلى الأمر openssl
الثاني ، كما هو موضح هنا ، سيزيل أي علامات توقف للسطر الناتجة عن الأمر الأول:
سيعيد هذا الأمر نتائج مثل هذه:بعد نسخ ولصق إخراج ذلك الأمر كقيمة جديدة لـ requirepass
، يجب أن يقرأ:
. . .
بعد تعيين الكلمة المرور ، احفظ وأغلق الملف. ثم أعد تشغيل ريديس:
لاختبار أن الكلمة المرور تعمل ، افتح عميل ريديس:
يوضح الأمر التالي سلسلة من الأوامر المستخدمة لاختبار ما إذا كانت كلمة مرور ريديس تعمل. يحاول الأمر الأول تعيين مفتاح إلى قيمة قبل التوثيق:
#
. . .
هذا لن ينجح لأنك لم تتوثق ، لذا يعيد ريديس خطأ:
الأمر التالي يتوثق بكلمة المرور المحددة في ملف تكوين ريديس:
OutputRBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
يقر ريديس:
/etc/redis/redis.confrequirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
بعد ذلك ، سينجح تشغيل الأمر السابق مرة أخرى:get key1
يستعرض ريديس لقيمة المفتاح الجديد.
لاختبار أنكلمة المرور تعمل، افتح عميل Redis:
الآتييوضح تسلسلًا من الأوامر المستخدمة لاختبار ما إذاكانتكلمة مرور Redis تعمل.يحاول الأمر الأول تعيين مفتاح إلىقيمة قبل التوثيق:
هذالنينجحلأنكلم تتوثق،لذايعيد Redis خطأ:
Output(error) NOAUTH Authentication required.
الأمر التالييتوثق بكلمة المرور المحددة في ملف تكوين Redis:
يقر Redis:
OutputOK
بعد ذلك، تشغيل الأمر السابق مرة أخرى سينجح:
OutputOK
get key1
يستعرض Redisلقيمة المفتاح الجديد.
Output"10"
بعد التأكد من أنكقادر على تشغيل الأوامرفي عميل Redis بعد التوثيق،يمكنك الخروج من redis-cli
:
بعد ذلك، سنناقش إعادة تسمية أوامر Redis التي، إذا تم إدخالها بالخطأ أو منقبل متطفل خارجي،يمكن أنيكونلها تأثيرات خطيرة على بياناتك.
الخطوة 5 – إعادة تسمية أوامر خطيرة
الميزة الأمنية الأخرى المضمنة في Redis تتضمن إعادة تسمية أو تعطيل بعض الأوامر المعتبرة خطيرة.
عندمايتم تشغيل مثلهذه الأوامر منقبل مستخدمين غير مصرحلهم،يمكن استخدامهذه الأوامرلإعادة تكوين أو تدمير أو محو بياناتك. مثلكلمة المرور الخاصة بالتوثيق، إعادة تسمية أو تعطيل الأوامريتم تكوينهافي نفسقسم SECURITY
من ملف /etc/redis/redis.conf
.
بعض الأوامر المعتبرة خطيرة هي: FLUSHDB
, FLUSHALL
, KEYS
, PEXPIRE
, DEL
, CONFIG
, SHUTDOWN
, BGREWRITEAOF
, BGSAVE
, SAVE
, SPOP
, SREM
, RENAME
, و DEBUG
. هذه ليست قائمة شاملة، لكن إعادة تسمية أو تعطيل جميع الأوامر في تلك القائمة هي نقطة بداية جيدة لتحسين أمان خادم Redis الخاص بك.
إذا كنت لا تستخدم أبدًا أمرًا قد يتم إساءة استخدامه، فقد تقرر تعطيله. وإلا فقد يكون من أفضل مصلحتك إعادة تسميته.
لإعادة تسمية أو تعطيل أوامر Redis، فتح ملف التكوين مرة أخرى:
تحذير: الخطوات التالية التي توضح كيفية تعطيل وإعادة تسمية الأوامر هي مثال. يجب عليك فقط اختيار تعطيل أو إعادة تسمية الأوامر التي تبدو منطقية لك. يمكنك مراجعة القائمة الكاملة من الأوامر وتحديد كيف يمكن أن يتم إساءة استخدامها في redis.io/commands.
لتعطيل أمر، أعد تسميته إلى سلسلة فارغة (ممثلة بزوج من علامات الترقيم بدون أحرف بينهما)، كما هو موضح أدناه:
. . .
# من الممكن أيضًا قتل أمر بالكامل عن طريق إعادة تسميته إلى
# سلسلة فارغة:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
. . .
لإعادة تسمية أمر، أعطه اسمًا آخر كما هو موضح في الأمثلة التالية. يجب أن يكون اسم الأوامر المعاد تسميتها صعب التخمين بالنسبة للآخرين، لكنها سهلة لك لتتذكرها:
. . .
# سمية-الأوامر CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
. . .
احفظ التغييرات وأغلق الملف.
بعد إعادة تسمية الأمر، قم بتطبيق التغيير عن طريق إعادة تشغيل Redis:
لاختبار الأمر الجديد، أدخل سطر أوامر Redis:
ثم، توثيق:
OutputOK
لنفترض أنك أعادت تسمية الأمر CONFIG
إلى ASC12_CONFIG
، كما في المثال السابق. أولاً، حاول استخدام الأمر CONFIG
الأصلي. يجب أن يفشل، لأنك أعدت تسميته:
Output(error) ERR unknown command `config`, with args beginning with:
استدعاء الأمر المعاد تسميته، من ناحية أخرى، سيكون ناجحًا. إنه غير حساس لحالة الأحرف:
Output1) "requirepass"
2) "your_redis_password"
أخيرًا، يمكنك الخروج من redis-cli
:
لاحظ أنه إذا كنت تستخدم سطر أوامر Redis وأعدت تشغيل Redis، فستحتاج إلى إعادة التوثيق. وإلا فسوف تتلقى هذا الخطأ إذا أدخلت أمر:
OutputNOAUTH Authentication required.
تحذير: بخصوص ممارسة إعادة تسمية الأوامر، هناك بيان محذر في نهاية قسم SECURITY
في /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