כיצד להתקין ולאבטח את Redis על Ubuntu 22.04

הקדמה

Redis הוא חנות מפתח-ערך בזיכרון מכונה ידועה בגמישותה, בביצועיה ובתמיכה הרחבה בשפות. במדריך זה נדגים כיצד להתקין, להגדיר ולאבטח את Redis על שרת Ubuntu 22.04.

נדרשים

כדי להשלים את המדריך הזה, יש לך צורך בגישה לשרת Ubuntu 22.04 הכולל משתמש לא-רוט עם הרשאות sudo וגישה לחומת אש מוגדרת עם ufw. ניתן להגדיר זאת על ידי מעקב אחרי המדריך שלנו להגדרת שרת ראשונית עבור Ubuntu 22.04.

שלב 1 — התקנת והגדרת Redis

נשתמש במנהל חבילות APT כדי להתקין את Redis ממאגרי החבילות הרשמיים של Ubuntu. לעת כתיבת המדריך הזה, הגרסה הזמינה במאגרים ברירת המחדל היא 6.0.16.

התחל בעדכון זרימת החבילות המקומית שלך באמצעות הפקודה הבאה:

  1. sudo apt update

לאחר מכן, התקן את Redis על ידי הקלדת:

  1. sudo apt install redis-server

זה יוריד ויתקין את Redis ואת התלויות שלו. לאחר מכן, יש שינוי תצורה חשוב לבצע בקובץ התצורה של Redis, שנוצר אוטומטית במהלך ההתקנה.

פתחו את הקובץ עם העורך הטקסט המועדף עליכם:

  1. sudo nano /etc/redis/redis.conf

בתוך הקובץ, מצאו את ההוראה supervised. ההוראה הזו מאפשרת לכם להכריז על מערכת init כדי לנהל את Redis כשירות, מאפשרת לכם שליטה נוספת על הפעולה שלו. ההוראה supervised מוגדרת כ- no כברירת מחדל. מאחר ואתה מפעיל Ubuntu, שמשתמשת במערכת init systemd, שנו את זה ל- systemd:

/etc/redis/redis.conf
. . .

# אם אתה מפעיל את Redis מתוך upstart או systemd, Redis יכול להתקשר עם עץ הניטור שלך.
# אפשרויות:
#   supervised no      - אין אינטראקציה של ניטור
#   supervised upstart - שלחו את האות ל-upstart על ידי שימוש במצב SIGSTOP
#   supervised systemd - שלחו את האות ל-systemd על ידי כתיבה של READY=1 ל- $NOTIFY_SOCKET
#   supervised auto    - זיהוי של שיטת upstart או systemd בהתבסס על
#                        משתני הסביבה UPSTART_JOB או NOTIFY_SOCKET
# לתשומת ליבכם: שיטות הניטור הללו משדרות רק "התהליך מוכן."
#       הן לא מאפשרות פינגים רציניים ורציפים חזרה לנטר השרת שלכם.
supervised systemd

. . .

זו השינוי היחיד שעליך לבצע בקובץ התצורה של Redis בנקודה זו, לכן נא לשמור ולסגור אותו כאשר תסיים. אם השתמשת ב־nano כדי לערוך את הקובץ, נא לעשות זאת על ידי לחיצה על CTRL + X, Y, אז ENTER.

לאחר מכן, נא לאתחל את שירות ה־Redis כדי להפעיל את השינויים שביצעת בקובץ התצורה:

  1. sudo systemctl restart redis.service

עם זאת, התקנת והגדרת Redis והוא פועל על המחשב שלך. לפני שתתחיל להשתמש בו, אך עדיף לבדוק תחילה האם Redis פועל כמצופה.

שלב 2 — בדיקת Redis

כמו כל תוכנה שהותקנה לאחרונה, כדאי לוודא ש־Redis פועל כפי שצפוי לפני שתבצע שינויים נוספים בהגדרתו. נדגים מספר דרכים לבדיקה ש־Redis פועל באופן נכון בשלב זה.

התחל בבדיקה ששירות ה־Redis פועל:

  1. 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 2022-04-20 20:40:52 UTC; 4s ago Docs: http://redis.io/documentation, man:redis-server(1) Main PID: 2899 (redis-server) Status: "Ready to accept connections" Tasks: 5 (limit: 2327) Memory: 2.5M CPU: 65ms CGroup: /system.slice/redis-server.service └─2899 "/usr/bin/redis-server 127.0.0.1:6379 . . .

