أمان Redis

الإعدادات الافتراضية لـ Redis غير آمنة. يغطي هذا الدرس كيفية حماية مثيل Redis الخاص بك.

مخاطر أمان Redis

مخاطر الإعدادات الافتراضية:

⚠️ تحذير: كشف 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

سلوك الوضع المحمي:

تغيير المنفذ

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。

📖 ملخص

📝 تمارين

  1. مصادقة كلمة المرور: عيّن كلمة مرور Redis واختبر الاتصالات الموثقة
  2. إعدادات ACL: أنشئ مستخدمين بأذونات مختلفة (مسؤول، قراءة فقط، مستخدم تطبيق)
  3. تعطيل الأوامر: عطّل أوامر FLUSHALL و CONFIG وتحقق من أنها لم تعد تعمل
  4. التحقق الأمني: راجع قائمة التحقق الأمني لإعدادات Redis الخاصة بك

الدرس التالي

في الدرس التالي، سنتعلم اختبار أداء Redis، والذي يغطي أداة redis-benchmark.

100%