آموزش نصب و امن سازی پایگاه داده Redis در Centos 7

redis_centos_install_1

آموزش نصب و امن سازی پایگاه داده Redis در Centos 7

How to Install and Secure Redis on Centos 7

معرفی

Redis یک پایگاه داده با ساختار ذخیره سازی در رم (RAM) می باشد که در ذخیره سازی بسیار عالی است. یک پایگاه داده غیر رابطه ای که به انعطاف پذیری ، کارایی ، مقیاس پذیری و پشتیبانی گسترده از زبان های مختلف مشهور است.

پایگاه داده Redis برای کاربران قابل اعتماد در یک محیط امن طراحی شده و دارای برخی گزینه های امنیتی پایه ای مانند پسورد های رمز نشده ابتدایی ، دستورات تغییر نام و غیر فعال کردن است فاقد ویژگی های امنیتی قوی است. در این آموزش به نصب مستقل برنامه و پیکربندی این ویژگی های امنیتی می پردازیم که باعث بهتر شدن امنیت این پایگاه در Centos 7 می شود.

دقت کنید که در این مطلب به این موضوع که سرور Redis و برنامه های کاربر در یک هاست یا دیتاسنتر هستند یا در محل های متفاوتی هستند ، توجهی نمی شود ، و اگر در مکان های متفاوتی هستند برای ارتباط با سرور Redis بهتر است از شبکه های امن شده بوسیله SSL Proxy یا VPN استفاده کنید.

پیش نیاز ها

مواردی که در این آموزش به آن ها نیاز دارید :

  • یک سرور مجازی CentOS 7 که تنظیمات اولیه بر روی آن انجام شده
  • نصب و پیکربندی firewalld مطابق قسمت Turning on the firewall step در این راهنما

 بعد از تهیه این پیش نیاز ها آماده نصب و پیکربندی Redis هستیم.

مرحله اول – نصب Redis

قبل از نصب باید آدرس مخازن  Extra Packages for Enterprise Linux (EPEL) repository  به لیست پکیج های سرور اضافه شود. EPEL یک مخزن پکیج است که شامل پکیج برنامه های افزونه متن باز می باشد که بیشتر آنها توسط پروژه Fedora نگهداری می شوند.

نصب EPEL با yum :

بعد از اتمام نصب EPEL ، دستور نصب Redis را با yum وارد کنید :

اجرای این دستور ممکن است چند دقیقه زمان نیاز داشته باشد. بعد از نصب Redis ، سرویس آن را راه اندازی کنید :

همچنین برای راه اندازی خودکار سرویس این برنامه ، سرویس آن را enable کنید :

وضعیت سرویس Redis را نیز می توانید با دستور زیر بررسی کنید :

بعد از اطمینان از اینکه سرویس Redis به درستی کار می کند ، از دستور زیر برای بررسی تنظیمات استفاده کنید :

redis-cli ping

در پاسخ این دستور اگر pong نمایش داده شد ، به این معنی است که Redis بر روی سرور در حال اجرا است و می توانیم به سراغ تنظیمات امنیتی برویم.

مرحله دوم – اتصال و امنیت Redis با یک Firewall

یک راه مطمئن برای حفاظت از Redis ، امن کردن سروری است که بر روی آن در حال اجرا است. و برای انجام این کار از محدود کردن دسترسی به Redis در شبکه localhost یا شبکه اختصاصی با استفاده از فایروال استفاده می کنیم.

اگر از کلاستر Redis طبق این آموزش استفاده می کنید ، در فایل پیکربندی اجازه اتصال از همه جا داده می شود ، که دیگر نمی توان به یک آدرس خصوصی یا شبکه محلی محدود کرد.

فایل پیکربندی Redis را توسط یک ویرایشگر باز کنید :

دقت کنید که خط زیر با bind شروع شود و این خط توضیح نباشد :

اگر باید Redis را به آدرس IP دیگری متصل کنید ( مانند زمانی که نیاز دارید از یک هاست دیگر به Redis متصل شوید ) ، شدیدا توصیه می کنیم که از  یک آدرس IP خصوصی استفاده کنید. متصل کردن پایگاه داده به یک آدرس عمومی سرور شما را در معرض عموم قرار می دهد.

