כיצד להגדיר את Nginx עם SSL כפרוקסי הפוך עבור Jenkins

הקדמה

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

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

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

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

מדריך זה מניח שאתה משתמש ב־Ubuntu 20.04. לפני שתתחיל, עליך להקים חשבון משתמש לא-root עם הרשאות sudo במערכת שלך. תוכל ללמוד איך לעשות זאת על ידי עקירת המדריך התקנת שרת ראשוני של Ubuntu 20.04. תצטרך גם להתקין את שרת ה־Nginx ולאחסן את הדומיין שלך. תוכל ללמוד איך לעשות זאת עם המדריך איך להתקין את Nginx על Ubuntu 20.04.

בנוסף, חשוב מאוד לאבטח את ההתקנה של Jenkins עם SSL. אם הוא גלוי באינטרנט, תוכל לאבטח אותו עם Let’s Encrypt. תוכל ללמוד איך לעשות זאת עם המדריך איך לאבטח את Nginx עם Let’s Encrypt על Ubuntu 22.04.
כפי שצוין מראש, המדריך מניח ש־Jenkins כבר מותקן. המדריך הזה יראה לך איך להתקין את Jenkins אם נדרש. כנראה שתצטרך להחליף למשתמש root עבור המאמר הזה.

שלב 1 — הגדר את Nginx

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

עריכת התצורה

בשלב הבא תצטרך לערוך את קובץ התצורה המוגדר כברירת מחדל של Nginx. הדוגמה הבאה משתמשת ב־nano.

  1. sudo nano etc/nginx/sites-enabled/default

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

server {23
    listen 80;
    return 301 https://$host$request_uri;
}

server {

    listen 443;
    server_name jenkins.domain.com;

    access_log            /var/log/nginx/jenkins.access.log;

    location / {

      proxy_set_header        Host $host;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        X-Forwarded-Proto $scheme;

      proxy_pass          http://localhost:8080;
      proxy_read_timeout  90;

      proxy_redirect      http://localhost:8080 https://jenkins.domain.com;
    }
    
    ...
}

תצטרך לעדכן את השורות server_name ו־proxy_redirect עם שם הדומיין האישי שלך. ישנה קסם נוסף של Nginx שמגדיר לבקשות להיות נקראות על ידי Nginx ולהיות מושנות בצד התגובה כדי לוודא שהפרוקסי לאחור פועל.

שמור וסגור את הקובץ. אם השתמשת ב־nano, תוכל לעשות זאת על ידי לחיצה על Ctrl + X, Y, ואז Enter.

הקטע הראשון אומר לשרת ה־Nginx להאזין לבקשות שנשלחות לכניסה בפורט 80 (HTTP ברירת המחדל) ולהפנות אותן ל־HTTPS.

...
server {
   listen 80;
   return 301 https://$host$request_uri;
}
...

אחרי זאת, הפרוקסייה מתבצעת. היא מקבלת בעקביות בקשות נכנסות ומופנות אותן למופע של Jenkins שמחובר/שמאזין לפורט 8080 על פני הממשק הרשתי המקומי.

...
location / {

    proxy_set_header        Host $host;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header        X-Forwarded-Proto $scheme;

    proxy_pass          http://localhost:8080;
    proxy_read_timeout  90;

    proxy_redirect      http://localhost:8080 https://jenkins.domain.com;
}
...

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

A few quick things to point out here. If you don’t have a domain name that resolves to your Jenkins server, then the proxy_redirect statement above won’t function correctly without modification, so keep that in mind. Also, if you misconfigure the proxy_pass (by adding a trailing slash for example), you will get something similar to the following in your Jenkins Configuration page.

אם אתה רואה את השגיאה הזו, בדוק שוב את ההגדרות שלך proxy_pass ו- proxy_redirect בקובץ התצורה של Nginx!

שלב 2 — הגדרת Jenkins

כדי ש-Jenkins יעבוד עם Nginx, אנו צריכים לעדכן את התצורה של Jenkins כך שישמע רק לכתובת localhost במקום לכל (0.0.0.0), כדי לוודא שהתעבורה מטופלת בצורה נכונה. זהו שלב אבטחה חשוב מאוד מכיוון שאם Jenkins עדיין שומע לכל הכתובות, אז עדיין ייתכן ויהיה נגיש דרך היצירה המקורית שלו (8080). נשנה את קובץ ההגדרה /etc/default/jenkins כדי לבצע את השינויים הללו.

  1. sudo nano /etc/default/jenkins

מצא את השורה JENKINS\_ARGS ועדכן אותה כך שתראה כמו הבאה:

JENKINS_ARGS="--webroot=/var/cache/jenkins/war --httpListenAddress=127.0.0.1 --httpPort=$HTTP_PORT -ajp13Port=$AJP_PORT"

שים לב שהגדרת –httpListenAddress=127.0.0.1 חייבת להיות מוסיפה או משונה.

לאחר מכן, המשך והפעל מחדש את Jenkins ו-Nginx.

  1. sudo service jenkins restart
  2. sudo service nginx restart

עכשיו אתה צריך להיות מסוגל לבקר בדומיין שלך באמצעות HTTPS, והאתר של Jenkins ישרת באופן מאובטח.

אופציונלי — עדכון של כתובות ה- OAuth

אם אתה משתמש בפלאגין GitHub או OAuth אחר לאימות, ייתכן שזה יהיה שבור בנקודה זו. לדוגמה, כאשר אתה מנסה לגשת לכתובת ה-URL, תקבל הודעת "נכשל בפתיחת העמוד" עם כתובת URL דומה ל־http://jenkins.domain.com:8080/securityRealm/finishLogin?code=random-string.

כדי לתקן זאת, תצטרך לעדכן כמה הגדרות בתוך Jenkins, כולל הגדרות הפלאגין OAuth שלך. ראשית, עדכן את כתובת ה-URL של Jenkins בממשק המשתמש של Jenkins; תוכל למצוא אותה בתפריט Jenkins -> Manage Jenkins -> Configure System -> Jenkins Location.

עדכן את כתובת ה-URL של Jenkins כך שתשתמש ב-HTTPS – https://jenkins.domain.com/

באשף הגדרות ה- OAuth שלך עם ספק השירות החיצוני. בדוגמה זו אנו משתמשים ב־GitHub. ב- GitHub, תוכל למצוא את זה תחת Settings -> Applications -> Developer applications, באתר GitHub.

אמור להיות רשומה עבור Jenkins. עדכן את Homepage URL וְאת Authorization callback URL כך שישקף את הגדרות ה- HTTPS. זה ייראה דומה לדוגמה הבאה:

Conclusion

הדבר היחיד שנותר לעשות הוא לוודא שהכל עבד כראוי. כפי שנאמר לעיל, כעת אתה צריך להיות מסוגל לגלוש אל כתובת ה-URL שהוגדרה חדשה שלך – jenkins.domain.com – באמצעות HTTP או HTTPS. אתה צריך להיעבר אל האתר המאובטח, ולראות מידע כמו הגדרות ה-SSL המעודכנות שלך. כפי שצוין למעלה, אם אינך משתמש בשמות מארחים דרך DNS, אז ההפניה שלך עשויה שלא לעבוד כפי שרצית. במקרה כזה, יהיה עליך לשנות את קטע ה-proxy_pass בקובץ התצורה של Nginx.

Source:
https://www.digitalocean.com/community/tutorials/how-to-configure-nginx-with-ssl-as-a-reverse-proxy-for-jenkins