הפלט הזה מציין שה־Redis פועל וכבר מופעל, שזה אומר שהוא מוגדר להתחיל בכל פעם שהשרת מאתחל.

הערה: ההגדרה הזו רצויה למקרים רבים של שימוש ברדיס. אם עם זאת, תעדיפו להפעיל את ה־Redis ידנית בכל פעם שהשרת מאתחל, ניתן להגדיר זאת בעזרת הפקודה הבאה:

  1. sudo systemctl disable redis

כדי לבדוק ש-Redis פועל כראוי, יש להתחבר לשרת באמצעות redis-cli, הלקוח לשורת פקודות של Redis:

  1. redis-cli

בתוך הערת פקודות הקורא שיופיע, לבדוק את החיבור באמצעות הפקודה ping:

  1. ping
Output
PONG

הפלט מאשר כי החיבור לשרת עדיין פעיל. לאחר מכן, לבדוק שניתן להגדיר מפתחות על ידי הרצת:

  1. set test "It's working!"
Output
OK

לשחזר את הערך על ידי הקלדה:

  1. get test

בהנחה שהכל פועל כראוי, תוכל לשחזר את הערך שאיחסנת:

Output
"It's working!"

לאחר אישור שניתן לשחזר את הערך, יש לצאת מתוך הערת Redis כדי לחזור לשול:

  1. exit

כמבחן סופי, נבדוק האם Redis יכול לשמור על הנתונים גם לאחר שהופסק או הופעל מחדש. לשם כך, יש לאתחל מחדש את המופע של Redis תחילה:

  1. sudo systemctl restart redis

לאחר מכן להתחבר שוב עם הלקוח בשורת הפקודות:

  1. redis-cli

ולוודא כי הערך הנבדק עדיין זמין:

  1. get test

ערך המפתח שלך צריך להיות זמין עדיין:

Output
"It's working!"

צא מהערת Redis שוב כאשר תסיים:

  1. exit

עם זאת, התקנת Redis שלך פעילה לחלוטין ומוכנה לשימוש. עם זאת, חלק מההגדרות הברירת מחדל שלו אינן מאובטחות ומספקות לפושעים הזדמנויות לתקוף ולקבל גישה לשרת ולנתוניו. השלבים הנותרים במדריך זה מכסים שיטות להפחתת הפגיעות הללו, כפי שמומלץ על ידי האתר הרשמי של Redis. אף שהשלבים הללו אינם חובה ו-Redis עדיין יפעל אם תבחר שלא לעקוב אחריהם, מומלץ מאוד להשלים אותם כדי לחזק את אבטחת המערכת שלך.האתר הרשמי של Redis. למרות שהשלבים אינם חובה ו-Redis יפעל גם אם אין לך כוונה לעקוב אחריהם, מומלץ בחום להשלים אותם כדי להחזיק את בטחונך מוגן.

שלב 3 — קשירה ל־localhost

ברירת המחדל, Redis נגיש רק מ־localhost. אך, אם התקנת והגדרת את Redis על פי מדריך שונה מזה, ייתכן ועדכנת את קובץ התצורה כך שיוכלו להתחבר מכל מקום. זה לא כל כך מאובטח כמו הקשירה ל־localhost.

כדי לתקן זאת, פתח את קובץ התצורה של Redis לעריכה:

  1. sudo nano /etc/redis/redis.conf