اگر پیش نیاز ها را انجام داده باشید و فایروال را نصب و پیکربندی کرده باشید و برنامه ای برای  اتصال از هاست یا مکان دیگر به Redis ندارید ، نیازی به تنظیمات اضافه در فایروال نیست. هر ترافیک ورودی به صورت پیش فرض قطع خواهد شد مگر اینکه به صراحت در فایروال طبق رول های تعریف شده اجازه داشته باشد. از آنجایی که در نصب مستقل Redis ، فقط به رابط loopback  (۱۲۷٫۰٫۰٫۱ or localhost)گوش می کند ، جای نگرانی برای ترافیک ورودی از پورت پیش فرض نیست.

ولی اگر نیاز دارید که از هاست یا مکان دیگری به Redis متصل شوید ، باید با دستور firewall-cdm تغییراتی را در پیکربندی فایروال انجام دهید. مجددا به این نکته دقت کنید که برای دسترسی به سرور Redis از یک آدرس IP خصوصی استفاده کنید و سرویس دهی را به همین آدرس محدود کنید.

در ابتدا یک محدوده اختصاصی dedicated zone برای Redis در سیاست های فایروال ایجاد می کنیم :

سپس پورتی را که می خواهید باز کنید ، مشخص کنید. پورت پیش فرض ۶۳۹۷ می باشد :

سپس ، آدرس IP که می خواهید اجازه دسترسی از طریق فایروال را به آن بدهید ، مشخص کنید :

در انتها دستور زیر را برای راه اندازی مجدد فایروال و اجرای قوانین تعیین شده وارد کنید :

طبق این تنظیمات ، وقتی بسته های ارسالی از آدرس IP کاربر تعیین شده دریافت می شود توسط رول تعیین شده در Redis zone اجازه اتصال داده می شود. بقیه درخواست های توسط public zone پردازش می شوند و اگر درخواستی با رول ها ، مطابق باشند ، اجازه دسترسی به آنها داده می شود و نیاز نیست رول دیگری مانند SSH یا چیزی دیگری را در redis zone تعریف کنید.

اگر فایروال را با استفاده از iptables تنظیم کردید ، برای تعریف رول اجازه دسترسی به آدرس IP کاربر به سرور Redis باید دستورات زیر را وارد کنید :

از هر مکانیزمی که استفاده می کندی در انتها ، مطمئن شوید که تغییرات فایروال ذخیره شوند. برای آموزش بیشتر در زمینه iptable می توانید این مطلب را مطالعه کنید :  Iptables essentials guide

 از هر ابزاری برای تنظیم فایروال استفاده می کنید مهم نیست ، همه آنها کار می کنند ، فقط باید دقت کنید که افراد ناشناس نتوانند به سرور شما دسترسی پیدا کنند. در قسمت بعد، Redis را طوری تنظیم می کنیم که فقط با یک رمز قوی در دسترس باشد.

مرحله سوم – تنظیم رمز عبور Redis

اگر شما Redis را برای کلاستر طبق این آموزش تنظیم کرده اید باید رمز عبور برای برنامه تنظیم کنید. اگر مایل باشید در ادامه این قسمت می توانید یک رمز عبور قوی تعیین کنید و اگر نمی خواهید رمز عبور قوی تعیین کنید ، می توانید فقط یک رمز برای سرور پایگاه داده تنظیم کنید.

با تنظیم رمز عبور برای Redis ، ویژگی امنیتی داخلی آن فعال می شود و کاربران باید قبل از دسترسی به پایگاه داده احراز هویت شوند. مانند تنظیمات bind ، برای تنظیم رمز عبور نیز باید فایل /etc/redis.conf را ویرایش کنید :

در قسمت SECURITY خط زیر را که به صورت توضیح است را پیدا کنید :

با حذف علامت # از ابتدای خط ، آن را از حالت توضیح خارج کنید و یک رمز قوی به جای عبارت foobared قرار دهید. برای تعیین رمز عبور به جای این که خودتان این رمز را وارد کنید می توانید از ابزارهایی مانند apg یا pwgen برای تولید رمز قوی و تصادفی استفاده کنید. اگر هم از ابزار خاصی نمی خواهید استفاد کنید برای تولید یک رمز خیلی قوی می توانید از دستور زیر استفاده کنید :

