Redis والتخزين المؤقت المتقدم

أمان Redis

18 دقيقة الدرس 22 من 30

أمان Redis

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

تحذير حرج: لا تقم أبدًا بكشف Redis مباشرة إلى الإنترنت دون تدابير أمان مناسبة. يمكن اختراق مثيل Redis غير آمن في دقائق واستخدامه لسرقة البيانات أو تعدين العملات المشفرة أو كجزء من شبكة الروبوتات.

المصادقة باستخدام requirepass

أبسط إجراء أمني هو مصادقة كلمة المرور باستخدام التوجيه requirepass:

redis.conf:
# تعيين كلمة مرور قوية
requirepass "MyStr0ng!P@ssw0rd#2024"

# إعادة تشغيل Redis لتفعيل التغييرات
sudo systemctl restart redis
الاتصال بكلمة مرور:
# استخدام redis-cli
redis-cli
AUTH "MyStr0ng!P@ssw0rd#2024"

# أو تمرير كلمة المرور في الاتصال
redis-cli -a "MyStr0ng!P@ssw0rd#2024"

# استخدام تنسيق URL
redis://default:MyStr0ng!P@ssw0rd#2024@localhost:6379
أفضل ممارسات كلمة المرور: استخدم كلمات مرور بطول 32 حرفًا على الأقل مع أحرف كبيرة وصغيرة وأرقام ورموز. Redis سريع للغاية، لذا يمكن اختراق كلمات المرور الضعيفة بسرعة بالقوة الغاشمة.

قوائم التحكم في الوصول (ACL)

قدم Redis 6.0+ قوائم ACL للتحكم الدقيق في الوصول، مما يسمح لك بإنشاء مستخدمين متعددين بأذونات محددة:

إنشاء المستخدمين:
# المستخدم الافتراضي (تعطيل للأمان)
ACL SETUSER default off

# إنشاء مستخدم مسؤول مع وصول كامل
ACL SETUSER admin on >adminpass123 ~* &* +@all

# إنشاء مستخدم للقراءة فقط
ACL SETUSER readonly on >readpass456 ~* &* +@read -@write -@dangerous

# إنشاء مستخدم لمفاتيح محددة
ACL SETUSER app on >apppass789 ~app:* &* +@all -@dangerous

# حفظ تكوين ACL
ACL SAVE
بناء جملة نمط ACL:
  • on/off: تمكين أو تعطيل المستخدم
  • >password: تعيين كلمة المرور (يمكن أن يكون لديك عدة)
  • ~pattern: أنماط المفاتيح التي يمكن للمستخدم الوصول إليها (~* = جميع المفاتيح، ~app:* = مفاتيح تبدأ بـ "app:")
  • &pattern: أنماط قناة Pub/Sub
  • +command: السماح بأمر محدد
  • -command: رفض أمر محدد
  • +@category: السماح بفئة أمر (@read، @write، @admin، إلخ.)
  • -@category: رفض فئة أمر
فئات ACL:
# عرض جميع فئات ACL
ACL CAT

# عرض الأوامر في فئة
ACL CAT read
ACL CAT dangerous

# سرد جميع المستخدمين
ACL LIST

# الحصول على المستخدم الحالي
ACL WHOAMI

# عرض أذونات مستخدم محدد
ACL GETUSER readonly

تكوين ACL الدائم

قم بتخزين قواعد ACL في ملف خارجي لتسهيل الإدارة:

redis.conf:
# تمكين ملف ACL
aclfile /etc/redis/users.acl

/etc/redis/users.acl:
user default off
user admin on >adminpass123 ~* &* +@all
user readonly on >readpass456 ~* &* +@read -@write -@dangerous
user cache_app on >cachepass789 ~cache:* &* +get +set +del +expire
الاتصال بمستخدم ACL:
# redis-cli
redis-cli --user readonly --pass readpass456

# PHP
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->auth(['readonly', 'readpass456']);

تشفير TLS/SSL

قم بتشفير اتصالات Redis باستخدام TLS لمنع هجمات الرجل في المنتصف والتنصت:

إنشاء شهادات SSL:
# إنشاء مفتاح خاص
openssl genrsa -out redis.key 2048

# إنشاء طلب توقيع الشهادة
openssl req -new -key redis.key -out redis.csr

# إنشاء شهادة موقعة ذاتيًا (صالحة لمدة 365 يومًا)
openssl x509 -req -days 365 -in redis.csr -signkey redis.key -out redis.crt

# إنشاء شهادة CA للعملاء
openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 365 -key ca.key -out ca.crt
تكوين TLS في redis.conf:
# تمكين TLS
port 0
tls-port 6379

# ملفات الشهادات
tls-cert-file /etc/redis/ssl/redis.crt
tls-key-file /etc/redis/ssl/redis.key
tls-ca-cert-file /etc/redis/ssl/ca.crt

# بروتوكولات TLS
tls-protocols "TLSv1.2 TLSv1.3"

# مصادقة شهادة العميل (اختياري)
tls-auth-clients yes
الاتصال بـ TLS:
# redis-cli مع TLS
redis-cli --tls --cert /path/to/client.crt --key /path/to/client.key --cacert /path/to/ca.crt

# PHP مع TLS
$redis = new Redis();
$redis->connect('tls://127.0.0.1', 6379, 0, NULL, 0, 0, [
'stream' => [
'verify_peer' => true,
'verify_peer_name' => true,
'cafile' => '/path/to/ca.crt'
]
]);

الوضع المحمي

يمنع الوضع المحمي في Redis الاتصالات الخارجية عندما لا يتم تعيين كلمة مرور:

redis.conf:
# تمكين الوضع المحمي (افتراضي: نعم)
protected-mode yes

# مع الوضع المحمي، يقبل Redis الاتصالات فقط من:
# - 127.0.0.1 (localhost)
# - ::1 (IPv6 localhost)
# - مآخذ Unix

# لقبول الاتصالات الخارجية، يجب عليك:
# 1. تعيين requirepass أو تكوين ACL، و
# 2. تعيين bind إلى واجهات محددة أو تعطيل الوضع المحمي
تحذير: لا تقم أبدًا بتعطيل protected-mode دون تعيين كلمة مرور أو قواعد ACL. هذا هو خطأ التكوين الأمني الأكثر شيوعًا في Redis.

أمان الشبكة

قلل من التعرض للشبكة باستخدام bind وقواعد جدار الحماية:

الربط بواجهات محددة:
# redis.conf
# الربط بـ localhost فقط (الأكثر أمانًا)
bind 127.0.0.1 ::1

# الربط بـ IP خاص محدد
bind 127.0.0.1 192.168.1.100

# الربط بجميع الواجهات (يتطلب المصادقة)
bind 0.0.0.0
قواعد جدار الحماية (iptables):
# السماح لـ Redis فقط من خادم التطبيق
sudo iptables -A INPUT -p tcp -s 192.168.1.50 --dport 6379 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 6379 -j DROP

# حفظ القواعد
sudo iptables-save > /etc/iptables/rules.v4
أمان السحابة: في AWS أو Azure أو GCP، استخدم مجموعات الأمان/قوائم ACL للشبكة لتقييد وصول Redis إلى موارد VPC/VNET محددة فقط.

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

أعد تسمية أو عطل الأوامر الخطرة لمنع سوء الاستخدام العرضي أو الخبيث:

redis.conf:
# تعطيل الأوامر الخطرة
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command KEYS ""
rename-command CONFIG ""
rename-command SHUTDOWN ""
rename-command DEBUG ""

# أو إعادة التسمية إلى أسماء غامضة
rename-command FLUSHDB "FLUSHDB_MySecret_2024"
rename-command CONFIG "CONFIG_Admin_Only_9876"
الأوامر الخطرة:
  • FLUSHDB/FLUSHALL: حذف جميع البيانات
  • KEYS: حظر الخادم على مجموعات البيانات الكبيرة
  • CONFIG: تغيير تكوين الخادم
  • SHUTDOWN: إيقاف خادم Redis
  • DEBUG: أوامر تصحيح يمكن أن تعطل الخادم
  • SAVE/BGSAVE: فرض عمليات كتابة القرص التي قد تؤثر على الأداء

تعطيل أو الحد من مخزن الإخراج المؤقت للعميل

منع العملاء من استهلاك الذاكرة الزائدة:

redis.conf:
# الحد من مخزن الإخراج المؤقت للعميل (حد صلب / حد ناعم / ثواني ناعمة)
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

# الحد الأقصى لعدد العملاء
maxclients 10000

تعطيل الوحدات الخطرة

إذا كنت تستخدم وحدات Redis، قم بتحميل الوحدات الموثوقة فقط وتحقق من التوقيعات:

redis.conf:
# تحميل الوحدات الضرورية فقط
loadmodule /usr/lib/redis/modules/redisearch.so

# تعطيل تحميل الوحدات في وقت التشغيل
enable-module-command no

المراقبة والتدقيق

تمكين السجلات ومراقبة النشاط المشبوه:

تسجيل redis.conf:
# مستوى السجل (debug، verbose، notice، warning)
loglevel notice

# موقع ملف السجل
logfile /var/log/redis/redis-server.log

# تسجيل الاستعلامات الأبطأ من X ميكروثانية
slowlog-log-slower-than 10000
slowlog-max-len 128
مراقبة محاولات المصادقة الفاشلة:
# عرض slowlog
SLOWLOG GET 10

# مراقبة الأوامر في الوقت الفعلي
MONITOR

# التحقق من اتصالات العميل
CLIENT LIST

قائمة التحقق من الأمان

قائمة التحقق من أمان Redis في الإنتاج:
  1. ✅ تمكين المصادقة (requirepass أو ACL)
  2. ✅ استخدام كلمات مرور قوية (32+ حرف)
  3. ✅ الربط بواجهات محددة (ليس 0.0.0.0)
  4. ✅ تمكين الوضع المحمي
  5. ✅ استخدام قواعد جدار الحماية لتقييد الوصول
  6. ✅ تمكين TLS/SSL للتشفير
  7. ✅ إعادة تسمية أو تعطيل الأوامر الخطرة
  8. ✅ استخدام ACLs للتحكم الدقيق في الوصول
  9. ✅ عدم كشف Redis للإنترنت أبدًا
  10. ✅ الحفاظ على تحديث Redis لأحدث إصدار
  11. ✅ مراقبة السجلات للنشاط المشبوه
  12. ✅ استخدام مستخدم Redis مخصص (ليس root)
  13. ✅ تعطيل الوحدات غير الضرورية
  14. ✅ تعيين أذونات ملف مناسبة على redis.conf (600)
  15. ✅ عمليات تدقيق أمني منتظمة واختبار الاختراق
تمرين: قم بإعداد مثيل Redis آمن مع: 1) ACL مع ثلاثة مستخدمين (admin، app، readonly)، 2) تشفير TLS، 3) أوامر خطرة معاد تسميتها، 4) قواعد جدار الحماية. اختبر الاتصالات مع مستخدمين مختلفين وتحقق من قيود الوصول المناسبة.