אתר שורה זו ווודא שהיא לא מפותחת (הסר את התו # אם קיים):

/etc/redis/redis.conf
. . .
bind 127.0.0.1 ::1
. . .

שמור וסגור את הקובץ כאשר סיימת (לחץ CTRL + X, Y, ואז ENTER).

לאחר מכן, הפעל מחדש את השירות כדי לוודא ש־systemd קורא את השינויים שלך:

  1. sudo systemctl restart redis

כדי לבדוק שהשינוי נכנס לתוקף, הריץ את הפקודה netstat הבאה:

  1. 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 עשויה שלא להיות זמינה במערכת שלך כברירת מחדל. אם זהו המקרה, ניתן להתקין אותה (יחד עם מספר כלי רשת נוחים אחרים) בעזרת הפקודה הבאה:

  1. 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, אז פתח את הקובץ הזה שוב עם העורך שאתה מעדיף שלך:

  1. sudo nano /etc/redis/redis.conf

גלול לסעיף SECURITY ומצא פקודת פקודה שנמחקת שקוראת:

/etc/redis/redis.conf
. . .
  

# requirepass foobared  


. . .

בטל את ההערה על ידי הסרת התו #, ושנה את foobared לסיסמה מאובטחת.

הערה: מעל לפקודת requirepass בקובץ redis.conf, יש הזהרה שנמחקת:

/etc/redis/redis.conf
. . .
# אזהרה: מאחר ו-Redis מהיר מאוד, משתמש חיצוני יכול לנסות עד 150,000 סיסמאות בשנייה נגד תיבה טובה. זה אומר שעליך
 להשתמש בסיסמה מאוד חזקה אחרת זה יהיה קל מאוד לשבור. 
# לכן, חשוב שתציין ערך מאוד חזק וארוך כסיסמה שלך. במקום להמציא סיסמה בעצמך, אתה יכול
#
. . .

להשתמש בפקודת ה-openssl כדי ליצור אחת אקראית, כמו בדוגמה הבאה. על ידי צנזור את פלט הפקודה הראשונה לפקודה השנייה של openssl, כפי שמוצג כאן, זה יסיר כל שורות השורה שיוצרו על ידי הפקודה הראשונה:

  1. openssl rand 60 | openssl base64 -A

הפקודה הזו תחזיר פלט כמו בדוגמה הבאה:

Output
RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

לאחר העתקה והדבקת הפלט של פקודה זו כערך חדש ל-requirepass, זה צריך לקרוא:

/etc/redis/redis.conf
requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

לאחר הגדרת הסיסמה, שמור וסגור את הקובץ. לאחר מכן, הפעל מחדש את Redis:

  1. sudo systemctl restart redis.service

כדי לבדוק שהסיסמה עובדת, פתח את לקוח Redis:

  1. redis-cli

המשך מציג סדרת פקודות שמשמשות לבדיקה אם הסיסמה של Redis עובדת. הפקודה הראשונה מנסה להגדיר מפתח לערך לפני האימות:

  1. set key1 10

זה לא יעבוד כי אתה לא אומתת, לכן Redis מחזיר שגיאה:

Output
(error) NOAUTH Authentication required.

הפקודה הבאה מאמתת עם הסיסמה שצוינה בקובץ התצורה של Redis:

  1. auth your_redis_password

Redis מכיר:

Output
OK

לאחר מכן, הפעלת הפקודה הקודמת שוב תצליח:

  1. set key1 10
Output
OK

get key1 פונה ל-Redis לערך של המפתח החדש.

  1. get key1
Output
"10"

לאחר אישור שניתן להריץ פקודות בלקוח Redis לאחר אימות, ניתן לצאת מ־redis-cli:

  1. quit

בשלב הבא, נבחן איך לשנות את שמות הפקודות של Redis שנכנסו בטעות או על ידי פועל זדוני, ויכולות להשפיע באופן חמור על הנתונים שלך.

שלב 5 — שינוי שמות לפקודות מסוכנות

התכונה האחרת לאבטחה המובנית ב־Redis כוללת שינוי שמות או כיבוי מוחלט של פקודות מסוימות שנחשבות למסוכנות.

כאשר הן מופעלות על ידי משתמשים לא מאושרים, פקודות כאלו יכולות לשמש לשינוי תצורה, הרס, או אפילו למחיקת נתונים. כמו סיסמת האימות, שינוי שמות או כיבוי פקודות מוגדרים באותה סעיף SECURITY של קובץ התצורה של Redis בנתיב /etc/redis/redis.conf.

חלק מהפקודות שנחשבות למסוכנות כוללות: FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME, ו־DEBUG. זהו לא רשימה מקיפה, אך שינוי שמות או כיבוי כל הפקודות ברשימה זו הוא נקודת התחלה טובה לשיפור את אבטחת השרת שלך של Redis.

אם עליך לנטרל או לשנות את שם הפקודה תלוי בצרכים המסוימים שלך או של האתר שלך. אם אתה יודע שלעולם לא תשתמש בפקודה שעשויה להישמש באופן לא הולם, אז יתכן ויהיה טוב עבורך לנטרל אותה. ובמקרה אחר, ייתכן ויהיה לך באינטרס הטוב ביותר לשנות את שמה.

כדי לשנות או לנטרל פקודות Redis, פתח שוב את קובץ התצורה:

  1. sudo nano /etc/redis/redis.conf

אזהרה: השלבים הבאים שמציינים איך לנטרל ולשנות את הפקודות הם דוגמאות. עליך לבחור רק לנטרל או לשנות את הפקודות שהגיוניות עבורך. תוכל לבדוק את הרשימה המלאה של הפקודות לבד ולקבוע איך הן עשויות להישמש באופן שאינו הולם בכתובת redis.io/commands.

כדי לנטרל פקודה, שנה את שמה למחרוזת ריקה (מסומנת בזוג גרשיים עם אין תווים ביניהם), כפי שמוצג למטה:

/etc/redis/redis.conf
. . .
# ניתן גם להשמיד לחלוטין פקודה על ידי שינוי שמה ל
# מחרוזת ריקה:
#
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:

  1. sudo systemctl restart redis.service

כדי לבדוק את הפקודה החדשה, נכנס לשורת הפקודה של Redis:

  1. redis-cli

אז, אמת את זהותך:

  1. auth your_redis_password
Output
OK

נניח כי שינית את שם הפקודה CONFIG ל ASC12_CONFIG, כפי שבדוגמה הקודמת. תנסה ראשית להשתמש בפקודה המקורית CONFIG. היא צריכה להיכשל, מאחר ושינית אותה:

  1. config get requirepass
Output
(error) ERR unknown command `config`, with args beginning with:

קריאה לפקודה ששונתה תהיה מוצלחת. היא אינה תלויה באותיות רישיות:

  1. asc12_config get requirepass
Output
1) "requirepass" 2) "your_redis_password"

