نحوه ایمن‌سازی Nginx با Let’s Encrypt بر روی Debian 9.0

مقدمه

Let’s Encrypt یک صدور گواهی است که یک راه آسان برای نصب گواهینامه‌های رایگان TLS/SSL و فعال‌سازی HTTPS رمزگذاری شده بر روی وب سرورها فراهم می‌سازد. اما برای این کار باید مراحل آن را به دقت انجام دهید.

Let’s Encrypt از طریق ارائه یک نرم‌افزار کلاینتی، Certbot، بیشتر مراحل را به صورت خودکار صورت می‌دهد. در این آموزش از Certbot برای دریافت گواهینامه رایگان SSLو انجام تنظیمات جهت تمدید خودکار این گواهینامه در امن‌سازی Nginx بر روی Debian 9 استفاده می‌کنیم. همچنین از یک فایل سرور بلاک Nginx جداگانه به جای فایل پیش فرض استفاده می¬کنیم.

توصیه ما ایجاد یک فایل سرور بلاک Nginx جدید برای هر دامنه است. این کار کمک می‌کند تا از اشتباهات پیشگیری کرده و فایل‌های پیش فرض برای تنظیمات پیشگیرانه حفظ گردد.

پیش نیازها

برای این کار شما به یک سرور Debian 9، یک کاربری غیر root و یک فایروال نیاز دارید.
نام دامنه‌ای که استفاده می‌کنید باید به طور کامل رجیستر شده باشد. در این آموزش ما از example.com استفاده می‌کنیم. شما می‌توانید نام دامنه دلخواه را به جای آن استفاده کنید. برای استفاده از این نام دامنه باید دو مرحله زیر را انجام دهید. همچنین باید رکوردهای زیر را در DNS تنظیم نمایید.

• یک رکورد از نوع A با عنوان example.comایجاد کنید که به IP آدرس عمومی سرور شما اشاره می‌کند.
• یک رکورد از نوع A با عنوان www.example.com ایجاد کنید که به IP آدرس عمومی سرور شما اشاره می‌کند.
قبل از شروع کار درباره این که Nginx به درستی روی Debian 9 نصب شده است اطمینان حاصل کنید که برای دامنه خود شما یک سرور بلاک دارید. این مقاله از /etc/nginx/sites-available/example.com به عنوان مثال استفاده خواهد کرد.

مرحله اول- نصب نرم‌افزار Certbot

در اولین مرحله برای استفاده از Let’s Encrypt جهت فراهم کردن گواهینامه SSL، بایستی نرم‌افزار Certbot را روی سرور خود نصب کنید.

در نظر داشته باشید که Certbot یک نرم‌افزار به شدت در حال توسعه است، به همین دلیل بسته‌های Certbot که به وسیله Debian ارائه می‌گردند ممکن است به سرعت منسوخ شوند.

با این حال می¬توانید بسته‌های بیشتر به روز شده را با فعال کردن مخزن Debian 9 backports در آدرس /etc/apt/sources.list، جایی که مدیر بسته apt در حال جستجوی منبع بسته‌ها است، به دست آورید. این مخزن شامل پکیج‌هایی از پیش پردازش شده‌ای است که بدون کتابخانه‌های جدید روی توزیع پایدارDebian اجرا می¬شوند.

برای اضافه کردن مخزن backports ابتدا باید /etc/apt/sources.list را باز کنید.

$ sudo nano /etc/apt/sources.list

در قسمت انتهایی کپی فایل‌های پروژه Debian را اضافه کنید.

/etc/apt/sources.list
...
deb http://deb.debian.org/debian stretch-backports main contrib non-free
deb-src http://deb.debian.org/debian stretch-backports main contrib non-free

این کار شامل پکیج‌های اصلی، که Debian Free Software Guidelines (DFSG)- compliant است و همچنین اجزاء non-free و contrib، که یا خودشان DFSG- compliant نیستند یا با مواردی که در این دسته‌بندی قرار می‌گیرند وابستگی دارند، می‌باشد.

