أمان Redis
الإعدادات الافتراضية لـ Redis غير آمنة. يغطي هذا الدرس كيفية حماية مثيل Redis الخاص بك.
مخاطر أمان Redis
مخاطر الإعدادات الافتراضية:
- لا توجد مصادقة بكلمة مرور: يمكن لأي شخص الاتصال
- الربط بجميع واجهات الشبكة: يمكن الوصول من الخارج
- الأوامر الخطيرة غير معطلة: FLUSHALL، CONFIG، إلخ
- نقل نص عادي: البيانات غير مشفرة
⚠️ تحذير: كشف Redis للإنترنت العام خطير جدًا! كانت هناك هجمات واسعة النطاق على Redis.
مصادقة كلمة المرور
تعيين كلمة مرور (قبل Redis 6.0)
CONF
# redis.conf
requirepass your_strong_password_here
المصادقة عند الاتصال:
REDIS
# الطريقة 1: تحديد كلمة المرور عند الاتصال
redis-cli -a your_strong_password_here
# الطريقة 2: المصادقة بعد الاتصال
redis-cli
AUTH your_strong_password_here
OK
⚠️ ملاحظة: استخدام المعامل
-a في سطر الأوامر يعرض كلمة المرور في سجل الأوامر — غير موصى به.
تعيين كلمة مرور في ملف الإعدادات
CONF
# redis.conf
requirepass "P@ssw0rd!2026#Redis"
تعيين كلمة مرور ديناميكيًا
REDIS
CONFIG SET requirepass "new_password"
OK
# إعادة المصادقة مطلوبة
AUTH new_password
OK
التحكم في الوصول ACL (Redis 6.0+)
قدم Redis 6.0 ACL (قائمة التحكم في الوصول) للتحكم في الأذونات بشكل أكثر دقة.
عرض قائمة المستخدمين
REDIS
ACL LIST
1) "user default on nopass ~* &* +@all"
إنشاء مستخدمين
REDIS
# إنشاء مستخدم بكلمة مرور
ACL SETUSER alice on >password123 ~* +@all
OK
# إنشاء مستخدم للقراءة فقط
ACL SETUSER bob on >password456 ~* +@read +@connection
OK
# إنشاء مستخدم بوصول لمفاتيح محددة فقط
ACL SETUSER app on >apppass ~app:* +@all
OK
صيغة أمر ACL
ACL SETUSER username
on|off # تمكين أو تعطيل
>password # تعيين كلمة مرور
~pattern # المفاتيح المسموحة (~* يعني جميع المفاتيح)
&pattern # قنوات Pub/Sub المسموحة
+@category # السماح بفئة أوامر
-@category # منع فئة أوامر
+command # السماح بأمر محدد
-command # منع أمر محدد
فئات الأوامر
| الفئة | الوصف | تتضمن |
|---|---|---|
| @all | جميع الأوامر | الكل |
| @read | أوامر القراءة | GET, HGET, LRANGE، إلخ |
| @write | أوامر الكتابة | SET, HSET, LPUSH، إلخ |
| @admin | أوامر الإدارة | CONFIG, DEBUG، إلخ |
| @dangerous | أوامر خطيرة | FLUSHALL, SHUTDOWN، إلخ |
| @connection | أوامر الاتصال | AUTH, PING, QUIT، إلخ |
| @string | أوامر السلسلة | SET, GET, INCR، إلخ |
| @hash | أوامر التجزئة | HSET, HGET، إلخ |
| @list | أوامر القائمة | LPUSH, LPOP، إلخ |
| @set | أوامر المجموعة | SADD, SREM، إلخ |
| @sortedset | أوامر المجموعة المرتبة | ZADD, ZREM، إلخ |
إنشاء مستخدمين بأذونات مختلفة
REDIS
# مسؤول: جميع الأذونات
ACL SETUSER admin on >admin123 ~* +@all
# مستخدم للقراءة فقط
ACL SETUSER readonly on >read123 ~* +@read +@connection
# مستخدم تطبيق: يمكنه الوصول فقط لمفاتيح app:*
ACL SETUSER app on >app123 ~app:* +@all
# مستخدم إحصاءات: قراءة فقط لمفاتيح stats:*
ACL SETUSER stats on >stats123 ~stats:* +@read +@connection
# مستخدم آمن: جميع الأوامر باستثناء الإدارة والخطيرة
ACL SETUSER safe on >safe123 ~* +@all -@admin -@dangerous
عرض أذونات المستخدم
REDIS
# عرض جميع المستخدمين
ACL LIST
# عرض مستخدم محدد
ACL GETUSER alice
1) "flags"
2) 1) "on"
3) "passwords"
4) 1) "hash_password"
5) "keys"
6) "~*"
7) "commands"
8) "+@all"
حذف مستخدم
REDIS
ACL DELUSER alice
(integer) 1
حفظ إعدادات ACL
REDIS
# حفظ إعدادات ACL في ملف
ACL SAVE
OK
حدد ملف ACL في redis.conf:
CONF
aclfile /etc/redis/users.acl
إعادة تسمية الأوامر
إعادة تسمية أو تعطيل الأوامر الخطيرة.
تعطيل الأوامر
CONF
# redis.conf
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command DEBUG ""
rename-command SHUTDOWN ""
rename-command KEYS ""
إعادة تسمية الأوامر
CONF
# إعادة تسمية الأوامر الخطيرة إلى أسماء معقدة
rename-command FLUSHALL "FLUSHALL_abc123xyz"
rename-command CONFIG "CONFIG_secret789"
استخدام الأمر المعاد تسميته:
REDIS
# الأمر الأصلي لم يعد يعمل
FLUSHALL
(error) ERR unknown command 'FLUSHALL'
# استخدم الأمر الجديد
FLUSHALL_abc123xyz
OK
💡 حالة الاستخدام: قم بتعطيل أو إعادة تسمية الأوامر الخطيرة لمنع العمليات العرضية أو الهجمات الخبيثة.
أمان الشبكة
ربط عنوان IP
CONF
# redis.conf
# الوصول المحلي فقط
bind 127.0.0.1
# السماح بعناوين IP محددة
bind 127.0.0.1 192.168.1.100
# السماح بجميع عناوين IP (خطير!)
bind 0.0.0.0
⚠️ تحذير:
bind 0.0.0.0 يسمح بجميع عناوين IP — يجب تعيين كلمة مرور!
الوضع المحمي
CONF
# redis.conf
# تمكين الوضع المحمي (افتراضي)
protected-mode yes
سلوك الوضع المحمي:
- يقبل فقط الاتصالات المحلية (127.0.0.1)
- أو إذا تم تعيين عنوان bind
- أو إذا تم تعيين كلمة مرور
تغيير المنفذ
CONF
# استخدام منفذ غير افتراضي
port 6380
💡 حالة الاستخدام: استخدام منفذ غير افتراضي يقلل من هجمات المسح الآلي.
تكوين جدار الحماية
BASH
# Linux iptables
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 6379 -j ACCEPT
iptables -A INPUT -p tcp --dport 6379 -j DROP
# CentOS firewalld
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="6379" accept'
firewall-cmd --reload
تشفير TLS/SSL (Redis 6.0+)
Redis 6.0 يدعم اتصالات TLS المشفرة.
تكوين TLS
CONF
# redis.conf
tls-port 6379
port 0 # تعطيل المنفذ غير المشفر
tls-cert-file /path/to/redis.crt
tls-key-file /path/to/redis.key
tls-ca-cert-file /path/to/ca.crt
tls-auth-clients optional
tls-protocols "TLSv1.2 TLSv1.3"
الاتصال مع TLS
BASH
redis-cli --tls --cert /path/to/client.crt --key /path/to/client.key --cacert /path/to/ca.crt
أفضل ممارسات الأمان
1. تعيين كلمة مرور قوية
CONF
# استخدم كلمة مرور قوية (16 حرفًا على الأقل، مزيج من الأحرف والأرقام والرموز)
requirepass "Xk9#mP2$vL5@nQ8&wR4!"
2. استخدم ACL للتحكم في الأذونات
REDIS
# إنشاء مستخدمين مختلفين لتطبيقات مختلفة
ACL SETUSER webapp on >webpass ~web:* +@all
ACL SETUSER batch on >batchpass ~batch:* +@all
ACL SETUSER readonly on >readpass ~* +@read +@connection
3. تعطيل الأوامر الخطيرة
CONF
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command DEBUG ""
4. تقييد الوصول إلى الشبكة
CONF
bind 127.0.0.1
protected-mode yes
5. استخدم جدار حماية
BASH
# فقط السماح لعناوين IP محددة بالوصول إلى منفذ Redis
iptables -A INPUT -p tcp -s 192.168.1.100 --dport 6379 -j ACCEPT
iptables -A INPUT -p tcp --dport 6379 -j DROP
6. التدقيق المنتظم
REDIS
# عرض اتصالات العملاء الحالية
CLIENT LIST
# عرض أذونات المستخدم
ACL LIST
# عرض الأوامر المنفذة (استخدم بحذر)
MONITOR
قائمة التحقق الأمني
□ تعيين كلمة مرور قوية (requirepass أو ACL)
□ الربط بعنوان IP داخلي (bind 127.0.0.1 أو IP داخلي)
□ تمكين الوضع المحمي (protected-mode yes)
□ تعطيل الأوامر الخطيرة (FLUSHALL، CONFIG، إلخ)
□ استخدام جدار حماية لتقييد الوصول
□ استخدام منفذ غير افتراضي
□ تحديث إصدار Redis بانتظام
□ مراقبة الاتصالات والأوامر غير العادية
□ استخدام ACL لأذونات دقيقة (Redis 6.0+)
□ النظر في تشفير TLS (Redis 6.0+)
❓ أسئلة شائعة
س كيف كان التحكم في الوصول قبل Redis 6.0؟
ج كان فقط requirepass متاحًا — جميع العملاء يشاركون نفس كلمة المرور وبنفس الأذونات。
س كيف أعطل أمر KEYS؟
ج استخدم
rename-command KEYS "" لتعطيله، أو أعد تسميته إلى اسم معقد。س هل bind 0.0.0.0 آمن؟
ج لا! يجب أيضًا تعيين كلمة مرور قوية وجدار حماية. يُوصى بالربط فقط بعناوين IP داخلية。
س كيف أمنع Redis من التعرض للهجوم؟
ج عيّن كلمة مرور قوية، واربط بعنوان IP داخلي، وعطّل الأوامر الخطيرة، واستخدم جدار حماية، وحدّث بانتظام。
س كيف أحفظ إعدادات ACL بشكل دائم؟
ج استخدم ACL SAVE للكتابة إلى ملف، أو حدد aclfile في redis.conf。
📖 ملخص
- الإعدادات الافتراضية لـ Redis غير آمنة — تحتاج تعزيزًا أمنيًا
- عيّن مصادقة قوية بكلمة مرور (requirepass أو ACL)
- ACL يوفر تحكمًا دقيقًا في الأذونات (Redis 6.0+)
- أعد تسمية أو عطّل الأوامر الخطيرة
- اربط بعنوان IP داخلي، وفعّل الوضع المحمي
- استخدم جدار حماية لتقييد الوصول
- فكر في تشفير TLS (Redis 6.0+)
- قم بالتدقيق والمراقبة بانتظام
📝 تمارين
- مصادقة كلمة المرور: عيّن كلمة مرور Redis واختبر الاتصالات الموثقة
- إعدادات ACL: أنشئ مستخدمين بأذونات مختلفة (مسؤول، قراءة فقط، مستخدم تطبيق)
- تعطيل الأوامر: عطّل أوامر FLUSHALL و CONFIG وتحقق من أنها لم تعد تعمل
- التحقق الأمني: راجع قائمة التحقق الأمني لإعدادات Redis الخاصة بك
الدرس التالي
في الدرس التالي، سنتعلم اختبار أداء Redis، والذي يغطي أداة redis-benchmark.



