איך לאבטח את Nginx עם Let's Encrypt על Rocky Linux 9

הקדמה

Let’s Encrypt היא רשות אישורים (CA) המספקת דרך נגישה לקבל ולהתקין תעודות TLS/SSL בחינם, מאפשרת כך הפעלת HTTPS מוצפן על שרתי האינטרנט. היא פשוטה את התהליך על ידי ספקת קליינט תוכנה, Certbot, שמנסה לאוטומציה של רוב (אם לא כל) השלבים הנדרשים. כרגע, כל תהליך של קבלת והתקנת תעודה מופעל באופן אוטומטי לחלוטין על שני השרתים, Apache ו-Nginx.

במדריך זה, תשתמש ב-Certbot כדי לקבל תעודת SSL בחינם ל-Nginx על מערכת ההפעלה Rocky Linux 9 ותגדיר את התעודה שלך לחדשות אוטומטית.

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

דרישות מוקדמות

על מנת לבצע את המדריך, יש לך צורך ב:

  • הגדרת שרת Rocky Linux 9 על פי המדריך הגדרת שרת ראשונית עבור Rocky Linux 9, כולל משתמש עם הרשאות sudo וגישה לגיש מנהל המערכת לא-root, וגם חומת אש.

  • שם דומיין מורשה. במדריך זה נשתמש ב- example.com בכל הופעה. ניתן לרכוש שם דומיין מ- Namecheap, לקבל אחד בחינם מ- Freenom, או להשתמש ברשם הדומיינים שבחרת.

  • שני רשומות DNS המוגדרות עבור השרת שלך. אם אתה משתמש ב-DigitalOcean, אנא ראה ב- תיעוד DNS שלנו לקבלת פרטים נוספים על הוספתן.

    • רשומת A עם example.com מפנה לכתובת ה-IP הציבורית של השרת שלך.
    • רשומת A עם www.example.com מפנה לכתובת ה-IP הציבורית של השרת שלך.
  • Nginx מותקן על ידי המדריך איך להתקין Nginx על Rocky Linux 9. וודא שיש לך בלוק שרת עבור הדומיין שלך. המדריך ישתמש ב-/etc/nginx/sites-available/example.com כדוגמה.

שלב 1 — התקנת Certbot

ראשית, עליך להתקין את חבילת התוכנה certbot. התחבר לשרת Rocky Linux 8 שלך בתור המשתמש שאינו רוט:

  1. ssh sammy@your_server_ip

חבילת ה-certbot אינה זמינה דרך מנהל החבילות כברירת מחדל. עליך להפעיל את המאגר EPEL כדי להתקין את Certbot.

כדי להוסיף את מאגר ה- EPEL של Rocky Linux 9, הפעל את הפקודה הבאה:

  1. sudo dnf install epel-release

כאשר תתבקש לאשר את ההתקנה, הקלד ואשר y.

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

  1. sudo dnf install certbot python3-certbot-nginx

זה יתקין את Certbot עצמו ואת התוסף Nginx עבור Certbot, שנדרש כדי להפעיל את התוכנית.

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

עכשיו שיש לך את Certbot מותקן, בואו נפעיל אותו כדי לקבל תעודה.

שלב 2 — אישור הגדרת ה-Nginx

כדי ש-Certbot יוכל למצוא את ה-server הנכון בתצורת ה-Nginx שלך ולהגדיר SSL באופן אוטומטי, נדרש לו למצוא הוראת server_name שתואמת לדומיין שבו אתה מבקש תעודה.

אם עקבת אחרי שלב הגדרת הבלוק שרת במדריך ההתקנה של Nginx, צריך לך להיות בלוק שרת עבור הדומיין שלך ב- /etc/nginx/conf.d/example.com עם ההוראת server_name כבר מוגדרת בצורה המתאימה.

כדי לבדוק, פתח את קובץ התצורה של הדומיין שלך באמצעות nano או העורך הטקסט המועדף עליך:

  1. sudo nano /etc/nginx/conf.d/example.com

מצא את השורה הקיימת של server_name. היא צריכה להיראות כמו זו:

/etc/nginx/conf.d/example.com
...
server_name example.com www.example.com;
...

אם כן, צא מהעורך שלך והמשך לשלב הבא.

אם לא, עדכן אותה כך שתתאים. לאחר מכן, שמור את הקובץ, צא מהעורך שלך, ואמת את התחביר של העריכות של התצורה שלך:

  1. sudo nginx -t

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

  1. sudo systemctl reload nginx

Certbot יכול כעת למצוא את בלוק ה-server הנכון ולעדכן אותו אוטומטית.

בשלב הבא, נעדכן את הגדרות הגישה לחומת האש כך שתאפשר תעבורת HTTPS.

שלב 3 — עדכון כללי החומה

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

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

  1. sudo firewall-cmd --permanent --list-all

תקבל פלט כמו זה:

Output
public target: default icmp-block-inversion: no interfaces: sources: services: cockpit dhcpv6-client http ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:

אם אתה לא רואה את http ברשימת השירותים, הפעל אותו על ידי הרצת:

  1. sudo firewall-cmd --permanent --add-service=http

כדי לאפשר תעבורת https, הפעל את הפקודה הבאה:

  1. sudo firewall-cmd --permanent --add-service=https

כדי להחיל את השינויים, יהיה עליך לטעון מחדש את שירות הגישה:

  1. sudo firewall-cmd --reload

עכשיו שפתחת את השרת שלך לתעבורת https, אתה מוכן להפעיל את Certbot ולקבל את התעודות שלך.

שלב 4 — קבלת תעודת SSL

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

  1. sudo certbot --nginx -d example.com -d www.example.com

זה מפעיל את certbot עם תוסף ה-Nginx, באמצעות --nginx, ומשתמש ב--d כדי לציין את שמות הדומיין שבהם אתה רוצה שהתעודה תהיה תקפה עבורם.

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

Output
Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem This certificate expires on 2022-12-15. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. Deploying certificate Successfully deployed certificate for your_domain to /etc/nginx/conf.d/your_domain.conf Successfully deployed certificate for www.your_domain to /etc/nginx/conf.d/your_domain.conf Congratulations! You have successfully enabled HTTPS on https://your_domain and https://www.your_domain

התעודות שלך נורדו, הותקנו ונטענו, והתצורה של ה-Nginx שלך כעת תפנה אוטומטית את כל בקשות האינטרנט ל-https://. נסה לטעון מחדש את האתר שלך ושים לב לאינדיקטור האבטחה בדפדפן שלך. כמעט תמיד הוא יצביע כי האתר מאובטח באופן תקין, בדרך כלל עם סמל מנעול. אם תבדוק את השרת שלך באמצעות הבדיקה של SSL Labs Server Test, הוא יקבל ציון A.

בוא נסיים על ידי בדיקת תהליך החידוש.

שלב 5 — אימות חידוש אוטומטי של Certbot

תעודות Let's Encrypt תקפות למשך 90 יום, אך מומלץ לחדש את התעודות כל 60 יום כדי לאפשר מרווח שגיאה. ללקוח Certbot של Let's Encrypt יש פקודת renew שבודקת אוטומטית את התעודות המותקנות כעת ומנסה לחדש אותן אם הן פחות מ-30 ימים מתאריך התפוגה.

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

  1. sudo certbot renew --dry-run

הפלט יהיה דומה לזה:

Output
Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/your_domain.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator nginx, Installer nginx Renewing an existing certificate Performing the following challenges: http-01 challenge for monitoring.pp.ua Waiting for verification... Cleaning up challenges - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - new certificate deployed with reload of nginx server; fullchain is /etc/letsencrypt/live/your_domain/fullchain.pem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ** DRY RUN: simulating 'certbot renew' close to cert expiry ** (The test certificates below have not been saved.) Congratulations, all renewals succeeded. The following certs have been renewed: /etc/letsencrypt/live/your_domain/fullchain.pem (success) ...

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

A practical way to ensure your certificates will not get outdated is to create a cron job that will periodically execute the automatic renewal command for you. Since the renewal first checks for the expiration date and only executes the renewal if the certificate is less than 30 days away from expiration, it is safe to create a cron job that runs every week, or even every day.

ערוך את crontab כדי ליצור עבודה חדשה שתרוץ את החידוש פעמיים ביום. כדי לערוך את crontab עבור המשתמש root, הפעל:

  1. sudo crontab -e

עורך הטקסט שלך יפתח את crontab הברירת מחדל, שהוא קובץ טקסט ריק בנקודה זו. הכנס למצב הכנסה על ידי לחיצה על i והוסף את השורה הבאה:

crontab
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew --quiet

כשתסיים, לחץ על ESC כדי לצאת ממצב ההכנסה, אז :wq ואז ENTER כדי לשמור ולצאת מהקובץ. כדי ללמוד עוד על עורך הטקסט Vi והיורש שלו, Vim, בדוק את המדריך שלנו התקנת ושימוש בעורך הטקסט Vim על שרת ענן.

זה ייצור עבודה כרונית חדשה שתפעל בצהרים ובחצות כל יום. python -c 'import random; import time; time.sleep(random.random() * 3600)' יבחר דקה אקראית בתוך השעה עבור משימות החידוש שלך.

הפקודה renew עבור Certbot תבדוק את כל התעודות שמותקנות במערכת ותעדכן כל תעודה שמוגדרת לפוג תוקף בפחות משלושים יום. הפרמטר --quiet אומר ל-Certbot לא להדפיס מידע או לחכות לקלט מהמשתמש.

מידע נוסף ומעמיק אודות החידוש ניתן למצוא ב-תיעוד של Certbot.

סיכום

במדריך זה, התקנת את לקוח Let’s Encrypt Certbot, הורדת תעודות SSL עבור הדומיין שלך והגדרת חידוש אוטומטי של התעודות. אם יש לך שאלות בנוגע לשימוש ב-Certbot, תוכל לבדוק את תיעוד ה-Certbot הרשמי.

תוכל גם לבדוק את בלוג Let’s Encrypt הרשמי לעדכונים חשובים מעת לעת.

Source:
https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-rocky-linux-9