לבסוף, תוכל לצאת מ- redis-cli:

  1. exit

שים לב שאם אתה כבר משתמש בשורת הפקודה של Redis ואז מפעיל מחדש את Redis, יהיה עליך להתחבר מחדש. במקרה אחר, תקבל שגיאה אם תקליד פקודה:

Output
NOAUTH Authentication required.

אזהרה: בנוגע לשיטת שינוי שמות הפקודות, יש ציון אזהרה בסוף סעיף SECURITY ב- /etc/redis/redis.conf שאומר:

/etc/redis/redis.conf
. . .
# שים לב ששינוי שמות של פקודות שמתועדות בקובץ
# AOF או מועברות לסניפים יכול לגרום לבעיות.
. . .

הערה: פרויקט Redis בוחר להשתמש במונחים "ראשי" ו"עבד", בעוד ש-DigitalOcean מעדיפה בדרך כלל את האלטרנטיבות "ראשי" ו"משני". כדי למנוע בלבול בחרנו להשתמש במונחים המשמשים בתיעוד של Redis כאן.

זה אומר שאם הפקודה ששונתה אינה נמצאת בקובץ AOF, או אם היא כן נמצאת אך קובץ ה-AOF לא הועבר לסניפים, אין צריכת בעיה.

לכן, תשמור על זה בזמן שאתה מנסה לשנות שמות של פקודות. הזמן הטוב ביותר לשנות שם של פקודה הוא כאשר אינך משתמש בנציבות AOF, או ישירות לאחר התקנה, כלומר, לפני הפצת יישום ה-Redis שלך.

כאשר אתה משתמש ב-NET ומתמודד עם התקנה של ראשי-עבד, שקול תשובה זו מעמוד הבעיות ב-GitHub של הפרויקט. הנה תשובה לשאלת המחבר:

הפקודות מתעדכנות ב-AOF ומשוכפלות לשרת ה-slave בדיוק באותה הדרך שנשלחו בהן, לכן אם תנסה להשמיע מחדש את ה-AOF על מופע שאינו רשום באותו שינוי שם, עשויות להתגלות סתירות מאחר שהפקודה לא תוכל להתבצע (כך גם עבור ה-slaves).

לכן, הדרך הטובה ביותר לטיפול בשינויי שם במקרים כאלה היא לוודא שהפקודות שהוחלפו בשם מיושמות בכל המופעים בהתקנות ראשי-עבד.

מסקנה

במדריך זה, התקנת והגדרת Redis, אימתת שהתקנת Redis שלך פועלת כראוי, ושימוש בתכונות האבטחה המובנות שלו כדי להפוך אותו לפחות חשיפתי לתקיפות מפעילים זדוניים.

שמור בתודעה שפעם שמישהו מחובר לשרת שלך, זה קל מאוד להתחמק מתכונות האבטחה הספציפיות של Redis שהגדרנו. לכן, התכונה האבטחתית החשובה ביותר בשרת Redis שלך היא הגדרת הגנה כגון חומת אש (שהגדרת אם עקבת אחרי המדריך הגדרת שרת ראשית), מאחר שזה מקשה למאפיינים זדוניים לחצות את הגדרות האבטחה הללו.

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-22-04