Redis يك فروشگاه با حافظه داخلي و مقدار كليد است كه به دليل انعطاف پذيري ، عملكرد و پشتيباني گسترده از زبان شناخته شده است. اين آموزش نحوه نصب ، پيكربندي و ايمن سازي Redis در يك سرور مجازي Ubuntu 20.04 را نشان مي دهد.
پيش نيازها
براي تكميل اين راهنما ، به يك سرور مجازي اوبونتو 20.04 كه داراي يك كاربر غير ريشه با امتيازات sudo و داراي يك فايروال اساسي است ، نياز داريد. مي توانيد با دنبال كردن راهنماي راه اندازي سرور مجازي اوليه ما اين كار را تنظيم كنيد.
مرحله 1 – نصب و پيكربندي Redis
ما از مدير بسته APT براي نصب مجدد مخازن رسمي اوبونتو استفاده خواهيم كرد. از اين نوشتار ، نسخه موجود در مخازن پيش فرض 5.0.7 است.
با به روز كردن حافظه نهان بسته محلي apt خود شروع كنيد:
$ sudo apt update

سپس Redis را با تايپ اين دستور نصب كنيد:
$ sudo apt install redis-server

با اين كار Redis و متعلقات آن دانلود و نصب مي شوند. پس از اين ، يك تغيير پيكربندي مهم براي ايجاد در فايل پيكربندي Redis وجود دارد كه به طور خودكار در حين نصب ايجاد مي شود.
اين فايل را با ويرايشگر متن مورد نظر خود باز كنيد:
$ sudo nano /etc/redis/redis.conf

در داخل فايل ، دستورالعمل supervised  را پيدا كنيد. اين دستورالعمل به شما امكان مي دهد سيستم شروع را براي مديريت Redis به عنوان يك سرويس اعلام كنيد و كنترل بيشتري بر عملكرد آن به شما ارائه مي دهد. دستورالعمل supervised  به صورت پيش فرض تنظيم نشده است. از آنجا كه شما اوبونتو را اجرا مي كنيد ، كه از سيستم شروع systemd استفاده مي كند ، اين را به systemd تغيير دهيد:
/etc/redis/redis.conf
. . .

# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
# supervised no – no supervision interaction
# supervised upstart – signal upstart by putting Redis into SIGSTOP mode
# supervised systemd – signal systemd by writing READY=1 to $NOTIFY_SOCKET
# supervised auto – detect upstart or systemd method based on
# UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal “process is ready.”
# They do not enable continuous liveness pings back to your supervisor.
supervised systemd

. . .

اين تنها تغييري است كه در اين مرحله بايد در فايل پيكربندي Redis انجام دهيد ، بنابراين پس از اتمام آن را ذخيره كنيد و ببنديد. اگر از nano براي ويرايش فايل استفاده كرده ايد ، اين كار را با فشار دادن CTRL + X ، Y ، سپس enter انجام دهيد.
سپس ، سرويس Redis را مجدداً راه اندازي كنيد تا تغييراتي كه در فايل پيكربندي ايجاد كرده ايد اعمال شوند:
$ sudo systemctl restart redis.service

با اين كار ، شما Redis را نصب و پيكربندي كرده ايد و در دستگاه شما كار مي كند. با اين حال ، قبل از شروع استفاده از آن ، بهتر است براي احتياط ابتدا بررسي كنيد كه آيا Redis عملكرد صحيحي دارد يا خير.
مرحله 2 – تست Redis
مانند هر نرم افزاري كه به تازگي نصب ميشود ، بهتر است كه قبل از ايجاد هرگونه تغيير بيشتر در پيكربندي آن ، از عملكرد Redis مطابق آنچه انتظار مي رود ، اطمينان حاصل كنيم. ما چند روش را براي بررسي اينكه Redis در اين مرحله به درستي كار مي كند ، مرور ميكنيم.
ابتدا بررسي كنيد سرويس Redis در حال اجراست:
$ sudo systemctl status redis