می توانید به جای آدرس وارد شده هر متن دیگری را قرار دهید. خروجی دستور خیلی طولانی و قابل خواندن نیست و باید آن را کپی کنید ولی یک رمز بلند و خیلی قوی است. اگر می خواهید یک رمز کوتاه تولید کنید از دستور زیر استفاده کنید :

بعد از کپی کردن رمز آن را در مقدار عبارت requirepass قرار دهید. این خط باید به صورت زیر باشد :

سپس فایل را ذخیره کرده و خارج شوید و دستور زیر را وارد کنید Redis مجددا راه اندازی شود و تغییرات اعمال شود :

برای تست رمز عبور دستور زیر را برای وارد شدن به Redis وارد کنید :

برای اینکه بررسی کنید که رمز عبور کار می کند یا خیر دستور زیر را وارد کنید :

چون هنوز به پایگاه داده وارد نشده اید ، این دستور نباید کار کند و خطای مثل این را نمایش می دهد :

برای احراز هویت ، دستور زیر را همراه با رمز عبوری که در فایل پیکربندی Redis مشخص کرده اید وارد کنید :

Redis اعلام می کند که ما تایید شده ایم :

مجددا دستور قبلی را وارد کنید ، این بار باید به درستی انجام شود :

دستور get key1 یک کوئری را برای Redis اجرا می کند و مقدار تعیین شده را نمایش می دهد :

در انتها دستور زیر یا exit را برای خروج از محیط redis-cli وارد کنید :

با این کار دسترسی کاربران احراز هویت نشده به redis خیلی سخت می شود. ولی دقت کنید که اگر از راه دور به پایگاه داده Redis متصل می شوید اگر از یک بستر امن SSL یا VPN استفاده نکنید ، رمز جابجا شده بین برنامه کاربر و Redis به صورت رمز نشده منتقل می شود و قابل شنود است.

در ادامه نگاهی می اندازیم به تغییر نام دستورات Redis برای حفاظت بیشتر از Redis.

مرحله چهارم – تغییر نام دستورات Redis

ویژگی امنیتی دیگری که در Redis در نظر گرفته شده است ، غیر فعال کردن و یا تغییر نام دستورات حساس و خطرناک Redis است. کاربرانی که احراز هویت نیز شده اند ممکن است دستوراتی را استفاده کنند که موجب حذف ، تغییر و یا از بین رفتن کامل اطلاعات شوند. برخی از دستورات خطرناک در زیر لیست شده اند :

FLUSHDB

FLUSHALL

KEYS

PEXPIRE

DEL

CONFIG

SHUTDOWN

BGREWRITEAOF

BGSAVE

SAVE

SPOP

SREM RENAME DEBUG

این لیست همه دستورات نیست ، ولی غیر فعال یا تغییر نام این دستورات برای شروع مناسب است. دستوراتی که از آنها استفاده نمی کنید و شما را اذیت می کنند را غیر فعال کنید ، در غیر اینصورت نام آن ها را تغییر دهید.

تنظیمات این قسمت نیز در بخش SECURITY فایل /etc/redis.conf می باشد. مجددا این فایل را در حالت ویرایش باز کنید :

نکته : دقت کنید که این یک مثال است. شما باید هر دستوری که خودتان می خواهید را غیرفعال یا تغییر نام دهید. لیست کامل دستورات را می توانید از این لینک مشاهده کنید : redis.io/commands

برای غیر فعال کردن یک دستور آن را با یک رشته خالی تغییر نام دهد ، مانند زیر :

برای تغییر نام دستورات مانند نمونه زیر عمل کنید و نام هایی که قرار می دهید سخت باشند تا حفظ کردن آن ها برای کاربران دیگر سخت باشد :

بعد از انجام تغییرات فایل را ذخیره کرده و خارج شوید ، سپس برای اعمال تغییرات دستور زیر را برای راه اندازی مجدد Redis بارگذاری کنید :

برای تست دستورات وارد محیط دستوری Redis شوید :

با دستور زیر ، مانند قبل خودتان را احراز هویت کنید :

با فرض اینکه شما دستور config را به ASC12_CONFIG تغییر داده اید ، دستور config به شکل زیر باید دچار خطا شود :

دستور فوق را با نام جدیدی که تعیین کردیم دوباره وارد می کنیم و اگر بدون خطا اجرا شود خروجی مانند زیر است :

در انتها از محیط دستوری redis خارج شوید :

دقت کنید که اگر دستورات Redis را وارد کردید و سرویس آن را ریستارت کردید ، باید مجددا احراز هویت شوید. در غیر اینصورت خطایی مشابه زیر را مشاهده می کنید :

با توجه به دستورات تغییر نام ، برخی نکات احتیاطی در انتهای قسمت SECURITY فایل پیکربندی آورده شده است :

به این معنی است که دستورات تغییر نام داده شده در فایل AOF نیستند ، یا اگر باشند نمی تواند آنها را برگرداند ، پس مشکلی وجود ندارد. نام هایی را که تغییر داده در ذهن بسپارید و فراموش نکنید. بهترین زمان برای تغییر نام دستور ، زمانی است که از AOF استفاده نمی کنید یا دقیقا بعد از نصب ( قبل از اینکه برنامه Redis به صورت سرویس اجرا شود).

اگر از AOF استفاده می کنید یا برنامه را به صورت master-slave نصب کردید ، پاسخ این سئوال از مشکلات GitHub برای شما مفید است :

The commands are logged to the AOF and replicated to the slave the same way they are sent, so if you try to replay the AOF on an instance that doesn’t have the same renaming, you may face inconsistencies as the command cannot be executed (same for slaves).

بهترین راه برای حل مشکل مشابه به این ، اطمینان از اعمال دستورات تغییر نام داده شده در نصب های master-slave می باشد.

مرحله پنجم – تنظیم مالکیت دایرکتوری داده ها و دسترسی فایل ها

در این قسمت ، تغییراتی در مالکیت و مجوز های دسترسی های نصب Redis را برای بهبود امنیت انجام دهیم. برای این کار باید مطمئن باشید که فقط کاربری که نیاز است به داده های Redis دسترسی داشته باشد ، دارای مجوز باشد که این کاربر به صورت پیش فرض redis می باشد.

برای پیدا کردن دایرکتوری داده های Redis از دستور grep به صورت زیر استفاده کنید :

همانطور که مشاهده می کنید کاربر redis مالک این دایرکتوری می باشد و گروه redis نیز به این دایرکتوری مجوز دسترسی دارد. تنظیمات مالکیت این دایرکتوری امن است ولی مجوز دسترسی ۷۵۵ مناسب نیست. مجوز دسترسی این دایرکتوری را ۷۷۰ قرار دهید تا مطمئن شوید که غیر از کاربر redis ، کاربر دیگری دسترسی ندارد :

تنظیم دیگر برای مجوز دسترسی ، برای فایل پیکربندی Redis می باشد. به صورت پیش فرض این فایل مجوز ۶۴۴ را برای کاربر و گروه root دارد :

همانطور که در مرحله چهارم دیدید رمز عبور تعیین شده و اطلاعات دیگر در این فایل به صورت رمز نشده هستند ، و برای جلوگیری از دسترسی دیگران برای مشاهده و تغییر این فایل ، مجوز ۶۴۴ را برای این فایل قرار دهید. البته در شرایط ایده آل بهتر است که مالکیت دوم این فایل با گروه redis باشد که برای انجام این کار از دستور زیر استفاده کنید :

دستور زیر را برای تغییر مجوز دسترسی فایل وارد کنید :

با دستور زیر می توانید تغییرات مجوز های دسترسی را مشاهده کنید :

در انتها نیز سرویس redis را مجددا راه اندازی کنید :

پایان

خوب ما توانستیم Redis را به درستی نصب و پیکربندی کنیم و تنظیمات امنیتی را انجام دهیم ولی به یاد داشته باشید که همیشه کاربری که به سیستم شما وارد شده است می تواند ویژگی های امنیتی Redis را دور بزند. مهمترین مسئله امنیتی که در این آموزش انجام دادیم تنظیمات فایروال که جلوی ورود و دسترسی کاربران ناشناس به سرور را می گیرد.

دوباره متذکر می شویم که برای امن کردن ارتباطات Redis از SSL Proxy که پیشنهاد توسعه دهندگان است استفاده کنید و برای این کار می توانید از راهنمای رسمی امنیت Redis استفاده کنید.

Leave a Reply