Redis يك فروشگاه ساختار داده منبع باز با حافظه داخلي است كه به دليل انعطاف پذيري ، عملكرد و پشتيباني گسترده زباني شناخته شده است.
Redis براي استفاده كلاينت هاي مورد اعتماد در يك محيط قابل اعتماد طراحي شده است و از نظر امنيتي ويژگي هاي قدرتمندي ندارد. با اين حال ، Redis چند ويژگي امنيتي دارد كه شامل يك پسورد رمزگذاري نشده و دستور تغيير نام و غيرفعال كردن است. اين آموزش دستورالعمل هايي در مورد چگونگي پيكربندي اين ويژگي هاي امنيتي را ارائه مي دهد ، همچنين چند تنظيمات ديگر را نيز شامل مي شود كه مي تواند باعث افزايش امنيت نصب مستقل Redis در CentOS 7 شود.
توجه داشته باشيد كه اين راهنما به موقعيت هايي كه سرور مجازي Redis و برنامه هاي كلاينت در هاست هاي مختلف يا در مراكز داده هاي مختلف هستند ، نمي پردازد. نصب هايي كه ترافيك Redis مجبور است از يك شبكه ناايمن يا غير قابل اعتماد عبور كند ، به مجموعه ديگري از تنظيمات ، مانند راه اندازي يك پروكسي SSL يا اين نام مجاز نمي باشد بين دستگاه هاي Redis نياز دارد.
پيش نيازها
براي تكميل اين راهنما ، به يك سرور مجازي Centos7 كه با دنبال كردن راهنماي راه اندازي سرور مجازي اوليه ما تنظيم شده نياز داريد.
يك فايروال نصب و پيكربندي شده، به روز و شامل مرحله Turning on the Firewall.
با انجام اين پيش نياز ها آماده نصب Redis و اجراي برخي كارهاي پيكربندي اوليه خواهيم بود.
مرحله 1 – نصب Redis
قبل از نصب Redis ، ابتدا بايد بسته هاي اضافي براي منبع Enterprise Linux (EPEL) را به ليست بسته هاي سرور مجازي اضافه كنيم. EPEL يك مخزن بسته است كه شامل تعدادي بسته نرم افزاري اضافي منبع باز است كه بيشتر آنها توسط پروژه Fedora نگهداري مي شوند.
ما مي توانيم EPEL را با استفاده از yum نصب كنيم:
- $ sudo yum install epel-release
پس از پايان نصب EPEL ، مي توانيد Redis را نصب كنيد ، دوباره با استفاده از yum:
- $ sudo yum install redis -y
انجام اين كار ممكن است چند دقيقه طول بكشد. پس از اتمام نصب ، سرويس Redis را شروع كنيد:
- $ sudo systemctl start redis.service
اگر مي خواهيد Redis از بوت شروع شود ، مي توانيد آن را با دستور enable فعال كنيد:
- $ sudo systemctl enable redis
با اجراي موارد زير مي توانيد وضعيت Redis را بررسي كنيد:
- $ sudo systemctl status redis.service
Output
- redis.service – Redis persistent key-value database
Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/redis.service.d
└─limit.conf
Active: active (running) since Thu 2018-03-01 15:50:38 UTC; 7s ago
Main PID: 3962 (redis-server)
CGroup: /system.slice/redis.service
└─3962 /usr/bin/redis-server 127.0.0.1:6379
هنگامي كه تأييد كرديد Redis در حال اجرا است ، با اين دستور ستاپ را امتحان كنيد:
- $ redis-cli ping
اين بايد PONG را به عنوان پاسخ چاپ كند. اگر اين گونه باشد ، به اين معني است كه شما اكنون Redis را در سرور مجازي خود اجرا كرده و ما مي توانيم پيكربندي آن را براي افزايش امنيت آن آغاز كنيم.
مرحله 2 – اتصال Redis و ايمن سازي آن با فايروال
يك روش موثر براي محافظت از Redis ، ايمن سازي سروري است كه روي آن اجرا ميشود. شما مي توانيد اين كار را با اطمينان حاصل كردن از اين كه Redis فقط به localhost يا يك آدرس IP خصوصي متصل است و اينكه سرور مجازي داراي فايروال و به روز است اين كار را انجام دهيد.
با اين حال ، اگر با استفاده از اين آموزش خوشه Redis را راه اندازي كرده ايد ، پس فايل پيكربندي را به روز كرده ايد تا از هرجايي اتصال برقرار شود ، اين امنيت به اندازه اتصال به localhost يا IP خصوصي نيست.
براي رفع اين مشكل ، فايل پيكربندي Redis را براي ويرايش باز كنيد:
- $ sudo vi /etc/redis.conf
ابتدا خطي كه با BIND شروع ميشود پيدا كنيد و مطمئن شويد كه خارج شده است:
/etc/redis.conf
bind 127.0.0.1
اگر لازم است Redis را به آدرس IP ديگري متصل كنيد (مانند مواردي كه از يك ميزبان جداگانه به Redis دسترسي پيدا خواهيد كرد) به شما توصيه مي كنيم آن را به يك آدرس IP خصوصي متصل كنيد. اتصال به يك آدرس IP عمومي ، قرار گرفتن در معرض رابط Redis شما را در برابر طرف هاي خارجي افزايش مي دهد.
/etc/redis.conf
bind your_private_ip
اگر پيش نيازها را دنبال كرده و firewalld را بر روي سرور مجازي خود نصب كرده ايد و قصد نداريد از ميزبان ديگري به Redis متصل شويد ، ديگر نيازي به افزودن قوانين فايروال اضافي براي Redis نداريد. از اين گذشته ، هرگونه ترافيك ورودي به طور پيش فرض كاهش مي يابد مگر اينكه صريحاً توسط قوانين فايروال اجازه داده شود. از آنجا كه نصب مستقل پيش فرض سرور مجازي Redis فقط به رابط loopback (127.0.0.1 يا localhost) گوش مي كند ، ديگر نبايد نگراني براي ترافيك ورودي در پورت پيش فرض آن وجود داشته باشد.
اگر مي خواهيد از ميزبان ديگري به Redis دسترسي پيدا كنيد ، بايد با استفاده از دستور firewall-cmd تغييراتي در پيكربندي firewalld خود ايجاد كنيد. باز هم ، فقط بايد با استفاده از آدرس IP خصوصي هاست ها ، به سرور مجازي Redis خود اجازه دسترسي دهيد تا تعداد هاست هايي كه سرويس شما در معرض آنهاست را محدود كنيد.
براي شروع ، يك منطقه اختصاصي Redis را به رويكرد فايروال خود اضافه كنيد:
- $ sudo firewall-cmd –permanent –new-zone=redis
سپس مشخص كنيد كدام پورت را مي خواهيد باز كنيد. Redis به طور پيش فرض از پورت6397 استفاده مي كند:
- $ sudo firewall-cmd –permanent –zone=redis –add-port=6379/tcp
سپس ، آدرسهاي IP خصوصي را كه بايد از طريق فايروال عبور كرده و به Redis دسترسي پيدا كنند ، مشخص كنيد:
- $ sudo firewall-cmd –permanent –zone=redis –add-source=client_server_private_IP
پس از اجراي اين دستورات ، فايروال را دانلود كنيد تا قوانين جديد را اجرا كنيد:
- $ sudo firewall-cmd –reload
تحت اين پيكربندي ، هنگامي كه فايروال بسته اي را از آدرس IP كلاينت شما مشاهده مي كند ، قوانيني را در منطقه اختصاصي Redis براي آن اتصال اعمال مي كند. ساير اتصالات توسط منطقه عمومي پيش فرض پردازش مي شوند. سرويس هاي موجود در منطقه پيش فرض براي هر اتصال اعمال مي شوند ، نه فقط براي سرويس هايي كه به وضوح مطابقت ندارند ، بنابراين نيازي نيست كه سرويس هاي ديگري (به عنوان مثال SSH) را به منطقه Redis اضافه كنيد زيرا اين قوانين به طور خودكار براي آن اتصال اعمال مي شوند.
اگر تصميم به ايجاد فايروال با استفاده از Iptables كرده ايد ، لازم است مجوزهاي ثانويه خود را به پورت Redis با دستورات زير دسترسي دهيد:
- $ sudo iptables -A INPUT -i lo -j ACCEPT
- $ sudo iptables -A INPUT -m conntrack –ctstate ESTABLISHED,RELATED -j ACCEPT
- $ sudo iptables -A INPUT -p tcp -s client_servers_private_IP/32 –dport 6397 -m conntrack –ctstate NEW,ESTABLISHED -j ACCEPT
- $ sudo iptables -P INPUT DROP
اطمينان حاصل كنيد كه قوانين فايروال Iptables خود را با استفاده از مكانيزم ارائه شده توسط توزيع ذخيره كنيد. با نگاهي به راهنماي ملزومات Iptables مي توانيد درباره Iptables بيشتر بياموزيد.
به خاطر داشته باشيد كه استفاده از هر دو ابزار فايروال كار مي كند. نكته مهم اين است كه فايروال در حال كار است و به گونه اي انجام مي شود كه افراد ناشناس نتوانند به سرور مجازي شما دسترسي پيدا كنند. در مرحله بعدي ، Redis را پيكربندي مي كنيم تا فقط با يك رمز عبور قوي قابل دسترسي باشد.
مرحله 3 – پيكربندي رمز عبور Redis
اگر Redis را با استفاده از آموزش نحوه پيكربندي خوشه Redis در CentOS 7 نصب كرده ايد ، بايد يك رمز عبور براي آن پيكربندي كرده باشيد. بنا به صلاحديد خود ، مي توانيد با دنبال كردن اين بخش يك رمز عبور ايمن تر ايجاد كنيد. اگر هنوز رمز عبوري تنظيم نكرده ايد ، دستورالعمل هاي موجود در اين بخش نحوه تنظيم رمز سرور مجازي پايگاه داده را نشان مي دهد.
پيكربندي رمز عبور Redis يكي از دو ويژگي امنيتي داخلي خود را ايجاد مي كند – دستور auth ، كه به تاييد اعتبار كلاينت ها براي دسترسي به پايگاه داده نياز دارد. رمز عبور مستقيماً در فايل پيكربندي Redis ، /etc/redis/redis.conf پيكربندي شده است ، بنابراين دوباره آن فايل را با ويرايشگر مورد نظر خود باز كنيد:
$ sudo vi /etc/redis.conf
به بخش SECURITY برويد و به دنبال دستورالعملي باشيد كه وظيفه خواندن را دارد:
/etc/redis.conf
# requirepass foobared
با حذف # آن را لغو كنيد و foobared را به يك رمزعبور امن تغيير دهيد. به جاي اينكه خودتان يك رمز عبور بسازيد ، ممكن است از ابزاري مانند apg يا pwgen براي توليد آن استفاده كنيد. اگر نمي خواهيد يك برنامه فقط براي توليد گذرواژه نصب كنيد ، مي توانيد از دستور زير استفاده كنيد.
توجه داشته باشيد كه وارد كردن اين دستور به صورت نوشته شده هر بار رمز عبور يكساني را ايجاد مي كند. براي ايجاد رمز عبور متفاوت از رمز عبوري كه با اين كار ايجاد مي شود ، كلمه را در صورت نقل قول به هر كلمه يا عبارت ديگري تغيير دهيد.
· $ echo “digital-ocean” | sha256sum
اگرچه رمز ورود ايجاد شده قابل تلفظ نيست ، اما يك رمز بسيار قوي و طولاني است كه دقيقاً همان نوع رمز مورد نياز Redis است. پس از كپي و پيست كردن خروجي آن دستور به عنوان مقدار جديد براي Requirese ، به اين صورت خواهد بود:
/etc/redis.conf
requirepass password_copied_from_output
اگر رمز عبور كوتاه تري را ترجيح مي دهيد ، به جاي آن از خروجي دستور زير استفاده كنيد. دوباره ، كلمه را به صورت نقل قول تغيير دهيد تا رمز عبور مشابه اين رمز ايجاد نشود:
· $ echo “digital-ocean” | sha1sum·
پس از تنظيم پسورد فايل را ذخيره كنيد و ببنديد و Redis را ريستارت كنيد:
- $ sudo systemctl restart redis.service
سپس براي بررسي كاركرد گذرواژه، به خط فرمان Redis دسترسي پيدا كنيد:
- $ redis-cli
در زير توالي دستورات مورد استفاده براي تست رمز Redis وجود دارد. دستور اول سعي مي كند قبل از تأييد اعتبار ، كليد را روي يك مقدار تنظيم كند:
- 0.0.1:6379> set key1 10
اين رمز كار نخواهد كرد زيرا شما تأييد اعتبار نكرديد ، بنابراين Redis خطايي را برمي گرداند:
Output(error) NOAUTH Authentication required.
دستور بعدي با گذرواژه مشخص شده در فايل پيكربندي Redis تأييد اعتبار مي كند:
- 0.0.1:6379> auth your_redis_password
Redis تاييد مي كند:
OutputOK
پس از آن ، اجراي دوباره فرمان قبلي موفق خواهد بود:
- 0.0.1:6379> set key1 10
Output
OK
دستور get key1 مقدار كليد جديد را از Redis جستجو ميكند.
- 0.0.1:6379> get key1
Output
“10”
با دستور آخر يعني redis-cli ميتوانيد خارج شويد:
- 0.0.1:6379> quit
اكنون دسترسي به نصب Redis براي كاربران غيرمجاز بسيار دشوار است. البته توجه داشته باشيد كه اگر از راه دور به Redis متصل شويد ، بدون SSL يا اين نام مجاز نمي باشد پسورد رمزگذاري نشده براي اشخاص خارجي قابل مشاهده خواهد بود.
در مرحله بعدي ، براي محافظت بيشتر از Redis در برابر حملات مخرب ، به تغيير دستورات Redis خواهيم پرداخت.
مرحله 5 – تغيير نام دستورات خطرناك
ويژگي امنيتي ديگر كه در Redis قرار داده شده ، تغيير نام يا غيرفعال كردن كامل فرامين خاصي است كه خطرناك به نظر مي رسند.هنگامي كه اين دستورات توسط كاربران غيرمجاز اجرا مي شوند ، مي توانند براي پيكربندي ، از بين بردن يا پاك كردن داده هاي شما استفاده شوند. برخي از دستوراتي كه خطرناك به حساب مي آيند عبارتند از
- FLUSHDB
- FLUSHALL
- KEYS
- PEXPIRE
- DEL
- CONFIG
- SHUTDOWN
- BGREWRITEAOF
- BGSAVE
- SAVE
- SPOP
- SREM RENAME DEBUG
اين يك ليست جامع نيست ، اما تغيير نام يا غيرفعال كردن كليه دستورات موجود در آن ليست ، نقطه شروع خوبي براي افزايش امنيت سرور مجازي Redis شما است.
اين كه آيا شما بايد يك فرمان را غيرفعال كنيد يا تغيير نام دهيد ، به نيازهاي خاص شما يا نيازهاي سايت شما بستگي دارد. اگر مي دانيد هرگز از دستوري كه مورد سوءاستفاده قرار مي گيرد استفاده نمي كنيد ، مي توانيد آن را غيرفعال كنيد. در غير اين صورت ، نام آن مفيد را تغيير دهيد.
مانند رمز عبور احراز هويت ، تغيير نام يا غيرفعال كردن دستورات در قسمت SECURITY فايل /etc/redis.conf پيكربندي شده است. براي فعال يا غيرفعال كردن دستورات Redis ، يك بار ديگر فايل پيكربندي را براي ويرايش باز كنيد:
· $ sudo vi /etc/redis.conf
هشدار: اين ها چند نمونه مثال است. فقط بايد غيرفعال كردن يا تغيير نام دستوراتي كه منطقي ميباشد را انتخاب كنيد. مي توانيد ليست كامل دستورات را براي خود مرور كنيد و نحوه استفاده آنها در redis.io/commands را تعيين كنيد.
براي غيرفعال كردن يك دستور ، كافي است آن را به يك رشته خالي تغيير دهيد ، همانطور كه در زير نشان داده شده:
/etc/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.conf
rename-command CONFIG “”
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
تغييرات خود را ذخيره كرده و فايل را ببنديد و سپس با راه اندازي مجدد Redis ، تغيير را اعمال كنيد:
· $ sudo systemctl restart redis.service
براي آزمايش دستور جديد ، وارد خط فرمان Redis شويد:
- $ redis-cli
سپس ، تأييد اعتبار كنيد:
- 0.0.1:6379> auth your_redis_password
Output
OK
فرض كنيم كه شما دستور CONFIG را مانند مثال قبل به ASC12_CONFIGتغيير نام داديد . ابتدا سعي كنيد از دستور اصلي CONFIG استفاده كنيد. بايد با شكست مواجه شود ، زيرا آن را تغيير نام داده ايد:
- 0.0.1:6379> config get requirepass
Output
(error) ERR unknown command ‘config’
با اين وجود فراخواني فرمان تغيير نام داده شده موفقيت آميز خواهد بود. به كوچك و بزرگ بودن كاراكترها حساس نيست:
- 0.0.1:6379> asc12_config get requirepass
Output
1) “requirepass”
2) “your_redis_password”
درنهايت ، مي توانيد از redis-cli خارج شويد:
- 0.0.1:6379> exit
توجه داشته باشيد كه اگر قبلاً از خط فرمان Redis استفاده كرده ايد و دوباره Redis را ريستارت كرده ايد ، بايد مجددا تأييد اعتبار كنيد. در غير اين صورت ، اگر يك دستور تايپ كنيد ، اين خطا را دريافت خواهيد كرد:
OutputNOAUTH Authentication required.
به خاطر تغيير نام دستورات ، در پايان بخش SECURITY در /etc/redis/redis.conf يك عبارت هشدار وجود دارد:
/etc/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 نباشد ، يا اگر موجود باشد اما فايل AOF به slaves ارسال نشده باشد ، ديگر مشكلي وجود نخواهد داشت.بنابراين ، هنگام تغيير نام دستورات ، اين را به خاطر داشته باشيد. بهترين زمان براي تغيير نام يك فرمان زماني است كه شما از ماندگاري AOF استفاده نمي كنيد ، يا درست بعد از نصب ، يعني قبل از استقرار برنامه مبتني بر Redis.
هنگامي كه از AOF استفاده مي كنيد و با يك نصب master slave سرو كار داريد ، اين پاسخ را از صفحه صدور GitHub پروژه در نظر بگيريد.
بنابراين ، بهترين روش براي تغيير نام در مواردي از اين دست ، اين است كه مطمئن شويد دستورات تغيير نام يافته به تمام مثال هاي نصب هاي master-slave اعمال ميشود.
مرحله 5 – تنظيم مالكيت دايركتوري داده و مجوزهاي پرونده
در اين مرحله ، ما تغييرات مالكيت و مجوزهايي را كه مي توانيد براي بهبود نمايه امنيتي نصب Redis خود ايجاد كنيد ، در نظر خواهيم گرفت. اين شامل اطمينان از اين است كه فقط كاربري كه بايد به Redis دسترسي پيدا كند اجازه خواندن اطلاعات آن را دارد. اين كاربر به طور پيش فرض ، كاربر redis است.
اين را مي توانيد با grep-ing براي ديركتوري داده Redis در ليست طولاني ديركتوري اصلي خود تأييد كنيد. دستور و خروجي آن در زير آورده شده است.
- $ ls -l /var/lib | grep redis
Output
drwxr-xr-x 2 redis redis 4096 Aug 6 09:32 redis
مي بينيد كه دايركتوري داده Redis متعلق به كاربر redis است و دسترسي ثانويه به گروه redis اعطا مي شود. اين تنظيم مالكيت ايمن است ، اما مجوزهاي پوشه (كه روي 755 تنظيم شده است) اينگونه نيست. براي اطمينان از دسترسي انحصاري كاربر Redis به پوشه و محتويات آن ، تنظيمات مجوزها را به 770 تغيير دهيد:
- $ sudo chmod 770 /var/lib/redis
مجوز ديگري كه بايد تغيير دهيد ، فايل پيكربندي Redis است. به طور پيش فرض ، داراي مجوز فايل 644 است و توسط root متعلق به مالكيت ثانويه توسط گروه root است:
- $ ls -l /etc/redis.conf
Output
-rw-r–r– 1 root root 30176 Jan 14 2014 /etc/redis.conf
اين مجوز (644) به صورت سراسر جهاني قابل خواندن است. اين يك مشكل امنيتي است زيرا فايل پيكربندي حاوي پسورد رمزگذاري نشده اي است كه در مرحله 4 پيكربندي كرده ايد ، به اين معني كه ما بايد مالكيت و مجوزهاي فايل پيكربندي را تغيير دهيم. در حالت ايده آل ، اين مالكيت بايد توسط كاربر redis و با مالكيت ثانويه توسط گروه redis باشد. براي انجام اين كار ، دستور زير را اجرا كنيد:
- $ sudo chown redis:redis /etc/redis.conf
سپس مجوزها را تغيير دهيد تا فقط صاحب فايل بتواند آن را بخواند و يا بنويسد:
- $ sudo chmod 600 /etc/redis.conf
شما مي توانيد مالكيت و مجوزهاي جديد را با استفاده از موارد زير تأييد كنيد:
- $ ls -l /etc/redis.conf
Output
total 40
-rw——- 1 redis redis 29716 Sep 22 18:32 /etc/redis.conf
در آخر ، Redis را دوباره راه اندازي كنيد:
- $ sudo systemctl restart redis.service
تبريك ، نصب Redis شما اكنون ايمن تر شده است!
نتيجه
به خاطر داشته باشيد كه پس از ورود شخصي به سرور مجازي شما ، دور زدن ويژگي هاي امنيتي ويژه Redis كه ما در آن قرار داده ايم بسيار آسان است. بنابراين ، مهمترين ويژگي امنيتي در سرور مجازي Redis ، فايروال شماست (كه در صورت پيروي از آموزش مقدماتي راه اندازي اوليه سرور اوليه، آن را پيكربندي كرده ايد) ، زيرا اين كار پرش از آن حصار امنيتي را براي حمله گران بسيار دشوار مي كند.
اگر سعي در برقراري ارتباطات Redis از طريق يك شبكه غير معتبر داريد ، بايد پروكسي SSL را به كار ببريد ، همانطور كه توسط توسعه دهندگان Redis در راهنماي رسمي امنيتي Redis توصيه شده است
نحوه استفاده از Traefik به عنوان پروكسي معكوس براي كانتينرهاي Docker در اوبونتو 20.04
نحوه نصب و ايمن سازي Redis در Centos7
چگونه مي توان محيط JupyterLab را در اوبونتو 18.04 تنظيم كرد
نحوه نصب Webmin در Ubuntu 20.04
نحوه بازنويسي آدرس هاي اينترنتي با mod_rewrite براي Apache در اوبونتو 20.04
نحوه مديريت چندين سرور با دستورات Ad Hoc Ansible
چگونه مي توان REST API را با Prisma و PostgreSQL ساخت
نحوه ميزباني وب سايت با استفاده از Cloudflare و Nginx در اوبونتو 18.04
نحوه استفاده از Traefik به عنوان پروكسي معكوس براي كانتينرهاي Docker در Ubuntu 18.04
خريد vps – خريد سرور مجازي – خريد سرور – سرور هلند – فروش vps – سرور مجازي آمريكا – خريدvps – سرور مجازي هلند – فروش سرور مجازي – سرور آمريكا – vps – سرور مجازي انگليس – سرور مجازي آلمان – سرور مجازي كانادا – خريد vps آمريكا – خريد وي پي اس – سرور – خريد سرور مجازي هلند – vps خريد – سرور مجازي فرانسه – سرور مجازي هلند – خريد vps آمريكا – خريد سرور مجازي ارزان هلند – vps – خريد vps هلند – خريد سرور مجازي آمريكا – خريد vps فرانسه – تست vps – سرور مجازي تست – سرور مجازي ويندوز – ارزانترين vps – خريد وي پي اس – vps ارزان –