أمان Redis
أمان Redis
بشكل افتراضي، تم تصميم Redis للاستخدام في بيئات موثوقة. يتطلب تأمين Redis تنفيذ المصادقة وضوابط الوصول والتشفير وعزل الشبكة لحماية بياناتك من الوصول غير المصرح به.
المصادقة باستخدام requirepass
أبسط إجراء أمني هو مصادقة كلمة المرور باستخدام التوجيه requirepass:
# تعيين كلمة مرور قوية
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
قوائم التحكم في الوصول (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
- on/off: تمكين أو تعطيل المستخدم
- >password: تعيين كلمة المرور (يمكن أن يكون لديك عدة)
- ~pattern: أنماط المفاتيح التي يمكن للمستخدم الوصول إليها (~* = جميع المفاتيح، ~app:* = مفاتيح تبدأ بـ "app:")
- &pattern: أنماط قناة Pub/Sub
- +command: السماح بأمر محدد
- -command: رفض أمر محدد
- +@category: السماح بفئة أمر (@read، @write، @admin، إلخ.)
- -@category: رفض فئة أمر
# عرض جميع فئات ACL
ACL CAT
# عرض الأوامر في فئة
ACL CAT read
ACL CAT dangerous
# سرد جميع المستخدمين
ACL LIST
# الحصول على المستخدم الحالي
ACL WHOAMI
# عرض أذونات مستخدم محدد
ACL GETUSER readonly
تكوين ACL الدائم
قم بتخزين قواعد ACL في ملف خارجي لتسهيل الإدارة:
# تمكين ملف 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
# 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 لمنع هجمات الرجل في المنتصف والتنصت:
# إنشاء مفتاح خاص
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
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
# 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 الاتصالات الخارجية عندما لا يتم تعيين كلمة مرور:
# تمكين الوضع المحمي (افتراضي: نعم)
protected-mode yes
# مع الوضع المحمي، يقبل Redis الاتصالات فقط من:
# - 127.0.0.1 (localhost)
# - ::1 (IPv6 localhost)
# - مآخذ Unix
# لقبول الاتصالات الخارجية، يجب عليك:
# 1. تعيين requirepass أو تكوين ACL، و
# 2. تعيين bind إلى واجهات محددة أو تعطيل الوضع المحمي
أمان الشبكة
قلل من التعرض للشبكة باستخدام 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
# السماح لـ 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
إعادة تسمية الأوامر الخطرة
أعد تسمية أو عطل الأوامر الخطرة لمنع سوء الاستخدام العرضي أو الخبيث:
# تعطيل الأوامر الخطرة
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: فرض عمليات كتابة القرص التي قد تؤثر على الأداء
تعطيل أو الحد من مخزن الإخراج المؤقت للعميل
منع العملاء من استهلاك الذاكرة الزائدة:
# الحد من مخزن الإخراج المؤقت للعميل (حد صلب / حد ناعم / ثواني ناعمة)
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، قم بتحميل الوحدات الموثوقة فقط وتحقق من التوقيعات:
# تحميل الوحدات الضرورية فقط
loadmodule /usr/lib/redis/modules/redisearch.so
# تعطيل تحميل الوحدات في وقت التشغيل
enable-module-command no
المراقبة والتدقيق
تمكين السجلات ومراقبة النشاط المشبوه:
# مستوى السجل (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
قائمة التحقق من الأمان
- ✅ تمكين المصادقة (requirepass أو ACL)
- ✅ استخدام كلمات مرور قوية (32+ حرف)
- ✅ الربط بواجهات محددة (ليس 0.0.0.0)
- ✅ تمكين الوضع المحمي
- ✅ استخدام قواعد جدار الحماية لتقييد الوصول
- ✅ تمكين TLS/SSL للتشفير
- ✅ إعادة تسمية أو تعطيل الأوامر الخطرة
- ✅ استخدام ACLs للتحكم الدقيق في الوصول
- ✅ عدم كشف Redis للإنترنت أبدًا
- ✅ الحفاظ على تحديث Redis لأحدث إصدار
- ✅ مراقبة السجلات للنشاط المشبوه
- ✅ استخدام مستخدم Redis مخصص (ليس root)
- ✅ تعطيل الوحدات غير الضرورية
- ✅ تعيين أذونات ملف مناسبة على redis.conf (600)
- ✅ عمليات تدقيق أمني منتظمة واختبار الاختراق