اگر بدون خطا در حال اجرا باشد ، اين دستور خروجي مشابه زير را ايجاد مي كند:
Output
● redis-server.service – Advanced key-value store
Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2020-04-30 23:26:54 UTC; 4s ago
Docs: http://redis.io/documentation,
man:redis-server(1)
Process: 36552 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
Main PID: 36561 (redis-server)
Tasks: 4 (limit: 2345)
Memory: 1.8M
CGroup: /system.slice/redis-server.service
└─36561 /usr/bin/redis-server 127.0.0.1:6379
. . .

در اينجا ، مي بينيد كه Redis در حال اجرا فعال شده است ، به اين معني كه هر بار كه سرور مجازي بوت شود ، راه اندازي مي شود.
توجه: اين تنظيمات براي بسياري از موارد استفاده رايج از Redis مطلوب است. اما اگر ترجيح مي دهيد هر بار كه سرور مجازي خود را راه اندازي ميكنيد ، Redis را به صورت دستي راه اندازي كنيد ، مي توانيد اين كار را با دستور زير تنظيم كنيد:
$ sudo systemctl disable redis

براي آزمايش عملكرد صحيح Redis ، با استفاده از كلاينت خط فرمان به سرور مجازي وصل شويد:
$ redis-cli

در اعلان زير ، اتصال را با دستور ping تست كنيد:
127.0.0.1:6379> ping

Output
PONG
اين خروجي تأييد مي كند كه اتصال سرور مجازي هنوز باقي است. در مرحله بعد ، بررسي كنيد كه مي توانيد با اجراي دستور زير، كليدها را تنظيم كنيد:
127.0.0.1:6379> set test “It’s working!”

Output
OK
مقدار را با تايپ اين دستور بازيابي كنيد:
127.0.0.1:6379> get test

با فرض اينكه همه چيز كار مي كنيد ، مي توانيد مقدار ذخيره شده خود را بازيابي كنيد:
Output
“It’s working!”
پس از تأييد اين كه مي توانيد مقدار را بدست آوريد ، براي بازگشت به پوسته از قسمت Redis خارج شويد:
127.0.0.1:6379> exit

به عنوان يك آزمايش نهايي ، بررسي خواهيم كرد كه آيا Redis قادر به حفظ داده حتي پس از متوقف شدن يا راه اندازي مجدد آن هست يا خير. براي انجام اين كار ، ابتدا نمونه Redis را ريستارت كنيد:
$ sudo systemctl restart redis

سپس يك بار ديگر با كلاينت خط فرمان ارتباط برقرار كرده و تأييد كنيد كه مقدار تست شما هنوز در دسترس است:
$ redis-cli

مقدار كليد شما هنوز بايد در دسترس باشد:
Output
“It’s working!”
پس از اتمام دوباره از پوسته خارج شويد:
127.0.0.1:6379> exit

با اين كار ، نصب Redis شما كاملاً عملياتي است و براي استفاده شما آماده است. با اين حال ، برخي از تنظيمات پيكربندي پيش فرض آن ناايمن است و فرصت حملات و دسترسي به سرور مجازي و داده هاي آن را مي دهد. مراحل باقيمانده در اين آموزش ، روش هاي كاهش اين آسيب پذيري ها را مطابق با وب سايت رسمي Redis ارائه ميدهد. اگرچه اين مراحل اختياري است و اگر تصميم به دنبال كردن آنها نداريد ، هنوز هم Redis كار خواهد كرد ، توصيه مي شود آنها را انجام دهيد تا امنيت سيستم شما بيشتر شود.
مرحله 3 – اتصال به localhost
به طور پيش فرض ، Redis فقط از localhost قابل دسترسي است. با اين وجود ، اگر Redis را با پيروي از آموزش ديگري، نصب و پيكربندي كرده ايد ، ممكن است فايل پيكربندي را به روز كرده باشيد تا بتوانيد از هرجاي ديگر اتصالات را برقرار كنيد. اين روش به اندازه كافي براي اتصال به localhost مطمئن نيست.
براي اصلاح اين مشكل ، فايل پيكربندي Redis را براي ويرايش باز كنيد:
$ sudo nano /etc/redis/redis.conf

