در ادامه آموزش قبل که redis را بر روی ubuntu 22.04 نصب کرده ایم، حال وقت آن است که امنیت آن را بالا ببریم تا افراد سود جو براحتی نتوانند به آن دسترسی داشته باشند.
مرحله ۳ — محدود کردن به localhost
به طور پیشفرض، Redis تنها از localhost قابل دسترسی است. با این حال، اگر Redis را با دنبال کردن یک آموزش دیگر به جای آموزش قبلی نصب و پیکربندی کردهاید، ممکن است فایل پیکربندی را بهروزرسانی کرده و اجازه دسترسی از هر جایی را اعطا کرده باشید. این به اندازه محدود کردن به localhost امن نیست.
برای اصلاح این موضوع، فایل پیکربندی Redis را برای ویرایش باز کنید:
sudo nano /etc/redis/redis.conf
این خط را پیدا کرده و مطمئن شوید که از حالت کامنت خارج شده است (علامت # را حذف کنید):
. . .
bind 127.0.0.1 ::1
. . .
پس از اتمام کار، فایل را ذخیره و ببندید (CTRL + X، Y، سپس ENTER را بفشارید).
سپس، سرویس را ریستارت کنید تا مطمئن شوید که systemd تغییرات شما را خوانده است:
sudo systemctl restart redis
برای بررسی اینکه این تغییرات اعمال شدهاند یا خیر، دستور netstat زیر را اجرا کنید:
sudo netstat -lnp | grep redis
Output
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 14222/redis-server
tcp6 0 0 ::1:6379 :::* LISTEN 14222/redis-server
توجه: دستور netstat ممکن است به طور پیشفرض در سیستم شما موجود نباشد. اگر اینطور است، میتوانید آن را (همراه با تعدادی از ابزارهای شبکه دیگر) با دستور زیر نصب کنید:
sudo apt install net-tools
این خروجی نشان میدهد که برنامه redis-server به localhost (127.0.0.1) متصل شده است و تغییری که به فایل پیکربندی اعمال کردهاید را اعمال میکند. اگر آدرس IP دیگری در آن ستون وجود داشته باشد (به عنوان مثال 0.0.0.0)، باید دوباره خط حذف شده را بررسی نمایید و دوباره سرویس Redis را راهاندازی کنید.
اکنون که نصب Redis شما فقط به localhost گوش میدهد، برای افراد سختتر است تا درخواستی ارسال یا دسترسی به سرور شما داشته باشند. با این حال، در حال حاضر Redis بهطور پیشفرض تنظیم نشده است تا از کاربران بخواهد قبل از اعمال تغییرات در پیکربندی یا دادههای خود احراز هویت کنند. برای رفع این موضوع، Redis به شما اجازه میدهد که از کاربران بخواهید قبل از اعمال تغییرات از طریق کلاینت Redis (redis-cli) احراز هویت کنند.
مرحله ۴ — کانفیگ رمزعبور Redis
پیکربندی رمزعبور Redis اجازه فعال شدن یکی از دو ویژگی امنیتی داخلی آن را فراهم میکند — دستور auth که از مشتریان میخواهد قبل از دسترسی به پایگاه داده احراز هویت کنند. رمزعبور به صورت مستقیم در فایل کانفیگ Redis، /etc/redis/redis.conf، ست میشود، بنابراین دوباره آن فایل را با ویرایشگر مورد نظرتان باز کنید:
sudo nano /etc/redis/redis.conf
به بخش SECURITY بروید و یک دستور کامنت شده که به این صورت است را پیدا کنید:
. . .
requirepass foobared #
. . .
آن را با حذف # فعال کنید و foobared را به یک رمزعبور امن تغییر دهید.
توجه: در بالای دستور requirepass در فایل redis.conf، یک هشدار کامنت شده وجود دارد:
. . .
Warning: since Redis is pretty fast an outside user can try up to #
150k passwords per second against a good box. This means that you should #
.use a very strong password otherwise it will be very easy to break #
#
. . .
بنابراین، مهم است که یک رمز بسیار قوی و بلند به عنوان پسوورد خود مشخص کنید. به جای اینکه خودتان یک رمزعبور بسازید، میتوانید از دستور openssl برای تولید یک رمزعبور تصادفی استفاده کنید، همانطور که در مثال زیر نشان داده شده است، با وارد کردن خروجی دستور اول به فرمان دوم openssl، هر شکست خطی که توسط دستور اول ایجاد شده است را حذف می کند:
openssl rand 60 | openssl base64 -A
این دستور خروجی ای مانند این خواهد داشت:
Output
RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
پس از کپی و پیست خروجی آن دستور به عنوان مقدار جدید برای requirepass، باید اینگونه باشد:
etc/redis/redis.conf/
requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
پس از تنظیم رمزعبور، فایل را ذخیره و ببندید. سپسRedis را دوباره راهاندازی کنید:
sudo systemctl restart redis.service
برای بررسی اینکه رمزعبور کار میکند، کلاینت Redis را باز کنید:
redis-cli
در زیر دنباله ای از دستورات مورد استفاده برای آزمایش اینکه آیا رمز عبور Redis کار می کند را نشان می دهد. اولین دستور سعی می کند قبل از احراز هویت، یک کلید را روی یک مقدار تنظیم کند:
set key1 10 ip
این دستور اجرا نخواهد شد زیرا شما احراز هویت نکردهاید، بنابراین Redis یک خطای ارسال میکند:
Output
(error) NOAUTH Authentication required.
دستور بعدی با استفاده از رمزعبور مشخص شده در فایل پیکربندی Redis احراز هویت میکند:
auth your_redis_password ip
Redis تأیید میکند:
Output
OK
بعد از آن، اجرای دستور قبلی دوباره موفق خواهد بود:
set key1 10 ip
Output
OK
get key1 درخواست میکند Redis برای مقدار کلید جدید.
get key1 ip
Output
"10"
بعد از اطمینان اینکه میتوانید دستورات را در کلاینت Redis اجرا کنید پس از احراز هویت، میتوانید از redis-cli خارج شوید:
Quit ip
در ادامه، ما به تغییر نام دستورهای Redis که اگر به طور اشتباه یا توسط یک هکر وارد شوند، میتواند بر روی دادههای شما تأثیرات جدی داشته باشد، خواهیم پرداخت.
مرحله ۵ — تغییر نام دستورات ریسک پذیر
ویژگی امنیتی دیگری که به Redis تعلق دارد، تغییر نام یا کامل غیرفعال کردن برخی از دستوراتی است که خطرناک میباشند.
این دستورات توسط کاربران غیرمجاز، میتوانند برای تنظیم مجدد، از بین بردن یا به طور کلی از بین بردن دادههای شما استفاده شوند. مانند رمزعبور احراز هویت، تغییر نام یا غیرفعال کردن دستورات نیز در همان بخش SECURITY فایل /etc/redis/redis.conf پیکربندی میشود.
بعضی از دستوراتی که ریسک پذیر محسوب میشوند شامل: FLUSHDB، FLUSHALL، KEYS، PEXPIRE، DEL، CONFIG، SHUTDOWN، BGREWRITEAOF، BGSAVE، SAVE، SPOP، SREM، RENAME و DEBUG میباشند. این یک فهرست جامع نیست، اما تغییر نام یا غیرفعال کردن تمام دستورات در آن فهرست نقطه شروع خوبی برای افزایش امنیت سرور Redis شماست.
اینکه کدام دستور را غیرفعال یا تغییر نام دهید به نیازهای خاص شما یا نیازهای سایت شما بستگی دارد. اگر میدانید هرگز از یک دستوری که ممکن است سوءاستفاده شود استفاده نخواهید کرد، آن را میتوانید غیرفعال کنید. در غیر این صورت، ممکن است بهتر باشد آن را تغییر نام دهید.
برای تغییر نام یا غیرفعال کردن دستورات Redis، دوباره فایل پیکربندی را باز کنید:
sudo nano /etc/redis/redis.conf
هشدار: مراحل زیر صرفا مثال هایی جهت نحوه غیرفعال یا تغییر نام دستورات را نشان میدهند. شما فقط باید انتخاب کنید که دستوراتی که برای شما استفاده میشوند را غیرفعال یا تغییر نام دهید. شما میتوانید لیست کامل دستورات را بررسی کنید و تصمیم بگیرید که چگونه ممکن است خطر ساز شود redis.io/commands.
برای غیرفعال کردن یک دستور، آن را به یک رشته خالی (که با یک جفت علامت نقل قول بدون هیچ کاراکتری بین آنها مشخص می شود) تغییر نام دهید، همانطور که در زیر نشان داده شده است:
. . .
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 "
. . .
برای تغییر نام یک دستور، به آن یک نام دیگر دهید که همانند نمونههای زیر است. حدس دستورات تغییر نامداده شده باید برای دیگران دشوار و برای شما آسان باشد:
. . .
" rename-command CONFIG " #
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
. . .
تغییرات خود را ذخیره کرده و فایل را ببندید.
پس از تغییر نام یک دستور، تغییر را با راهاندازی مجدد Redis اعمال کنید:
sudo systemctl restart redis.service
برای تست دستور جدید، به خط فرمان Redis وارد شوید:
redis-cli
سپس، احراز هویت کنید:
auth your_redis_password ip
Output
OK
بگذارید فرض کنیم که دستور CONFIG را به ASC12_CONFIG تغییر دادهاید، همانطور که در مثال قبلی بود. ابتدا سعی کنید از دستور CONFIG اصلی استفاده کنید. باید ناموفق باشد، زیرا آن را تغییر دادهاید:
config get requirepass ip
Output
:(error) ERR unknown command `config`, with args beginning with
اما، فراخوانی دستور تغییرنامداده شده موفق خواهد بود. این دستورات حساس به بزرگی و کوچکی حروف نیست:
asc12_config get requirepass
Output
"requirepass"
"your_redis_password"
در نهایت، میتوانید از redis-cli خارج شوید:
Exit ip
توجه داشته باشید که اگر قبلاً از خط فرمان Redis استفاده می کنید و سپس Redis را مجدداً راه اندازی می کنید، باید دوباره احراز هویت کنید. در غیر این صورت، اگر دستوری را تایپ کنید، این خطا را دریافت خواهید کرد:
Output
.NOAUTH Authentication required
هشدار: در مورد عملیات تغییر نام دستورها، یک بیانیه امنیتی در انتهای بخش SECURITY در فایل /etc/redis/redis.conf وجود دارد که یاد آوردی میکند که رمز خود را در جای ذخیره کنید تا در صورت فراموشی از آن استفاده نمایید.
در محموع این دو آموزش، شما Redis را نصب و پیکربندی کردید، اعتبارسنجی کردید که نصب Redis شما به درستی کار میکند، و از ویژگیهای امنیتی داخلی آن برای کمتر کردن آسیبپذیری آن نسبت به حملات از جانب عوامل مخرب استفاده کردید.
به خاطر داشته باشید که بعد از ورود کسی به سرور شما، بسیار آسان است که ویژگیهای امنیتی خاص Redis را که قرار دادهایم دور بزند. بنابراین، مهمترین ویژگی امنیتی در سرور Redis شما فایروال (که اگر راهاندازی اولیه پیشنیاز را دنبال کرده باشید تنظیمات آن را انجام دادید) است، زیرا فایروال کار را برای عوامل مخرب بسیار سخت میکند.
امیدواریم که این مقاله به شما کمک کرده باشد تا توانسته باشید که ایمنی redis خود را بالا برده باشید. برای دیدن باقی آموزش ها میتوانید وارد منوی پشتیبانی بخش آموزش ها شوید، در صورتی که درباره این آموزش به مشکل یا سوالی برخورد کردید، میتوانید آن را در بخش دیدگاه بیان کنید.