پس از اتمام فایل را ذخیره کرده و آن را ببندید.
در این مرحله لیست بسته‌ها را برای اخذ اطلاعات بسته‌های مخزن جدید به روز کنید.

$ sudo apt update

در نهایت بسته Certbot’s Nginx را با apt نصب کنید.

$ sudo apt install python-certbot-nginx -t stretch-backports

Certbot هم‌اکنون آماده استفاده است؛ اما برای این که بتوانید از آن جهت پیکربندی SSLو در نتیجه امن‌سازی Nginx استفاده کنید، باید برخی از تنظیمات Nginx را تایید کنید.

مرحله دوم-تایید تنظیمات Nginx

در این مرحله برای این که Nginx را با Let’s Encrypt روی Debian 9 امن کنید، Certbot باید سرور بلاک مناسب را در پیکربندی Nginx پیدا کند تا بتواند پیکربندی SSL را به صورت خودکار انجام دهد. این کار به طور خاص با جستجوی یک server_nameکه مستقیما با دامنه درخواست شده منطبق است انجام می‌شود.

در صورت نصب درست Nginx، باید یک سرور بلاک برای دامنه خود در /etc/nginx/sites-available/example.com داشته باشید که بخشنامه server_name آن قبلاً به درستی تنظیم شده است. برای بررسی می‌توانید فایل سرور بلاک برای نام دامنه خود را با nano یا ویرایشگر متن دلخواه باز نمایید.

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

خط server_name موجود را پیدا کنید. برای این کار باید دستور زیر را تایپ نمایید.

در صورت مشابه بودن با متن فوق، از ویرایشگر خود خارج شده و به مرحله بعدی بروید.

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

$ sudo nginx –t

اگر در این مرحله از امن‌سازی Nginx با Let’s Encrypt روی Debian 9 خطایی دریافت کردید، مجدداً فایل سرور بلاک را باز کنید و هر گونه خطای تایپی یا مفقود شدن کاراکترها را بررسی کنید. زمانی که از درست بودن تنظیمات فایل اطمینان پیدا کردید، Nginx را برای اعمال تغییرات مجدداً بارگذاری کنید.

$ sudo systemctl reload nginx

Certbotمی‌تواند سرور بلاک مناسب را پیدا کرده و آن را به روزرسانی نماید.

حال باید فایروال را برای مجاز نمودن ترافیک HTTPS به روزرسانی کنید.

مرحله سوم- مجاز نمودن HTTPS از طریق فایروال

در صورتی که فایروال ufw را فعال کرده‌اید، همانطور که در پیش‌نیازها گفته شد، باید تنظیماتی را برای مجاز شدن ترافیک HTTPS انجام دهید.

با تایپ دستور زیر می‌توانید تنظیمات فعلی را مشاهده کنید.

$ sudo ufw status

احتمالا باید تصویری مشابه تصویر زیر را مشاهده ‌کنید که بر اساس آن تنها HTTP traffic برای سرور مجاز شناخته شده‌است.

Output
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Nginx HTTP                 ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

برای اجازه دادن به HTTPS traffic باید به پروفایل کامل Nginx اجازه داده و مجوز اضافی مربوط به Nginx HTTP را حذف کنید.

$ sudo ufw allow 'Nginx Full'
$ sudo ufw delete allow 'Nginx HTTP'

حال وضعیت باید مانند تصویر زیر باشد.

$ sudo ufw status
Output
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx Full                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx Full (v6)            ALLOW       Anywhere (v6)

سپس، Certbot را اجرا کرده و گواهینامه‌های مورد نظر را دریافت کنید.

مرحله چهارم- دریافت گواهینامه SSL

