آموزش امن‌سازی Jenkins با SSL و Nginx Reverse Proxy در Ubuntu 24.04 LTS

مقدمه

به‌صورت پیش‌فرض، Jenkins دارای یک وب‌سرور داخلی (Winstone) است که روی پورت 8080 اجرا می‌شود. این روش برای راه‌اندازی اولیه مناسب است، اما برای استفاده در محیط عملیاتی (Production) توصیه نمی‌شود.

اگر Jenkins را مستقیماً روی پورت 8080 در اختیار کاربران قرار دهید:

  • ارتباط کاربران رمزنگاری نمی‌شود.
  • اطلاعات حساس مانند نام کاربری، رمز عبور و Tokenها به‌صورت رمز نشده منتقل می‌شوند.
  • امکان استفاده از قابلیت‌های SSL، کش، Rate Limiting و سایر امکانات Nginx وجود نخواهد داشت.

بهترین روش، قرار دادن Nginx به‌عنوان Reverse Proxy در مقابل Jenkins است تا تمام درخواست‌ها ابتدا توسط Nginx دریافت شده و سپس به Jenkins ارسال شوند. در این حالت می‌توانید از گواهی SSL رایگان Let’s Encrypt نیز استفاده کنید و امنیت سرویس را به شکل قابل توجهی افزایش دهید.

در این آموزش نحوه راه‌اندازی Jenkins پشت Nginx Reverse Proxy روی Ubuntu 24.04 LTS را بررسی می‌کنیم و ارتباط وب را با استفاده از SSL ایمن خواهیم کرد.


پیش‌نیازها

قبل از شروع، موارد زیر باید آماده باشند:

  • یک سرور Ubuntu 24.04 LTS
  • کاربر دارای دسترسی sudo
  • نصب و راه‌اندازی Jenkins
  • نصب Nginx
  • یک دامنه که به IP سرور اشاره کند
  • دریافت گواهی SSL از Let’s Encrypt با استفاده از Certbot

در این آموزش فرض می‌کنیم دامنه شما به صورت زیر است:

jenkins.example.com

در تمام بخش‌های مقاله کافی است این دامنه را با دامنه واقعی خود جایگزین کنید.


مرحله اول: پیکربندی Nginx به‌عنوان Reverse Proxy

در این بخش، Nginx را به گونه‌ای پیکربندی می‌کنیم که تمامی درخواست‌های کاربران را دریافت کرده و به Jenkins که روی پورت 8080 اجرا می‌شود ارسال کند.

اگر در آموزش قبلی موفق به دریافت گواهی SSL از Let’s Encrypt شده باشید، فایل تنظیمات دامنه شما در مسیر زیر قرار خواهد داشت:

/etc/nginx/sites-available/jenkins.example.com

فایل را با ویرایشگر باز کنید:

sudo nano /etc/nginx/sites-available/jenkins.example.com

اضافه کردن لاگ‌های اختصاصی Jenkins

داخل بلاک HTTPS تنظیمات زیر را اضافه کنید:

server {

    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name jenkins.example.com;

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

    ...
}

با این کار لاگ‌های Jenkins از سایر سایت‌ها جدا شده و عیب‌یابی بسیار ساده‌تر خواهد شد.


غیرفعال کردن try_files

اگر فایل تنظیمات از قالب پیش‌فرض Nginx ایجاد شده باشد، احتمالاً داخل بخش location / دستور زیر وجود دارد:

try_files $uri $uri/ =404;

آن را به صورت زیر کامنت کنید:

# try_files $uri $uri/ =404;

در غیر این صورت، Nginx قبل از ارسال درخواست به Jenkins تلاش می‌کند فایل را روی دیسک پیدا کند و در نهایت خطای 404 Not Found نمایش خواهد داد.


تنظیم Reverse Proxy

اکنون تنظیمات Reverse Proxy را داخل همان بخش location / قرار دهید:

location / {

    include /etc/nginx/proxy_params;

    proxy_pass http://127.0.0.1:8080;

    proxy_http_version 1.1;

    proxy_read_timeout 90s;

    proxy_connect_timeout 90s;

    proxy_send_timeout 90s;

    proxy_set_header Upgrade $http_upgrade;

    proxy_set_header Connection "upgrade";

    proxy_redirect http://127.0.0.1:8080 https://jenkins.example.com;

}

