Redis عبارة عن مخزن يعتمد على مفتاح وقيمته ويُعرف بمرونته، وأدائه، ودعمه العديد من اللغات. يوضح هذا المقال كيفية تثبيت وإعداد وتأمين Redis على خادم أوبونتو 18.04.
المتطلبات
ستحتاج إلى الدخول إلى خادم أوبونتو 18.04 والذي لا يملك صلاحيات مستخدم مسؤول ويملك صلاحيات sudo
. بالإضافة إلى جدار حماية معد. يمكنك إعداد ذلك من خلال مقال التهيئة الأولية لِخادم أوبونتو.
للبدء سجل دخولك إلى خادم أوبونتو 18.04 باستخدام مستخدم sudo
وليس مستخدم مسؤول.
خطوة 1 - تثبيت وإعداد Redis
للحصول على أحدث إصدار من Redis، سنستخدم الأمر apt
لتثبيته من متجر أوبونتو الرسمي.
حدِّث ذاكرة التخزين المؤقتة لحزمة apt
وثبت Redis باستخدام الأمرين التاليين:
$ sudo apt update
$ sudo apt install redis-server
تنفيذ هذان الأمران سيؤدي إلى تنزيلRedis وتثبيته بالإضافة إلى تثبيت كل الأشياء المتعلقة به. بعد ذلك، يوجد إعداد مهم يجب تغييره في ملف إعداد Redis والذي وُلد تلقائيا أثناء التثبيت. افتح هذا الملف بأي محرر تفضله:
$ sudo nano /etc/redis/redis.conf
ابحث عن supervised
في الملف. تتيح لك هذه التعليمة تعريف init
في النظام لإضافة Redis كخدمة، مما يتيح لك تحكمًا أفضل بعملياته. تعليمة supervised
تكون معطلة no
بشكل افتراضي. غيِّر قيمة no
إلى systemd
؛ ذلك لأنك تستخدم أوبونتو المعتمد على نظام "systemd init".
- الملف /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 . . .
حتى الآن هذا هو التعديل الوحيد الذي نحتاج القيام به في ملف إعداد Redis. احفظ الملف واغلقه بعد تعديله. ثم أعد تشغيل خدمة Redis لتصبح التغييرات التي أجريتها على الملف سارية المفعول.
$ sudo systemctl restart redis.service
وبهذا تكون قد أعددت Redis، لكن قبل استخدامة يجب التأكد من أنه يعمل بالطريقة الصحيحة.
خطوة 2 - اختبار Redis
يفضل التأكد من صحة عمل أي برنامج جديد قبل تغيير أي من إعداداته. في هذه الخطوة سنتعرف على بعض الطرق للتأكد من ذلك.
نبدأ بالتأكد من أن خدمة Redis تعمل:
$ sudo systemctl status redis
ستظهر مخرجات مشابهة لما يلي في حال كان Redis يعمل بدون أي أخطاء:
المخرجات:
● redis-server.service - Advanced key-value store
Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2018-06-27 18:48:52 UTC; 12s ago
Docs: http://redis.io/documentation,
man:redis-server(1)
Process: 2421 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS)
Process: 2424 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
Main PID: 2445 (redis-server)
Tasks: 4 (limit: 4704)
CGroup: /system.slice/redis-server.service
└─2445 /usr/bin/redis-server 127.0.0.1:6379
. . .
يمكنك رؤية أن Redis مُفعَّل وقيد التشغيل، ما يعني أنه معد كي يبدأ التشغيل مع بدء تشغيل الخادم.
ملاحظة: هذا الإعداد مستحسن في أغلب حالات استخدام Redis. إن كنت تفضل تشغيل Redis يدويا في كل مرة تحتاج إليه. يمكنك القيام بذلك باستخدام الأمر:
$ sudo systemctl disable redis
لاختبار صحة أداء Redis، اتصل بالخادم باستخدام سطر أوامر العميل:
$ redis-cli
في الشاشة التالية، اختبر الاتصال باستخدام أمر ping:
127.0.0.1:6379> ping
المخرجات:
PONG
تأكد هذه المخرجات أن اتصال الخادم مفعل. بعد ذلك، تأكد من إمكانية إعداد المفاتيح باستخدام الأمر:
127.0.0.1:6379> set test "It's working!"
المخرجات:
OK
استرجِع القيمة باستخدام الأمر:
127.0.0.1:6379> get test
ستتمكن من استرجاع القيمة التي أدخلتها في حال كان كل شيء يعمل بشكل صحيح:
المخرجات:
"It's working!"
بعد تأكدك من إمكانية استرجاع القيمة، أغلق شاشة تنفيذ أوامر Redis:
127.0.0.1:6379> exit
كاختبار أخير لفحص ما إن كان Redis قادرا على الاستمرار حتى بعد إبقافة أو إعادة تشغيله. لتطبيق هذا الاختبار نبدأ بإعادة تشغيل Redis:
$ sudo systemctl restart redis
اتصل بشاشة أوامر عميل Redis مرة أخرى وتأكد من بقاء القيمة التي خزنتها:
$ redis-cli
127.0.0.1:6379> get test
يجب أن تظل القيمة المخزنة متاحة:
المخرجات:
"It's working!"
أخرج مجددَا بعد انتهائك:
127.0.0.1:6379> exit
وبذلك، يكون Redis مثبتَا ويعمل بشكل صحيح وجاهز للاستخدام. بالرغم من ذلك، ما تزال بعض إعداداته الافتراضية غير آمنة وتوفر بعض الفرص للأشخاص المخترقون للهجوم على الخادم وبياناته. تشرح باقي الخطوات في هذا المقال بعض الطرق لتقليل هذه الثغرات الأمنية كما ذكر في موقع Redis الرسمي. هذه الخطوات اختيارية وسيستمر Redis بالعمل حتى لو لم تنفذها، لكن يفضل أن تكمل هذه الخطوات لتقوية أمن نظامك.
خطوة 3 - الربط مع المضيف المحلي (localhost)
Redis متاح تلقائيا عبر المضيف المحلي، لكن إن كنت قد ثبتت Redis بطريقة أخرى فربما تكون قد حدَّثت ملف الإعداد الخاص ب Redis الأمر الذي يتيح اتصالات Redis من أي مكان. هذا الأمر غير آمن كالربط بالمضيف المحلي.
لتصحيح الأمر، افتح ملف تكوين Redis لتعديله:
sudo nano /etc/redis/redis.conf
إذهب إلى السطر التالي وتأكد من إلغاء تعليقه (احذِف # إن وجدت):
- الملف /etc/redis/redis.conf:
bind 127.0.0.1 ::1
احفظ الملف واغلقه عند الانتهاء (اضغط على CTRL + X
, Y
, ثم ENTER
). أعد تشغيل الخدمة للتأكد من قراءة النظام للتغييرات:
$ sudo systemctl restart redis
للتأكد من تأثير هذه التغييرات، نفِّذ أمر netstat
التالي:
$ sudo netstat -lnp | grep redis
المخرجات:
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 14222/redis-server
tcp 0 0 ::1:6379 :::* LISTEN 14222/redis-server
توضح هذه المخرجات أن برنامج خادم Redis مرتبط بالمضيف المحلي (127.0.0.1). مما يدل على انعكاس التغيير الذي أجريته على ملف التكوين. إن رأيت عنوان بروتوكول إنترنت آخر (مثل 0.0.0.0) فتأكد من إلغاء تعليق السطر المطلوب وأعد تشغيل خدمة Redis مجددَا.
الآن وبعد أن أصبح Redis مربوطا بالمضيف المحلي فقط سيصبح من الصعب على جهات الاختراق تقديم الطلبات أو الوصول إلى الخادم. مع ذلك لا يزال Redis غير معد لِطلب المصادقة من المستخدمين قبل القيام بأي تغيير على إعداداته أو البيانات التي يحتفظ بها. لمعالجة هذا، يتيح لك Redis طلب تأكيد هوية من المستخدمين باستخدام كلمة مرور قبل إحداث ي تغيير وذلك باستخدام الأمر (redis-cli
).
خطوة 4 - إعداد كلمة مرور Redis
يتيح لك إعداد كلمة مرور Redis تفعيل إحدى ميزات الحماية المدمجة فيه — الأمر auth
يطلب من المستخدمين إثبات الهوية للوصول إلى قاعدة البيانات. يتم تكوين كلمة المرور مباشرة في ملف تكوين Redis "/etc/redis/redis.conf
", لذلك؛ افتح الملف مجددا باستخدام محرِّرك المفضل:
$ sudo nano /etc/redis/redis.conf
انتقل إلى جزء "SECURITY
" وابحث عن السطر التالي:
- الملف /etc/redis/redis.conf:
# requirepass foobared
ألغِ تعليق هذا السطر بِإزالة "#
" وغير "foobared
" إلى كلمة مرور أكثر أمانًا.
ملاحظة: يوجد تحذير معلق فوق الموجه "requirepass
" في ملف "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.
#
لذلك، من المهم تحديد كلمة مرور طويلة. يمكنك استخدام الأمر "openssl
" ِلتوليد كلمة مرور تلقائيا بدلا من القيام بذلك يدويا كما في المثال التالي. وذلك بتمرير مخرجات الأمر الأول إلى أمر "openssl
" الثاني. سيزيل الأمر أي أسطر فارغة تم توليدها من الأمر الأول:
$ openssl rand 60 | openssl base64 -A
ستكون المخرجات مشابهة لما يلي:
RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
بعد نسخ ولصق المخرجات لتكون هي القيمة الجديدة ل "requirepass
":
/etc/redis/redis.conf
requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
بعد إضافة كلمة المرور، احفظ وأغلق الملف ثم أعد تشغيل Redis:
$ sudo systemctl restart redis.service
لِاختبار من عمل كلمة المرور، أدخل إلى سطر أوامر Redis:
$ redis-cli
الأوامر التالية تستخدم لاختبار ما إن كانت كلمة المرور تعمل أم لا. يحاول الأمر الأول إضافة مفتاح إلى قيمة قبل المصادقة:
127.0.0.1:6379> set key1 10
لن يتنفذ الأمر لعدم المصادقة وسيرجع Redis خطأ:
المخرجات:
(error) NOAUTH Authentication required.
يقوم الأمر التالي بالمصادقة باستخدام كلمة المرور المحددة في ملف التكوين:
127.0.0.1:6379> auth your_redis_password
يُأكد Redis المصادقة:
المخرجات:
ok
بعد ذلك، سينجح الأمر السابق:
127.0.0.1:6379> set key1 10
المخرجات:
ok
الأمر "get key1
" يطلب من Redis قيمة المفتاح الجديدة.
127.0.0.1:6379> get key1
المخرجات:
ok
يمكنك إغلاق "redis-cli
" بعد تأكدك من أنه يمكنك تنفيذ أوامر عميل Redis:
127.0.0.1:6379> 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 لتفعيل أو تعطيل أي أمر:
$ sudo nano /etc/redis/redis.conf
تحذير: توضح الخطوات التالية كيفية تعطيل أو إعادة تسمية كأمثلة. يجب أن تختار تعطيل أو إعادة تسمية الأوامر التي تريدها فقط. يمكنك مراجعة قائمة الأوامر كاملة ومعرفة كيف يمكن أن تستخدم بطريقة ضارة على redis.io/commands.
لِتعطيل أمر ما، أعد تسميته إلى نص فارغ (يشار إلى النص الفارغ بِعلامتي تنصيص "") كما في الأسفل:
- الملف /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 ""
. . .
لإعادة تسمية أمر ما، اعطه اسما آخر كما في المثال بالأسفل. يجب أن تكون الأسماء صعبة التخمين للآخرين ولكن سهلة بالنسبة لك كي تتذكرها لاحقًا:
- الملف /etc/redis/redis.conf:
. . .
# rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
. . .
احفظ التغييرات وأغلق الملف. أعد تشغيل Redis بعد إعادة تسمية الأمر لتطبيق التغييرات:
$ sudo systemctl restart redis.service
أدخل إلى سطر أوامر Redis لاختبار الأمر الجديد:
$ redis-cli
قم بالمصادقة:
127.0.0.1:6379> auth your_redis_password
المخرجات:
OK
لنفترض أنك أعدت تسمية الأمر "CONFIG
" إلى "ASC12_CONFIG
" كما في المثال السابق. أولا حاول استخدام الأمر الأصلي "CONFIG
". يجب أن يفشل تنفيذ الأمر لأنك أعدت تسميته:
127.0.0.1:6379> config get requirepass
المخرجات:
(error) ERR unknown command 'config'
سينجح الأمر عند استخدام الاسم الجديد. لا يهم حالة الأحرف.
127.0.0.1:6379> asc12_config get requirepass
المخرجات:
1) "requirepass"
2) "your_redis_password"
وأخيرا يمكنك الخروج من "redis-cli
".
127.0.0.1:6379> exit
ملاحظة: عندما تُعيد تشغيل سطر أوامر Redis، سيطلب منك إعادة المصادقة أو سيظهر لك الخطأ التالي عند محاولتك لتنفيذ أمر ما:
المخرجات:
NOAUTH Authentication required.
ملاحظة: بالنسبة لإعادة تسمية الأوامر؛ يوجد جملة تحذيرية في نهاية جزء SECURITY
في الملف "/etc/redis/redis.conf
" والتي تنص على:
Please note that changing the name of commands that are logged into the AOF file or transmitted to slaves may cause problems.
يعني هذا التحذير أن إعادة تسمية الأوامر المحفوظة في ملف AOF أو المنقولة في ملف فرعي قد يتسبب ببعض المشاكل.
ملاحظة: يستخدم Redis المصطلحات “master
” و “slave
” بينما يفضل DigitalOcean استخدام البدائل “primary
” و “secondary
”. ولتجنب الخلط بين المصطلحات فإننا نستخدم المصطلحات التي يستخدمها Redis في ملفات التوثيق الخاصة به.
يعني ذلك أنه إن كانت الأوامر التي تمت إعادة تسميتها ليست في ملف AOF أو إن كانت فيه لكن لم يتم نقلها إلى مجلد فرعي فلن يكون هناك أية مشاكل.
لذلك يجب أن تتذكر هذا عند قيامك بإعادة تسمية أمر ما. أفضل وقت لإعادة تسمية الأوامر هو عند عدم استخدامك ل AOF أو بعد التثبيت مباشرة قبل استخدام Redis.
عند استخدامك ل AOF وتعاملك مع التثبيت بنوع master-slave، خذ بعين الاعتبار هذه الإجابة من صفحة المشروع على GitHub:
الإجابة:
تُسجَّل الأوامر في AOF ثم تُكرر إلى المجلدات الفرعية بنفس الطريقة التي تم إرسالها، لذلك إن شغَّلت AOF على نسخة لا تحتوي الأوامر التي تمت إعادة اسميتها ستواجه بعض التعارضات ولن تنفذ بعض الأوامر.
لذلك فإن أفضل طريقة لإعادة تسمية لأوامر في مثل هذه الحالة هي عبر التأكد من أن الأوامر التي تمت إعادة تسميتها مطبقة على جميع النسخ في طريقة التثبيت باستخدام master-slave.
الخلاصة
ختاما، في هذا المقال، لقد ثبتته وإعداد Redis، وتأكدت من صحة عمل Redis، واستخدمت ميزات الحماية المدمجة فيه والتي تقلل عدد الثغرات الممكنة للهجوم من قبل المخترقين.
تذكر أنه بمجرد تسجيل أحدهم الدخول إلى الخادم، فمن السهل عليه التحايل على إعدادت حماية Redis التي قمنا بها. لذلك فإن أهم ميزة أمان على الخادم هي جدار الحماية (الذي أعددته إن كنت تابعت المقال السابق حول التهيئة الأولية لخادم أوبونتو 18.04) الذي يجعل الاختراق صعبًا جدًا.
ترجمة -وبتصرف- للمقال How To Install and Secure Redis on Ubuntu 18.04 لصاحبه الكاتب Mark Drake.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.