Certbot برای دریافت گواهینامه SSL راه‌های مختلفی را از طریق پلاگین‌ها فراهم می‌کند. پلاگین Nginx؛ تنظیمات مجدد Nginx و بارگذاری مجدد تنظیمات را در زمان مورد نیاز انجام خواهد داد.

برای استفاده از این پلاگین دستور زیر را تایپ کنید.

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

این دستور certbot را با پلاگین –nginxاجرا می‌کند و از -d برای تعیین نام‌هایی که می‌خواهید برای آن‌ها گواهینامه معتبر داشته باشید استفاده می‌کنید

اگر برای اولین بار است که از certbot استفاده می‌کنید، در این مرحله از شما خواسته می‌شود که یک آدرس ایمیل وارد کرده و با شرایطی که برای استفاده از سرویس در نظر گرفته شده موافقت نمایید.

پس از انجام این کار، certbot با سرور Let’s Encrypt ارتباط برقرار کرده و تلاش می‌کند برای دامنه‌های درخواستی شما یک گواهینامه دریافت کند.

پس از انجام موفقیت آمیز این مرحله، certbot از شما می‌پرسد که چطور می‌خواهید پیکربندی HTTPS را انجام دهید.

Output
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

انتخاب خود را انجام داده سپس کلید ENTER را بزنید. پیکربندی انجام شده آپدیت خواهد شد و Nginx جهت دریافت تنظیمات جدید مجدداً بارگذاری می‌شود. certbot با ارسال پیامی اطلاع می‌دهد که فرآیند موفقیت آمیز بوده و گواهینامه‌های شما ذخیره شده‌اند.

Output
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.com/privkey.pem
   Your cert will expire on 2018-07-23. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

گواهینامه‌ها دانلود، نصب و بارگذاری شده‌اند. حال سعی کنید وب سایت خود را با استفاده از https:// مجددا بارگذاری کرده و نشانگر امنیتی را در مرورگر خود ببینید.

این نشانگر باید به صورت یک قفل سبز در مرورگر به نمایش گذاشته شود و اگر از SSL Labs Server Test برای تست کردن سرور خود استفاده می‌کنید باید به شما نمره A بدهد.

در قدم آخر، تنظیمات مربوط به بروزرسانی خودکار Certbot را انجام می‌دهیم.

مرحله پنجم-تایید Certbotبرای تمدید خودکار

گواهینامه‌های Let’s Encrypt تنها برای 90 روز اعتبار دارند. این موضوع برای این امر در نظر گرفته شده که کاربران برای بروزرسانی گواهینامه‌های دریافتی خود تشویق شوند.

بسته certbot که نصب کرده‌اید با اضافه کردن یک اسکریپت به /etc/cron.d کار را به‌صورت خودکار انجام می‌دهد. این اسکریپت دو بار در روز اجرا می‌شود و هر گواهینامه‌ای که ظرف 30 روز آینده منقضی می‌شوند را تمدید می‌کند.

برای تست این فرآیند شما می‌توانید یک اجرای امتحانی با certbotانجام دهید.

$ sudo certbot renew --dry-run

اگر خطایی دریافت نکردید، همه تنظیمات به درستی صورت پذیرفته است. در صورت نیاز Certbot گواهینامه‌ها را تمدید کرده و Nginx را مجدداً بارگذاری می‌کند تا تغییرات انجام شده اعمال شوند.

اگر روند تمدید خودکار با مشکل مواجه شده باشد Let’s Encrypt پیامی به ایمیل تعیین شده ارسال می‌کند و در آن هشدار می‌دهد که گواهینامه‌های شما در حال انقضا هستند.

نتیجه‌گیری

در این مقاله آموزشی، شما Certbot را نصب، گواهینامه‌های SSL را برای دامنه خود دانلود، Nginx را برای استفاده از این گواهینامه‌ها پیکربندی و تجدید گواهینامه خودکار را تمدید کردید. برای کسب اطلاعات بیشتر و به سایت کلادینو مراجعه نمایید.

منبع:

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