הקדמה
Redis הוא מאגר נתונים מקור פתוח, בזיכרון זמני, המתמחה במטמון. Redis הוא מסד נתונים לא רצוני שמפורסם בגמישותו, ביצועיו, בקיפוליות ובתמיכה רחבה בשפות.
Redis פותח עבור שימוש על ידי לקוחות מהימנים בסביבה מהימנית, ואין לו תכונות אבטחה חזקות משל עצמו. עם זאת, ל- Redis יש כמה תכונות אבטחה כגון אימות בסיסי ואפשרות לשנות שם או לנטרל מספר פקודות. מדריך זה מספק הוראות על איך להתקין את Redis ולהגדיר את תכונות האבטחה אלה. כמו כן, הוא מכסה מספר הגדרות אחרות שיכולות לשפר את האבטחה של התקנת Redis בודד על Rocky Linux 8.
שימו לב שמדובר במדריך שאינו פונה למצבים בהם השרת של Redis ויישומי הלקוח נמצאים במארחים שונים או במרכזי נתונים שונים. התקנות שבהן תנתוני Redis צריכים לעבור רשת לא מאובטחת או לא מהימנה תצריכנה סט קונפיגורציות שונה, כגון הגדרת פרוקסי SSL או VPN בין מכונות ה- Redis.
ניתן גם להשתמש ב- שירות ה- Redis הניהולי של DigitalOcean.
דרישות מוקדמות
כדי להשלים את המדריך הזה, יש לך צורך בשרת המריץ את Rocky Linux 8. השרת צריך לכלול משתמש לא רוט עם הרשאות מנהל וגם חומת אש מוגדרת עם firewalld
. כדי להגדיר זאת, עקוב אחר המדריך שלנו להגדרת שרת ראשונית עבור Rocky Linux 8 מדריך הגדרת שרת ראשונית עבור Rocky Linux 8.
שלב 1 — התקנת והפעלת Redis
ניתן להתקין את Redis עם מנהל החבילות DNF. באמצעות DNF, ניתן להתקין את Redis, התלויותיו, וגם את nano
, עורך הטקסט הידידותי למשתמש. אין חובה להתקין את nano
, אך נשתמש בו בדוגמאות במהלך המדריך:
- sudo dnf install redis nano
הפקודה הזו תציע לך לאשר שברצונך להתקין את החבילות הנבחרות. לחץ y
ואז ENTER
כדי לעשות זאת:
Output. . .
Total download size: 1.5 M
Installed size: 5.4 M
Is this ok [y/N]: y
לאחר מכן, ישנה שינוי תצורה חשובה אחת שצריך לבצע בקובץ התצורה של Redis, שנוצר באופן אוטומטי במהלך ההתקנה.
פתח את הקובץ הזה עם העורך טקסט המועדף עליך. כאן נשתמש ב־nano
:
- sudo nano /etc/redis.conf
בקובץ, יש למצוא את ההוראה supervised
. ההוראה הזו מאפשרת לך להגדיר מערכת הפעלה יזומה כדי לנהל את Redis כשירות, ולספק לך שליטה נוספת על הפעולה שלו. ההוראה supervised
מוגדרת כ-no
כברירת מחדל. מכיוון שאתה מפעיל את Rocky Linux, שמשתמשת במערכת ההפעלה systemd, יש לשנות זאת ל-systemd
:
. . .
# אם אתה מפעיל את Redis מ upstart או systemd, Redis יכול להתממשק עם עץ הפיקוח שלך.
# אפשרויות:
# supervised no - ללא אינטראקציה עם הפיקוח
# supervised upstart - לשלוח הודעת SIGSTOP ל upstart
# supervised systemd - לשלוח הודעה READY=1 ל- $NOTIFY_SOCKET של systemd
# supervised auto - זיהוי שיטת upstart או systemd בהתבסס על
# משתני הסביבה UPSTART_JOB או NOTIFY_SOCKET
# לתשומת ליבך: שיטות הפיקוח הללו משלימות רק "התהליך מוכן".
# הן לא מאפשרות שליחת פינגים רציניים ורצימים חוזרים לפיקוח שלך.
supervised systemd
. . .
זו השינוי היחיד שיש לבצע בקובץ התצורה של Redis בנקודה זו, אז שמור וסגור אותו כאשר תסיים. אם השתמשת ב-nano
לעריכת הקובץ, תשמור ותיצא בעזרת CTRL + X
, ואז, כאשר תתבקש, תלחץ Y
ואז Enter.
לאחר עריכת הקובץ, התחל את שירות ה-Redis:
- sudo systemctl start redis.service
אם תרצה שה-Redis יתחיל בעת ההפעלה, תוכל להפעיל אותו באמצעות הפקודה enable
.
- sudo systemctl enable redis
שים לב שהפקודה הזו אינה כוללת את הסיומת .service
אחרי שם קובץ היחידה. ניתן להשאיר את הסיומת הזו מחוץ לפקודות systemctl
בדרך כלל, מכיוון שניתן לפענח אותה אוטומטית משמות השירותים.
ניתן לבדוק את מצב Redis על ידי הרצת הפקודה הבאה:
- sudo systemctl status redis
Output● redis.service - Redis persistent key-value database
Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/redis.service.d
└─limit.conf
Active: active (running) since Tue 2022-09-06 22:11:52 UTC; 40s ago
Main PID: 14478 (redis-server)
Tasks: 4 (limit: 11152)
Memory: 6.6M
CGroup: /system.slice/redis.service
└─14478 /usr/bin/redis-server 127.0.0.1:6379
לאחר שאישרת ש-Redis פועל באמת, ניתן לבדוק את פונקציונליותו בעזרת הפקודה הזו:
- redis-cli ping
זה צריך להדפיס PONG
כתגובה:
OutputPONG
אם כך הדבר, זה אומר שעכשיו יש לך את Redis רץ על השרת וניתן להתחיל להגדיר אותו כדי לשפר את האבטחה שלו.
שלב 2 — הגדרת Redis ואבטחתו באמצעות חומת אש
דרך אפקטיבית לשמור על Redis היא לאבטח את השרת בו הוא פועל. ניתן לעשות זאת על ידי הבטחת ש-Redis רק מחובר ל-localhost או לכתובת IP פרטית וגם בדיקה שיש לשרת חומת אש שפועלת.
אך, אם בחרת להגדיר את Redis באמצעות מדריך אחר, ייתכן ועדכנת את קובץ התצורה כך שהוא מאפשר חיבורים מכל מקום. זה לא כל כך בטוח כמו הגבלת החיבור ל-localhost או לכתובת IP פרטית.
כדי לתקן זאת, פתח שוב את קובץ התצורה של Redis עם עורך הטקסט המועדף עליך:
- sudo nano /etc/redis.conf
אתרו את השורה המתחילה ב־bind
ווודאו שהיא לא מפוטרת מהקובץ או מנוטרלת, על ידי הסרת התו #
מהתחלת השורה אם נדרש:
. . .
bind 127.0.0.1
אם עליכם לקשור את Redis לכתובת IP אחרת (כמו במקרים שבהם תגישו ל־Redis ממחשב מתוארך אחר), עליכם לשקול בתוקף לקשור אותו לכתובת IP פרטית. הקשירה לכתובת IP ציבורית מגבירה את החשיפה של ממשק ה־Redis שלכם לצדדים חיצוניים:
. . .
bind your_private_ip
לאחר אישור שההכוונה bind
לא מופיעה בהערות, ניתן לשמור ולסגור את הקובץ.
אם עקבתם אחר הדרישות המוקדמות בשלב ההגדרה הראשונית של השרת והתקנתם את firewalld על השרת שלכם, ואינכם מתכננים להתחבר ל־Redis ממחשב מתוארך אחר, אין צורך להוסיף כללים אש נוספים עבור Redis. לאחר הכול, כל תעבורה נכנסת תישלח בברירת המחדל אלא אם נאשר פעולה זו באופן מפורש על ידי כללי האש. מאחר וההתקנה הבודדת ברירת מחדל של שרת Redis רק מקשיבה לממשק הלופבאק (127.0.0.1
או localhost), אין צורך לדאוג לתעבורה נכנסת בפורט ברירת המחדל שלו.
אם, בכל זאת, אתם מתכננים לגשת ל־Redis ממחשב מתוארך אחר, תצטרכו לבצע מספר שינויים בתצורת firewalld שלכם באמצעות פקודת firewall-cmd
. שוב, עליכם לאפשר רק גישה לשרת ה־Redis שלכם מהמחשבים שלכם על ידי השימוש בכתובות ה־IP הפרטיות שלהם כדי להגביל את מספר המחשבים שבהם השירות שלכם מחשף.
כדי להתחיל, הוסיפו אזור Redis מוקדש למדיניות firewalld שלכם:
- sudo firewall-cmd --permanent --new-zone=redis
אז ציין איזה פורט ברצונך לפתוח. Redis משתמשת בפורט 6379
כברירת מחדל:
- 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 המיועד לחיבור זה. כל החיבורים האחרים יעברו דרך האזור המוגדר כברירת מחדל public
. שירותים באזור המוגדר כברירת מחדל יחולו על כל חיבור, ולא רק על אלה שאינם תואמים באופן בלעדי, לכן לא יש להוסיף שירותים אחרים (לדוגמה SSH) לאזור ה-Redis מכיוון שהכללים האלו ייחלקו באופן אוטומטי לחיבור זה.
יש לזכור כי כל כלי גן אש יעבוד, בין אם אתה משתמש ב-firewalld
, ufw
, או iptables
. החשוב הוא שהגן האש פועל ופועל כך שאנשים לא ידועים לא יוכלו לגשת לשרת שלך. בשלב הבא, יש להגדיר את Redis כך שיהיה נגיש רק עם סיסמה חזקה.
שלב 3 — הגדרת סיסמת Redis
הגדרת סיסמת Redis מאפשרת את אחת מתכונות האבטחה המובנות שלו – פקודת auth
– שדורשת מלקוחות לאמת עצמם לפני שישורו למסד הנתונים. כמו הגדרת ה-bind
, הסיסמה מוגדרת ישירות בקובץ התצורה של Redis, /etc/redis.conf
. פתחו את הקובץ הזה:
- sudo nano /etc/redis.conf
גללו לאזור ה-SECURITY
וחפשו הוראה מפורשת המסומנת בהערה שאומרת:
. . .
# requirepass foobared
בטלו את ההערה על ידי הסרת ה-#
, ושנו את foobared
לסיסמה חזקה מאוד שתבחרו.
הערה: במקום ליצור סיסמה בעצמכם, תוכלו להשתמש בכלי כמו apg
או pwgen
כדי ליצור אחת. אם אין לכם רצון להתקין אפליקציה רק כדי ליצור סיסמה, תוכלו להשתמש בפקודה הבאה. פקודה זו מדפיסה ערך מחרוזת ומפנה אותו לתוך פקודת sha256sum
הבאה, שתציג את ה- SHA256 checksum של המחרוזת.
שימו לב שהזנת הפקודה כפי שכתובה תגרום ליצירת אותה סיסמה בכל פעם. כדי ליצור סיסמה ייחודית, שנו את המחרוזת בציטוטים למילה או ביטוי אחר:
- echo "digital-ocean" | sha256sum
אף על פי שהסיסמה שתיווצר לא תהיה זכורה, היא תהיה חזקה מאוד וארוכה, די בדיוק לסוג הסיסמה הנדרשת עבור Redis. לאחר העתקת והדבקת פלט הפקודה הזו כערך החדש של requirepass
, הוא צריך לקרוא:
. . .
requirepass password_copied_from_output
לחלופין, אם אתם מעדיפים סיסמה קצרה יותר, תוכלו להשתמש בפלט של checksum שונה. שוב, שנו את המילה בציטוטים כך שהיא לא תייצר את אותה סיסמה כמו בפקודה זו:
- echo "digital-ocean" | sha1sum
אחרי הגדרת הסיסמה, שמור וסגור את הקובץ ואז הפעל מחדש את Redis:
- sudo systemctl restart redis
כדי לבדוק שהסיסמה עובדת, פתח את לקוח ה-Redis:
- redis-cli
הסדר הבא הוא סדר פקודות המשמש לבדיקה אם הסיסמה של Redis עובדת. הפקודה הראשונה מנסה להגדיר מפתח לערך לפני האימות:
- set key1 10
זה לא יעבוד מכיוון שעדיין לא נעשה אימות, ולכן Redis מחזיר שגיאה:
Output(error) NOAUTH Authentication required.
הפקודה הבאה מאמתת עם הסיסמה שצוינה בקובץ התצורה של Redis:
- auth your_redis_password
Redis יאשר שאתה אומתת:
OutputOK
אחרי זאת, הרצת הפקודה הקודמת אמורה להצליח:
- set key1 10
OutputOK
פקודת get key1
משאילת את Redis לערך של המפתח החדש:
- get key1
Output"10"
הפקודה האחרונה יוצאת מ-redis-cli
. ניתן גם להשתמש ב-exit
:
- quit
כעת יש יהיה קשה מאוד למשתמשים לא מורשים לגשת להתקנת Redis שלך. שים לב שאם כבר משתמשים בלקוח קו פקודה של Redis ואז מפעילים מחדש את Redis, יהיה עליך לאמת מחדש. יש גם לשים לב שללא SSL או VPN, הסיסמה יכולה עדיין להיחלף על ידי צדדים חיצוניים אם אתה מתחבר ל-Redis מרחוק:
למשך כך, מדריך זה יעבור על שינוי שמות של פקודות Redis כדי להגן נוסף על Redis מפושעים:
שלב 4 — שינוי שמות לפקודות מסוכנות
פיצ'ר ביטחון נוסף שנבנה ב־Redis מאפשר לך לשנות או לנטרל לחלוטין פקודות מסוימות שנחשבות כמסוכנות. כאשר מופעלות על ידי משתמשים לא מורשים, פקודות אלה יכולות לשמש לשינוי הגדרות, הרס או אפילו מחיקת הנתונים שלך. חלק מהפקודות שנחשבות כמסוכנות כוללות:
FLUSHDB
FLUSHALL
KEYS
PEXPIRE
DEL
CONFIG
SHUTDOWN
BGREWRITEAOF
BGSAVE
SAVE
SPOP
SREM
RENAME
DEBUG
זוהי לא רשימה מקיפה, אך לשנות שם או לנטרל את כל הפקודות ברשימה זו יכול לעזור לשפר את ביטחון אחסון הנתונים שלך. האם עליך לנטרל או לשנות שם פקודה מסוימת תלוי בצרכים המקוריים שלך. אם אתה יודע שאף פעם לא תשתמש בפקודה שיכולה להישמש באופן לא ראוי, אז תוכל לנטרל אותה. אחרת, עליך לשנות את שמה.
כמו הסיסמה לאימות, שינוי שם או נטרול של פקודות מוגדר בקטע האבטחה של קובץ ההגדרות /etc/redis.conf
. כדי לאפשר או לנטרל פקודות Redis, עליך לפתוח שוב את קובץ ההגדרות לעריכה:
- sudo nano /etc/redis.conf
הערה: אלו הם דוגמאות. עליך לבחור אם להשבית או לשנות את הפקודות שיש להן משמעות עבורך. ניתן למצוא מידע נוסף על פקודות Redis ולקבוע איך הן עשויות להישמש באופן שגוי ב- redis.io/commands.
כדי להשבית או לסיים פקודה, יש לשנות את שמה למחרוזת ריקה, כמו כן:
# ניתן גם לסיים לחלוטין פקודה על ידי שינוי שמה למחרוזת ריקה:
#
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
כדי לשנות שם של פקודה, עליך להעניק לה שם אחר כמו בדוגמאות שלמטה. פקודות ששונו צריכות להיות קשות לניחוש לאחרים, אך קלות לך לזכור:
# ניתן גם לסיים לחלוטין פקודה על ידי שינוי שמה למחרוזת ריקה:
#
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
שמור את השינויים וסגור את הקובץ. לאחר מכן, הפעל מחדש את Redis כדי ליישם את השינויים:
- sudo systemctl restart redis.service
כדי לבדוק את הפקודות החדשות שלך, הכנס לשורת הפקודות של Redis:
- redis-cli
אמת את עצמך באמצעות הסיסמה שהגדרת מראש:
- auth your_redis_password
OutputOK
בהנחה ששינית את הפקודה CONFIG
לשם ASC12_CONFIG
, ניסיון להשתמש בפקודה config
ייכשל:
- config get requirepass
Output(error) ERR unknown command 'config'
לקרוא לפקודה ששונתה במקום תהיה מוצלחת. שים לב שפקודות Redis אינן רגישות לאותיות רישיות:
- asc12_config get requirepass
Output1) "requirepass"
2) "your_redis_password"
לבסוף, תוכל לצאת מ- redis-cli
:
- exit
אזהרה: בנוגע לשינוי שמות הפקודות, יש הזהרה בסיום הקטע בעמוד SECURITY שבקובץ /etc/redis.conf
, שאומרת:
. . .
# יש לשים לב ששינוי שמות של פקודות המתעדכנות בקובץ
AOF או שמועברות לרפליקות עשוי לגרום לבעיות.
. . .
זה אומר שאם הפקודה ששונתה אינה נמצאת בקובץ AOF, או אם היא נמצאת בקובץ AOF אך הקובץ AOF לא הועבר לרפליקות, אז לא צריך להיות בעיה. יש לקחת זאת בחשבון בעת שינוי שמות פקודות. הזמן הטוב ביותר לשנות שם של פקודה הוא כאשר אין שימור על אחסנת AOF או מיד לאחר התקנת Redis (כלומר, לפני שיושם היישום שמשתמש ב-Redis שלך).
שלב 5 – הגדרת החזקת הספרייה והרשאות הקובץ
שלב זה יעבור דרך מספר שינויי החזקת ספרייה ורשאות ביצוע שיכולים להיות נדרשים כדי לשפר את פרופיל האבטחה של התקנת Redis שלך. כלול בזה הוא ודאות שרק למשתמש אשר נדרש לגשת ל-Redis יש הרשאות קריאה לנתוניו. בררת המחדל, המשתמש המותר הוא משתמש הredis.
ניתן לוודא זאת על ידי חיפוש בשימוש של פקודת grep
עבור ספריית הנתונים של Redis ברשימה ארוכה של ספריית ההורה שלו. הפקודה ופלטה מוצגים מטה:
- ls -l /var/lib | grep redis
Outputdrwxr-x---. 2 redis redis 22 Sep 6 22:22 redis
הפלט הזה מציין כי ספריית הנתונים של Redis שייכת למשתמש redis, עם גישה משנית שניתנה לקבוצת redis. הגדרת הבעלות הזו היא מאובטחת, כמו גם ההיתרים של התיקייה, שמסומנים באמצעות הספרות האוקטליות 750.
אם ברשותך ספריית נתונים של Redis עם היתרי גישה לא מאובטחים, תוכל לוודא שרק משתמש וקבוצת Redis יש גישה לתיקייה ולתוכנה שלה על ידי הרצת הפקודה chmod
. הדוגמה הבאה משנה את ההיתרים של התיקייה ל-770
:
- sudo chmod 770 /var/lib/redis
ההיתר האחר שעלול תצטרך לשנות הוא של קובץ ההגדרות של Redis. כברירת מחדל, יש לו היתר קובץ של 640
והוא שייך למשתמש root, עם בעלות משנית על ידי קבוצת root:
- ls -l /etc/redis.conf
Output-rw-r-----. 1 redis root 62192 Sep 6 22:20 /etc/redis.conf
ההיתר (640
) אומר שקובץ ההגדרות של Redis קריא רק על ידי משתמש redis והקבוצה root. מכיוון שקובץ ההגדרות מכיל את הסיסמה לא מוצפנת שהגדרת בשלב 4, redis.conf
צריך לשייך למשתמש redis, עם בעלות משנית על ידי קבוצת redis. כדי להגדיר זאת, הרץ את הפקודה הבאה:
- sudo chown redis:redis /etc/redis.conf
ואז שנה את ההיתרים כך שרק בעל הקובץ יוכל לקרוא ולכתוב בו:
- sudo chmod 600 /etc/redis.conf
תוכל לוודא את הבעלות וההיתרים החדשים על ידי הרצת הפקודות ls
שוב:
- ls -l /var/lib | grep redis
Outputtotal 40
drwxrwx---. 2 redis redis 22 Sep 6 22:22 redis
- ls -l /etc/redis.conf
Outputtotal 40
-rw-------. 1 redis redis 62192 Sep 6 22:20 /etc/redis.conf
לבסוף, אתחל את Redis כדי להציג את השינויים:
- sudo systemctl restart redis
עם זאת, ההתקנה של Redis שלך הוגנה.
סיכום
שים לב שכאשר מישהו מתחבר לשרת שלך, ייתכן להפריע לתכני האבטחה הספציפיים של Redis שהגדרת. זו הסיבה שהתכונה לאבטחה החשובה ביותר שנדבך במדריך זה היא הגנת הגדרת הגנה, שמונעת ממשתמשים לא ידועים להתחבר לשרת שלך לכל היותר.
אם אתה מנסה לאבטח את התקשורת של Redis על רשת שאינה אמינה, עליך להשתמש בפרוקסי SSL, כפי שמומלץ על ידי מפתחי Redis ב-מדריך האבטחה הרשמי של Redis.
Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-rocky-linux-8