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

$ 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 انجام دهيد ، بنابراين پس از اتمام آن را ذخيره كنيد و ببنديد. سپس ، سرويس 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 Wed 2018-06-27 18:48:52 UTC; 12s ago
Docs: http://redis.io/documentation,
man:redis-server(1)
Process: 2421 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS)
Process: 2424 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
Main PID: 2445 (redis-server)
Tasks: 4 (limit: 4704)
CGroup: /system.slice/redis-server.service
└─2445 /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

127.0.0.1:6379> get test
مقدار كليد شما هنوز بايد در دسترس باشد:
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 1422

اين خروجي نشان مي دهد كه برنامه 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 ، يك اخطار كامنت وجود دارد:
# 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

پس از كپي پيست كردن خروجي آن فرمان به عنوان مقدار جديد requirepass ، بايد اين را بخواند:
/etc/redis/redis.conf
requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

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

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

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

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

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

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

Output
OK

get key1 براي دريافت كليد جديد ، از Redis پرس و جو ميكند.
127.0.0.16379> get key1

Output
“10”

پس از تأييد اينكه مي توانيد بعد از تأييد اعتبار ، دستوراتي را در كلاينت Redis اجرا كنيد ، مي توانيد از redis-cli خارج شويد:
127.0.0.16379> 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’

با اين وجود فراخواني فرمان تغيير نام داده شده موفقيت آميز خواهد بود. به كوچك و بزرگ بودن كاراكترها حساس نيست:
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 ، فايروال شماست (كه در صورت پيروي از آموزش مقدماتي راه اندازي اوليه سرور مجازي اوليه، آن را پيكربندي كرده ايد) ، زيرا اين كار پرش از آن حصار امنيتي را براي حمله گران بسيار دشوار مي كند.