اين خط را پيدا كرده و اطمينان حاصل كنيد كه باطل شده است (در صورت وجود # ، آن را حذف كنيد):
/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-ser

توجه: ممكن است دستور 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) با گذرواژه تأييد كنيد.
مرحله 4 – پيكربندي رمز عبور Redis
پيكربندي رمز عبور Redis يكي از دو ويژگي امنيتي داخلي خود را ايجاد مي كند – دستور auth ، كه به تاييد اعتبار كلاينت ها براي دسترسي به پايگاه داده نياز دارد. رمز عبور مستقيماً در فايل پيكربندي Redis ، /etc/redis/redis.conf پيكربندي شده است ، بنابراين دوباره آن فايل را با ويرايشگر مورد نظر خود باز كنيد:
$ sudo nano /etc/redis/redis.conf

به بخش SECURITY برويد و به دنبال دستورالعملي باشيد كه وظيفه خواندن را دارد:
/etc/redis/redis.conf
. . .
# requirepass foobared
. . .

با حذف # آن را لغو كنيد و foobared  را به يك رمزعبور امن تغيير دهيد.
توجه: در بالاي دستورالعمل requirepass در فايل redis.conf ، يك اخطار كامنت وجود دارد:
/etc/redis/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.
#
. . .
بنابراين ، مهم است كه يك مقدار بسيار قوي و بسيار طولاني را به عنوان رمزعبور خود تعيين كنيد. به جاي ايجاد رمز عبور ، مي توانيد از دستور opensl براي ايجاد پسورد تصادفي استفاده كنيد ، مانند مثال زير. با اتصال خروجي دستور اول به دستور دوم opensl ، همانطور كه در اينجا نشان داده شده است ، هرگونه وقفه بين خطوط را كه توسط آن دستور اول ايجاد مي شود حذف مي كند:
$ openssl rand 60 | openssl base64 -A

خروجي شما اينگونه خواهد بود:
Output
RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

پس از كپي پيست كردن خروجي آن فرمان به عنوان مقدار جديد مورد نياز ، بايد اين را بخواند:
$ sudo systemctl restart redis.service

پس از تنظيم گذرواژه ، فايل را ذخيره كرده و ببنديد ، و Redis را ريستارت كنيد:
$ redis-cli

در زير توالي دستورات مورد استفاده براي تست رمز Redis وجود دارد. دستور اول سعي مي كند قبل از تأييد اعتبار ، كليد را روي يك مقدار تنظيم كند:
127.0.0.1:6379> set key1 10

اين رمز كار نخواهد كرد زيرا شما تأييد اعتبار نكرديد ، بنابراين Redis خطايي را برمي گرداند:
Output
(error) NOAUTH Authentication required.

دستور بعدي با گذرواژه مشخص شده در فايل پيكربندي Redis تأييد اعتبار مي كند:
127.0.0.1:6379> auth your_redis_password

Redis تصديق مي كند:
Output
OK
پس از آن ، اجراي دوباره فرمان قبلي موفق خواهد شد:
127.0.0.1:6379> set key1 10

Output
OK

get key1 مقدار كليد جديد را از Redis پرس و جو ميكند.
127.0.0.1:6379> get key1

Output
“10”

پس از تأييد اينكه مي توانيد پس از تاييد اعتبار دستوراتي را در كلاينت Redis اجرا كنيد ، مي توانيد از redis-cli خارج شويد:
127.0.0.1:6379> quit

در مرحله بعد ، تغيير نام دستورات Redis را بررسي خواهيم كرد كه اگر به اشتباه يا توسط يك حمله گر مورد هدف قرار گيرد ، مي تواند آسيب جدي به دستگاه شما وارد كند.
مرحله 5 – تغيير نام دستورات خطرناك
ويژگي امنيتي ديگر قرار داده شده در 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 را تعيين كنيد.

براي غيرفعال كردن يك دستور ، كافي است آن را به يك رشته خالي تغيير دهيد (كه توسط يك جفت علامت نقل قول بدون هيچ كاراكتري بين آنها مشخص شده است) ، همانطور كه در زير نشان داده شده:
/etc/redis/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/redis.conf
. . .
# rename-command CONFIG “”
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
. . .

تغييرات خود را ذخيره كرده و فايل را ببنديد.
پس از تغيير نام يك فرمان ، با راه اندازي مجدد Redis ، تغيير را اعمال كنيد:
$ sudo systemctl restart redis.service

براي آزمايش دستور جديد ، وارد خط فرمان Redis شويد:
$ redis-cli

سپس ، تأييد اعتبار كنيد:
127.0.0.1:6379> auth your_redis_password

Output
OK
فرض كنيم كه شما دستور CONFIG را مانند مثال قبل به ASC12_CONFIGتغيير نام داديد . ابتدا سعي كنيد از دستور اصلي CONFIG استفاده كنيد. بايد با شكست مواجه شود ، زيرا شما آن را تغيير نام داده ايد:
127.0.0.1:6379> config get requirepass

Output
(error) ERR unknown command `config`, with args beginning with:

با اين وجود فراخواني فرمان تغيير نام داده شده موفقيت آميز خواهد بود. به كوچك و بزرگ بودن كاراكترها حساس نيست:
127.0.0.1:6379> asc12_config get requirepass

Output
1) “requirepass”
2) “your_redis_password”

درنهايت ، مي توانيد از redis-cli خارج شويد:
127.0.0.1:6379> exit

توجه داشته باشيد كه اگر قبلاً از خط فرمان Redis استفاده كرده ايد و دوباره Redis را ريستارت كرده ايد ، بايد مجددا تأييد اعتبار كنيد. در غير اين صورت ، اگر يك دستور تايپ كنيد ، اين خطا را دريافت خواهيد كرد:
Output
NOAUTH Authentication required.

به خاطر تغيير نام دستورات ، در پايان بخش SECURITY در /etc/redis/redis.conf يك عبارت احتياط وجود دارد:
/etc/redis/redis.conf
. . .
# Please note that changing the name of commands that are logged into the
# AOF file or transmitted to replicas may cause problems.
. . .

توجه: پروژه Redis از اصطلاحات “master” و “slave” استفاده ميكند ، در حالي كه vpsgol عموماً اصطلاحات “primary” و “secondary” را ترجيح مي دهد به معني اوليه و ثانويه.
براي جلوگيري از سردرگمي ، تصميم گرفتيم كه در اينجا از اصطلاحات استفاده شده در مستندات Redis استفاده كنيم.
اين بدان معناست كه اگر دستور تغيير نام يافته در فايل AOF نباشد ، يا اگر موجود باشد اما فايل AOF به slaves ارسال نشده باشد ، ديگر مشكلي وجود نخواهد داشت.
بنابراين ، هنگام تغيير نام دستورات ، اين را به خاطر داشته باشيد. بهترين زمان براي تغيير نام يك فرمان زماني است كه شما از ماندگاري AOF استفاده نمي كنيد ، يا درست بعد از نصب ، يعني قبل از استقرار برنامه مبتني بر Redis.
هنگامي كه از AOF استفاده مي كنيد و با يك نصب master slave سرو كار داريد ، اين پاسخ را از صفحه صدور GitHub پروژه در نظر بگيريد.
بنابراين ، بهترين روش براي تغيير نام در مواردي از اين دست ، اين است كه مطمئن شويد دستورات تغيير نام يافته به تمام مثال هاي نصب هاي master-slave اعمال ميشود.
نتيجه
در اين آموزش ، Redis را نصب و پيكربندي كرده ايد ، تأييد كرديد كه نصب Redis شما به درستي كار مي كند و از ويژگي هاي امنيتي داخلي استفاده كرده است تا در برابر حملات مخرب كمتر آسيب پذير باشد.
به خاطر داشته باشيد كه پس از ورود شخصي به سرور مجازي شما ، دور زدن ويژگي هاي امنيتي ويژه Redis كه ما در آن قرار داده ايم بسيار آسان است. بنابراين ، مهمترين ويژگي امنيتي در سرور مجازي Redis ، فايروال شماست (كه در صورت پيروي از آموزش مقدماتي راه اندازي اوليه سرور مجازي اوليه، آن را پيكربندي كرده ايد) ، زيرا اين كار پرش از آن حصار امنيتي را براي حمله گران بسيار دشوار مي كند.