در این تنظیمات:

  • proxy_pass درخواست‌ها را به Jenkins ارسال می‌کند.
  • proxy_params اطلاعاتی مانند IP کاربر و Host اصلی را حفظ می‌کند.
  • proxy_read_timeout زمان انتظار را افزایش می‌دهد تا Jobهای طولانی باعث قطع ارتباط نشوند.
  • proxy_set_header Upgrade برای WebSocketهای Jenkins ضروری است.
  • proxy_redirect آدرس‌های داخلی Jenkins را به دامنه اصلی شما تبدیل می‌کند.

نکته: به انتهای مقدار proxy_pass اسلش (/) اضافه نکنید. وجود اسلش انتهایی ممکن است باعث نمایش خطای معروف It appears that your reverse proxy setup is broken در Jenkins شود.


بررسی صحت تنظیمات

پس از ذخیره فایل، تنظیمات Nginx را بررسی کنید:

sudo nginx -t

اگر همه چیز درست باشد، خروجی مشابه زیر خواهد بود:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

در صورت مشاهده هرگونه خطا، ابتدا آن را برطرف کنید و سپس به مرحله بعد بروید.


مرحله دوم: پیکربندی Jenkins برای استفاده از Reverse Proxy

اکنون باید Jenkins را طوری تنظیم کنیم که فقط روی localhost گوش دهد و مستقیماً از اینترنت در دسترس نباشد. در این حالت تمام درخواست‌ها فقط از طریق Nginx به Jenkins ارسال خواهند شد.


ویرایش فایل سرویس Jenkins

در Ubuntu 24.04 که Jenkins از طریق Repository رسمی نصب شده باشد، تنظیمات سرویس توسط systemd مدیریت می‌شود.

ابتدا فایل سرویس را باز کنید:

sudo systemctl edit jenkins

اگر فایل خالی باز شد، تنظیمات زیر را وارد کنید:

[Service]
Environment="JENKINS_LISTEN_ADDRESS=127.0.0.1"
Environment="JENKINS_PORT=8080"

در برخی نسخه‌های Jenkins نیز ممکن است لازم باشد فایل زیر را ویرایش کنید:

sudo nano /usr/lib/systemd/system/jenkins.service

یا:

sudo nano /etc/default/jenkins

اگر فایل /etc/default/jenkins وجود داشت، مقدار زیر را پیدا کنید:

JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT"

و آن را به شکل زیر تغییر دهید:

JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT --httpListenAddress=127.0.0.1"

نکته: بسته به نسخه Jenkins و روش نصب، ممکن است فقط یکی از مسیرهای بالا وجود داشته باشد. در نسخه‌های جدید Ubuntu معمولاً Jenkins با systemd Service مدیریت می‌شود.


بارگذاری مجدد تنظیمات systemd

اگر فایل سرویس را تغییر داده‌اید، ابتدا تنظیمات systemd را مجدداً بارگذاری کنید:

sudo systemctl daemon-reload

راه‌اندازی مجدد Jenkins

اکنون سرویس Jenkins را ری‌استارت کنید:

sudo systemctl restart jenkins

بررسی وضعیت سرویس

برای اطمینان از اجرای صحیح Jenkins دستور زیر را اجرا کنید:

sudo systemctl status jenkins

در صورت اجرای صحیح، خروجی مشابه زیر خواهد بود:

● jenkins.service

Loaded: loaded (/usr/lib/systemd/system/jenkins.service)

Active: active (running)

اگر وضعیت سرویس failed بود، لاگ‌ها را بررسی کنید:

sudo journalctl -u jenkins -n 50 --no-pager

راه‌اندازی مجدد Nginx

پس از اعمال تنظیمات، سرویس Nginx را نیز ری‌استارت کنید:

sudo systemctl restart nginx

سپس وضعیت آن را بررسی کنید:

sudo systemctl status nginx

در صورت موفقیت خروجی مشابه زیر خواهید دید:

● nginx.service

Loaded: loaded

Active: active (running)

بررسی پورت Jenkins

برای اطمینان از اینکه Jenkins فقط روی localhost در حال اجراست، دستور زیر را اجرا کنید:

sudo ss -tlnp | grep 8080

خروجی صحیح باید مشابه زیر باشد:

LISTEN 0 128 127.0.0.1:8080

اگر به جای 127.0.0.1 مقدار 0.0.0.0:8080 نمایش داده شود، یعنی Jenkins همچنان از بیرون شبکه نیز قابل دسترس است و تنظیمات به‌درستی اعمال نشده‌اند.


مرحله سوم: تست Reverse Proxy و بررسی SSL

اکنون که Jenkins و Nginx را پیکربندی کرده‌اید، زمان آن رسیده که عملکرد Reverse Proxy و گواهی SSL را بررسی کنید.


