A previous version of this tutorial was written by Sergey Zhukaev.
הקדמה
Nginx הוא שרת אינטרנט פתרונות תוכנה פתוחה מהיר ואמין. זה השיג פופולריות בזכות רגל זיכרון נמוכה, קינון גבוה, קלות הגדרה ותמיכה במגוון רחב של פרוטוקולים.
HTTP/2 הוא גרסה חדשה יותר של פרוטוקול ההעברת היפרטקסט, שמשמש ברשת למסירת דפים מהשרת לדפדפן. HTTP/2 הוא העדכון המרכזי הראשון של HTTP לכמעט שנתיים: HTTP1.1 הושק לקהל הרחב ב-1999 כאשר דפי האינטרנט היו קטנים בגודל מאוד. האינטרנט השתנה מאז למעשה, ואנו עומדים כעת מול המגבלות של HTTP 1.1. הפרוטוקול מגביל את מהירות ההעברה הפוטנציאלית עבור רוב האתרים המודרניים מכיוון שהוא מוריד חלקים של דף בתור – החלק הקודם חייב להורד לחלוטין לפני שההורדה של החלק הבא מתחילה – ודף אינטרנט ממוצע מודרני מוריד עשרות משאבי CSS, ג'אווה סקריפט ותמונות יחידות.
HTTP/2 פותרת את הבעיה הזו מאחר והיא מביאה שינויים יסודיים כמה:
- כל הבקשות מורדות במקביל, לא בתור
- כותרות HTTP מדוחסות
- דפים מועברים כקובץ בינארי, לא כקובץ טקסט, שהוא יעיל יותר
- שרתים יכולים "לדחוף" נתונים גם בלי בקשה של המשתמש, מה שמשפר את המהירות עבור משתמשים עם לטנציה גבוהה
אף על פי ש-HTTP/2 אינו דורש הצפנה, מפתחי שני הדפדפנים הפופולריים ביותר, Google Chrome ו־Mozilla Firefox, ציינו כי מסיבות אבטחה הם יתמוך ב־HTTP/2 רק עבור חיבורי HTTPS. לכן, אם תחליט להגדיר שרתים עם תמיכה ב־HTTP/2, עליך גם לאבטח אותם בעזרת HTTPS.
מדריך זה יעזור לך להגדיר שרת Nginx מהיר ומאובטח עם תמיכה ב־HTTP/2.
דרישות רפרנצה
לפני שתתחיל, יהיה עליך להשג כמה דברים:
- שרת Ubuntu 22.04 שהוגדר באמצעות מדריך הגדרת שרת ראשוני של Ubuntu 22.04, כולל משתמש לא רוט עם הרשאות sudo וגישה לצרפת.
- Nginx מותקן על השרת שלך, שבאפשרותך להתקין על ידי המשך איך להתקין את Nginx על Ubuntu 22.04.
- A domain name configured to point to your server. You can purchase one on Namecheap or get one for free on Freenom. You can learn how to point domains to DigitalOcean Droplets by following the documentation on How To Manage Your Domain With DigitalOcean.
- A TLS/SSL certificate configured for your server. You have two options:
- באפשרותך לקבל תעודה בחינם מ־Let’s Encrypt על ידי המשך איך לאבטח את Nginx עם Let’s Encrypt על Ubuntu 22.04.
- אתה יכול גם ליצור ולהגדיר אישית תעודת SSL שמוגנת עצמית על ידי מעקב אחר איך ליצור תעודה עצמית SSL עבור Nginx ב-Ubuntu 22.04.
- Nginx מוגדר להפנות תעבורה מפורט
80
לפורט443
, אשר צריך להיות מכוסה על ידי התנאים הקודמים. - Nginx מוגדר להשתמש במפתח Ephemeral Diffie-Hellman (DHE) בגודל של 2048 ביט או יותר, אשר גם צריך להיות מכוסה על ידי התנאים הקודמים.
שלב 1 — הפעלת תמיכה ב-HTTP/2
אם עקבת אחרי הגדרת בלוק השרת במדריך להתקנת Nginx, יש לך בלוק שרת עבור הדומיין שלך בנתיב /etc/nginx/sites-available/your_domain
עם ההנחייה server_name
כבר מוגדרת בצורה המתאימה. השינוי הראשון שנבצע יהיה לשנות את בלוק השרת של הדומיין שלך כך שישתמש ב-HTTP/2.
פתח את קובץ התצורה עבור הדומיין שלך באמצעות nano
או העורך שאתה מעדיף:
בקובץ, אתר את המשתנים listen
הקשורים לפורט 443
:
...
listen [::]:443 ssl ipv6only=on;
listen 443 ssl;
...
הראשון הוא לחיבורים IPv6. השני הוא לכל החיבורים IPv4. נפעיל HTTP/2 לשניהם.
שנה כל ההוראה listen
כך שתכלול http2
:
...
listen [::]:443 ssl http2 ipv6only=on;
listen 443 ssl http2;
...
זה מודיע ל-Nginx להשתמש ב-HTTP/2 עם דפדפנים שתומכים בו.
שמור את קובץ התצורה וצא מהעורך הטקסט. אם אתה משתמש ב־nano
, לחץ Ctrl+X
, ואז, כאשר יתבקש, Y
ואז Enter.
כל פעם שאתה עושה שינויים בקבצי התצורה של Nginx, עליך לבדוק את התצורה לשגיאות, באמצעות הדגל -t
, שמפעיל את פקודת בדיקת התחביר המובנית של Nginx:
אם התחביר אינו מכיל שגיאות, תקבל פלט דומה לזה:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
בשלב הבא, תגדיר את שרת ה-Nginx שלך כך שישתמש ברשימת צפיפות יותר מגבוהה של מצפנים כדי לשפר את אבטחת השרת שלך.
שלב 2 — הסרת אבטחות ישנות ולא בטוחות
HTTP/2 כולל רשימת חסימה של מצפנים ישנים ולא בטוחים שצריך להימנע מהם. סדרות המצפנים הן אלגוריתמים קריפטוגרפיים שתיארים כיצד הנתונים המועברים צריכים להיוה מוצפנים.
השיטה שתשתמש בה כדי להגדיר את המצפנים תלויה באיך שהגדרת את אישורי ה-TLS/SSL שלך עבור Nginx.
אם השתמשת ב־Certbot כדי לקבל את התעודות שלך, הוא גם יצר את הקובץ /etc/letsencrypt/options-ssl-nginx.conf
שמכיל סיפרות שאינן מאובטחות מספיק עבור HTTP/2. אך, לשנות את קובץ זה תמנע מ־Certbot ליישם עדכונים בעתיד, לכן נגיד ל־Nginx שלא להשתמש בקובץ זה ונציין את רשימת ה־ciphers שלנו בעצמנו.
פתח את קובץ התצורה של בלוק השרת עבור הדומיין שלך:
sudo nano /etc/nginx/sites-enabled/your_domain
איתר את השורה שכוללת את קובץ ה־options-ssl-nginx.conf
והוסף הערה להתחלת השורה על ידי הוספת תו #
להתחלת השורה:
# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
מתחת לשורה זו, הוסף את השורה הבאה כדי להגדיר את רשימת ה־ciphers המאושרות:
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
שמור את הקובץ וצא מהעורך.
אם השתמשת בתעודות שנחתמו עצמאית או בתעודה מצד גורם שלישי והגדרת אותה לפי הנדרש, פתח את הקובץ /etc/nginx/snippets/ssl-params.conf
בעורך הטקסט שלך:
איתר את השורה הבאה:
...
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
...
שנה אותה כך שתשתמש ברשימת ה־ciphers הבאה:
...
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
שמור את הקובץ וצא מהעורך שלך.
בדוק שוב את התצורה לשגיאות תחביר באמצעות הפקודה nginx -t
:
אם אתה נתקל בשגיאות, טפל בהן ובדוק שוב.
כאשר התצורה שלך עוברת את בדיקת התחביר, הפעל מחדש את Nginx באמצעות הפקודה systemctl
:
עם השרת שהתחיל מחדש, בוא נוודא שהוא עובד.
שלב 3 — בדיקה ש-HTTP/2 מופעל
בואו נוודא שהשרת פועל ועובד עם HTTP/2.
השתמשו בפקודת curl
כדי לבצע בקשה לאתר שלך ולהציג את הכותרות:
תקבלו פלט דומה לזה:
HTTP/2 200
**Server**: nginx/1.18.0 (Ubuntu)
**Date**: Tue, 21 Jun 2022 22:19:09 GMT
**Content-Type**: text/html
**Content-Length**: 612
**Last-Modified**: Tue, 21 Jun 2022 22:17:56 GMT
**Connection**: keep-alive
**ETag**: "62b24394-264"
**Accept-Ranges**: bytes
בנוסף, תוכלו לוודא ש-HTTP/2 משמש ב-Google Chrome. פתחו Chrome ונווטו אל https://your_domain
. פתחו את כלי הפיתוח של Chrome (הצג -> פיתוח -> כלי פיתוח) וטענו מחדש את הדף (הצג -> טען מחדש דף זה). נווטו אל כרטיס הרשת (רשת), לחצו ימינה על שורת הכותרות שמתחילה ב־שם, ובחרו באפשרות פרוטוקול מתוך תפריט ההקפיצה.
תקבלו עמודת פרוטוקול חדשה שמכילה את h2
(שמציינת HTTP/2), המצביעה על כך ש-HTTP/2 עובד.
בנקודה זו, אתם מוכנים לשרת תוכן דרך פרוטוקול HTTP/2. בואו נשפר את האבטחה והביצועים על ידי הפעלת HSTS.
שלב 4 — הפעלת אבטחת התעבורה הסטריקטית של ה-HTTP (HSTS)
אף על פי שבקשות ה-HTTP שלך מפנות ל-HTTPS, ניתן להפעיל אבטחת התעבורה הסטריקטית של ה-HTTP (HSTS) כדי למנוע צורך בהפניות אלו. אם הדפדפן מוצא כותרת HSTS, הוא לא ינסה להתחבר לשרת באמצעות HTTP רגיל שוב לפרק זמן נתון. בכל מקרה, הוא יבצע תמיד חילופי מידע באמצעות חיבור HTTPS מוצפן בלבד. הכותרת הזו גם מגנה עלינו מפני התקפות ירידה בפרוטוקול.
פתח שוב את קובץ התצורה של בלוק השרת עבור הדומיין שלך:
sudo nano /etc/nginx/your_domain
הוסף את השורה הזו לאותו בלוק בקובץ שמכיל את הצפיפויות של SSL כדי להפעיל HSTS:
server {
...
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
add_header Strict-Transport-Security "max-age=15768000" always;
}
...
הערך max-age
מוגדר בשניות. הערך 15768000
שקול ל-6 חודשים.
ברירת המחדל, הכותרת הזו לא מתווספת לבקשות של תת-דומיין. אם יש לך תת-דומיינים ואתה רוצה ש-HSTS יחול על כולם, עליך להוסיף את המשתנה includeSubDomains
בסוף השורה, כך:
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
שמור את הקובץ, וצא מהעורך.
בדוק שוב את התצורה לשגיאות תחביר:
לבסוף, הפעל מחדש את שרת ה-Nginx כדי להחיל את השינויים.
סיכום
השרת שלך של Nginx משרת כעת עמודי HTTP/2. אם ברצונך לבדוק את חוזק חיבור ה-SSL שלך, אנא בקר ב־Qualys SSL Lab והפעל בדיקה נגד השרת שלך. אם הכל מוגדר כראוי, אתה צריך לקבל ציון A+ לאבטחה.
כדי ללמוד עוד על כיצד Nginx מפענח ומיישם כללי בלוק שרת, נסה לקרוא את הבנת אלגוריתמי בחירת בלוק שרת ומיקום של Nginx.