بررسی دسترسی از طریق HTTPS

مرورگر خود را باز کرده و دامنه Jenkins را وارد کنید:

https://jenkins.example.com

اگر همه مراحل را به‌درستی انجام داده باشید:

  • صفحه Jenkins بدون خطا باز می‌شود.
  • قفل امنیتی (SSL) در کنار آدرس مرورگر نمایش داده می‌شود.
  • ارتباط کاملاً رمزنگاری شده خواهد بود.

بررسی ریدایرکت HTTP به HTTPS

اکنون نسخه HTTP سایت را باز کنید:

http://jenkins.example.com

باید به‌صورت خودکار به آدرس زیر منتقل شوید:

https://jenkins.example.com

برای بررسی از طریق ترمینال نیز می‌توانید دستور زیر را اجرا کنید:

curl -I http://jenkins.example.com

نمونه خروجی:

HTTP/1.1 301 Moved Permanently

Location: https://jenkins.example.com

بررسی عملکرد Reverse Proxy

یکی از ساده‌ترین روش‌ها برای اطمینان از عملکرد Reverse Proxy این است که هدرهای پاسخ را بررسی کنید:

curl -I https://jenkins.example.com

در صورت موفقیت، خروجی مشابه زیر مشاهده خواهید کرد:

HTTP/2 200

server: nginx

این خروجی نشان می‌دهد که درخواست ابتدا توسط Nginx دریافت شده و سپس به Jenkins ارسال شده است.


رفع خطای Reverse Proxy

یکی از خطاهای رایج Jenkins پس از راه‌اندازی Reverse Proxy، پیام زیر است:

It appears that your reverse proxy setup is broken.

در صورت مشاهده این پیام، موارد زیر را بررسی کنید:

1. تنظیم proxy_pass

حتماً مقدار زیر را استفاده کنید:

proxy_pass http://127.0.0.1:8080;

وجود اسلش (/) در انتهای آدرس معمولاً باعث بروز این خطا می‌شود.


2. تنظیم proxy_redirect

مقدار آن باید دقیقاً مشابه دامنه شما باشد:

proxy_redirect http://127.0.0.1:8080 https://jenkins.example.com;

3. فعال بودن WebSocket

وجود این دو خط ضروری است:

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection "upgrade";

در غیر این صورت برخی قابلیت‌های Jenkins مانند نمایش زنده Console Output ممکن است به‌درستی کار نکنند.


4. بررسی لاگ‌های Nginx

اگر هنوز مشکل وجود دارد، ابتدا لاگ خطا را بررسی کنید:

sudo tail -f /var/log/nginx/jenkins.error.log

همچنین لاگ دسترسی:

sudo tail -f /var/log/nginx/jenkins.access.log

5. بررسی لاگ Jenkins

برای مشاهده لاگ‌های Jenkins:

sudo journalctl -u jenkins -f

این لاگ‌ها معمولاً علت اصلی خطا را مشخص می‌کنند.


تغییر رمز عبور مدیر Jenkins

برای اطمینان از اینکه همه چیز به‌درستی کار می‌کند، وارد Jenkins شوید.

از منوی بالا روی نام کاربری خود کلیک کنید.

سپس مسیر زیر را باز کنید:

Manage Account → Configure

رمز عبور جدید خود را وارد کرده و تغییرات را ذخیره کنید.

اگر عملیات بدون خطا انجام شود، ارتباط امن بین مرورگر، Nginx و Jenkins برقرار است.


بررسی گواهی SSL

برای مشاهده جزئیات گواهی نصب‌شده می‌توانید دستور زیر را اجرا کنید:

openssl s_client -connect jenkins.example.com:443

در خروجی باید اطلاعات گواهی Let’s Encrypt و زنجیره اعتبار (Certificate Chain) نمایش داده شود.


جمع‌بندی

اکنون Jenkins شما:

  • از طریق HTTPS در دسترس است.
  • تمامی ارتباطات با SSL رمزنگاری می‌شوند.
  • کاربران دیگر به پورت 8080 دسترسی مستقیم ندارند.
  • Nginx به‌عنوان Reverse Proxy تمام درخواست‌ها را مدیریت می‌کند.
  • امنیت سرویس نسبت به حالت پیش‌فرض به‌طور قابل توجهی افزایش یافته است.

 

 

از همراهی شما با پارمین کلود سپاسگزاریم.

Click to rate this post!
[Total: 0 Average: 0]

نظرات کاربران

دیدگاهی بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *