بلاگ/ارتقای امنیت آپاچی با ابزار mod_md Let’s Encrypt در اوبونتو 20.04 LTS
به‌روز شده

ارتقای امنیت آپاچی با ابزار mod_md Let’s Encrypt در اوبونتو 20.04 LTS

امنیت آپاچی با ابزار mod_md Let’s Encrypt در اوبونتو 20.04 چگونه انجام می‌گیرد؟ چگونه یک گواهی رایگان TLS/SSL دریافت کنیم؟ چگونه امنیت آپاچی 2 را در سرور اوبونتو 20.04 LTS برقرار کنیم؟ اینها سؤالاتی است که می‌خواهیم در این مطلب به آنها پاسخ دهیم. سرور آپاچی با ماژولی به نام mod_md همراه است....

1399/04/082482 بازدید
ارتقای امنیت آپاچی با ابزار mod_md Let’s Encrypt در اوبونتو 20.04 LTS
امنیت آپاچی با ابزار mod_md Let’s Encrypt در اوبونتو 20.04 چگونه انجام می‌گیرد؟ چگونه یک گواهی رایگان TLS/SSL دریافت کنیم؟ چگونه امنیت آپاچی 2 را در سرور اوبونتو 20.04 LTS برقرار کنیم؟ اینها سؤالاتی است که می‌خواهیم در این مطلب به آنها پاسخ دهیم. سرور آپاچی با ماژولی به نام mod_md همراه است. امکان استفاده از این ماژول برای تأیید گواهی با استفاده از پروتکل ACME وجود دارد. در این مطلب نحوه نصب و تنظیمات آپاچی را با یک ماژول mod_md برای تأمین امنیت ترافیک با گواهی TLS/SSL رایگان Let’s Encrypt در سرور اوبونتو 20.04 LTS را مرور خواهیم کرد.

پیش‌نیازهای کلی

سیستم‌عامل: لینوکس اوبونتو همراه با آپاچی 2 مجوّزهای کاربری روت

امنیت آپاچی با ابزار mod_md Let’s Encrypt در اوبونتو 20.04

Let’s Encrypt یک گواهی تأیید ورود یا CA است که از پروتکل ACME پیروی می‌کند. امکان استفاده از این ابزار برای ارائه گواهی TLS/SSL برای سرورهای آپاچی، Nginx و سایر سرورها وجود دارد. در این آموزش، شما از ماژول mod_md برای دستیابی به گواهی رایگان TLS/SSL برای آپاچی 2 در اوبونتو 20.04 استفاده خواهید کرد. همچنین گواهی را به‌ گونه‌ای تنظیم می‌کنید که به صورت خودکار، تجدید شود. پروژه نمونه ما به صورت زیر خواهد بود: دامین – www42.ariaservice.net پورت اچ‌تی‌تی‌پی‌اس – 443 فایل تنظیمات دامین مجازی -/etc/apache2/sites-available/www42.ariaservice.net.conf حتماً دقت کنید که سرور آپاچی به صورت استاندارد در سیستم شما نصب شده باشد.

گام ۱) نصب mod_md برای Let’s Encrypt

ابتدا باید بروزرسانی‌ها را با استفاده از فرمان apt انجام دهیم.
php
sudo apt updatesudo apt upgrade
سپس با اجرای فرمان زیر، ماژول mod_md را نصب کنید.
php
sudo apt install libapache2-mod-md
نصب ماژول mod_md Let's Encrypt همراه با سرور آپاچی در لینوکس اوبونتو 20.04 LTS

فعالسازی ماژول mod_md در اوبونتو 20.04 LTS

برای فعال کردن این ماژول به صورت زیر عمل کنید.
php
sudo a2enmod md
نمونه خروجی
php
Enabling module md.To activate the new configuration, you need to run:systemctl restart apache2
حتماً دقت کنید که mod_ssl را نیز فعال کرده باشید. برای این منظور فرمان زیر را اجرا کنید.
php
sudo a2enmod ssl
خروجی
php
Considering dependency setenvif for ssl:Module setenvif already enabledConsidering dependency mime for ssl:Module mime already enabledConsidering dependency socache_shmcb for ssl:Enabling module socache_shmcb.Enabling module ssl.See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates.To activate the new configuration, you need to run:systemctl restart apache2
آپاچی 2 میبایست دوباره راه‌اندازی و یا ری‌استارت شود. این کار با کمک فرمان mod_ssl انجام می‌گیرد.
php
sudo systemctl reload apache2.service

گام ۲) تنظیمات گواهی SSL

حتماً مطمئن شوید که آپاچی 2 عملکرد خود را دارد و ورودی‌های پورت 80 را دریافت می‌کند. برای برررسی این موضوع می‌توانید از فرمان ss یا netstat استفاده کنید.
php
sudo netstat -tulpn | grep ':80'## or ##sudo ss -tulpn | grep ':80'
نمونه خروجی
php
tcp    LISTEN  0       128                        *:80                  *:*      users:(("apache2",pid=2550,fd=4),("apache2",pid=2549,fd=4),("apache2",pid=2548,fd=4))
تمام کلاینت‌ها می‌بایست از طریق پورت 80 به سرور شما متصل باشند. در غیر این صورت، گواهی Let’s Encrypt برای شما تأیید نخواهد شد.
php
curl -I http://www42.ariaservice.net
خروجی فرمان curl برای ما مشخص می‌کند که اتصال به پورت TCP شماره 80 برقرار است.
php
HTTP/1.1 200 OKDate: Wed, 06 May 2020 19:30:43 GMTServer: Apache/2.4.41 (Ubuntu)Last-Modified: Wed, 06 May 2020 19:15:29 GMTETag: "15e-5a4ff965902a3"Accept-Ranges: bytesContent-Length: 350Vary: Accept-EncodingConnection: closeContent-Type: text/html
حالا نوبت ویرایش فایل /etc/apache2/sites-available/www42.ariaservice.net.conf است. برای این منظور داریم:
php
sudo nano /etc/apache2/sites-available/www42.ariaservice.net.conf
در بالای این فایل، سه پارامتر زیر را برای mod_md وارد کنید.
php
## Secure Apache with mod_md Let's Encrypt directives ##ServerAdmin webmaster@ariaservice.netMDCertificateAgreement acceptedMDomain www42.ariaservice.netMDPrivateKeys RSA 4096
که در آن:
  • ServerAdmin webmaster@ariaservice.net : ماژول mod_md از این آدرس ایمیل برای ثبت دامین‌های شما در Let’s Encrypt استفاده خواهد کرد.
  • MDCertificateAgreement accepted : باید شرایط خدمات ارائه شده توسط Let’s Encrypt را تأیید کنید.
  • MDomain www42.ariaservice.net: نام دامینی که بر اساس آن ماژول mod_md برای ارائه و تجدید گواهی‌ها استفاده می‌کند. شما می‌توانید نام کامل دامین مانند ariaservice.net یا ariaservice.net یا www42.ariaservice.net را وارد کنید. در هر صورت دقت کنید که این دامین با ServerName منطبق باشد.
  • MDPrivateKeys RSA 4096: تنظیم اندازه و نوع کلیدهای اختصاصی که تولید می‌شوند.
در اینجا فایل تنظیمات را به صورت کلی مشاهده می‌کنید.
php
## Apache with mod_md Let's Encrypt #### mod_md config for Let's Encrypt ##ServerAdmin webmaster@cyberciti.bizMDCertificateAgreement acceptedMDomain www42.cyberciti.bizMDPrivateKeys RSA 4096## HTTP port 80 config ##<VirtualHost *:80>ServerAdmin webmaster@ariaservice.netServerName www42.ariaservice.netDocumentRoot /home/ariaservice.net/htmlDirectoryIndex index.htmlErrorLog ${APACHE_LOG_DIR}/www42.ariaservice.net-error.logCustomLog ${APACHE_LOG_DIR}/www42.ariaservice.net-access.log combined# Redirect all http requests to HTTPS (uncomment the following two lines when HTTPS issued)# RewriteEngine On# RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]</VirtualHost>## HTTPS Config ##<VirtualHost *:443>SSLEngine onServerAdmin webmaster@ariaservice.netServerName www42.ariaservice.netDocumentRoot /home/ariaservice.net/htmlDirectoryIndex index.htmlErrorLog ${APACHE_LOG_DIR}/www42.ariaservice.net-ssl-error.logCustomLog ${APACHE_LOG_DIR}/www42.ariaservice.net-ssl-access.log combined# Turn on HTTP/2Protocols h2 http/1.1# Set HTTP Strict Transport SecurityHeader always set Strict-Transport-Security "max-age=63072000"</VirtualHost>## Only enable TLS v1.3 and avoid older protocols ##SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2SSLHonorCipherOrder     offSSLSessionTickets       off## Turn on OCSP Stapling ##SSLUseStapling OnSSLStaplingCache "shmcb:logs/ssl_stapling(32768)"## Permission for our DocumentRoot  ##<Directory /home/ariaservice.net/html>Options Indexes FollowSymLinksAllowOverride NoneRequire all granted</Directory>

فعالسازی mod_rewrite و mod_headers در اوبونتو

قبلاً یک فراخوانی برای دستور صدور مجدد گواهی در تنظیمات‌مان داشته‌ایم. اکنون نیاز به ابزار mod_rewrite داریم. برای این منظور فرمان زیر را تایپ کنید.
php
sudo a2enmod rewrite
php
Enabling module rewrite.To activate the new configuration, you need to run:systemctl restart apache2
فعالسازی ماژول mod_headers
php
sudo a2enmod headersEnabling module headers.To activate the new configuration, you need to run:systemctl restart apache2

بررسی خطاهای تنظیمات

php
sudo apache2ctl configtest
php
Syntax OK

گام ۳) باز کردن HTTPS (به صورت TCP با پورت شماره 443) با استفاده از فایروال UFW در اوبونتو

فرمان ufw زیر را اجرا کنید تا پورت TCP شماره 443 برای همه باز شود.
php
sudo ufw allow 443/tcp comment 'accept secure Apache connections'
برای بررسی تنظیمات به صورت زیر عمل کنید.
php
sudo ufw status

گام ۴) دریافت یک گواهی SSL با استفاده از ماژول mod_md در اوبونتو

تا به اینجا ماژول mod_md را برای آپاچی در اوبونتو نصب کردیم، تمام ماژول اصلی را فعال کردیم و پورت‌های TCP موردنیاز برای فایروال تعریف شد. حالا نوبت به راه‌اندازی دوباره سرور آپاچی 2 برای دسترسی به گواهی رایگان TLS/SSL با استفاده از Let’s Encrypt است. برای این منظور از فرمان زیر استفاده می‌شود.
php
sudo systemctl restart apache2.service
به محض اینکه آپاچی 2 ری‌استارت شد، ماژول mod_md با Let’s Encrypt ارتباط برقرار می‌کند و درخواست یک گواهی برای دامین شما می‌دهد. معمولاً این روند تا یک دقیقه زمان می‌برد. برای بررسی موفقیت‌آمیز بودن این موضوع می‌توانید به فایل تاریخچه خطاهای سرور یا صفحه mod_status آپاچی مراجعه کنید. این چیزی است که در فایل erro.log مشاهده خواهید کرد.
php
sudo tail -f /var/log/apache2/error.log
امکان استفاده از فرمان grep نیز برای این منظور وجود دارد.
php
sudo grep 'The Managed Domain' /var/log/apache2/error.log
نمونه خروجی نشان می‌دهد که Let’s Encrypt یک گواهی رایگان TLS/SSL ارائه داده است.
php
[Wed May 06 20:17:38.112849 2020] [md:notice]  AH10059: The Managed Domain www42.ariaservice.net has been setup and changes will be activated on next (graceful) server restart.
البته می‌توان از آدرس وضعیت سرور نیز دیدن کنیم. برای این منظور داریم:
php
http://www42.ariaservice.net/server-statushttp://your-public-ip-here/server-status
مدیریت وضعیت دامین برای آپاچی با mod_md Let's Encrypt برای فعالسازی گواهی، راه‌اندازی دوباره سرور آپاچی 2 در اینجا توصیه می‌شود.
php
sudo systemctl reload apache2.service

گام ۵) بررسی امنیت ارتباط آپاچی 2

تنها کاری که باید انجام دهید، تایپ فرمان زیر یا استفاده از مرورگری مانند کروم یا فایرفوکس است. در هر صورت، شما باید از دریافت یک اتصال HTTPS مطمئن باشید.
php
curl -I https://www42.ariaservice.net
اجرای فرمان curl برای تأیید اتصال HTTPS و امنیت ترافیک داده و این هم خروجی آزمون SSL Lab
بررسی برقراری امنیت آپاچی باmod_md Let's Encrypt در اوبونتو 20.04 LTS
بررسی برقراری امنیت آپاچی باmod_md Let's Encrypt در اوبونتو 20.04 LTS
سرور آپاچی با گواهی Let’s Encrypt TLS/SSL در اوبونتو 20.04 LTS ایمن شده و توسط آزمون SSL Lab تأیید شده است.

گام ۶) تجدید خودکار گواهی SSL با استفاده از ماژول mod_md و watchdog_module

mod_md از ماژول mod_watchdog استفاده می‌کند که یک ابزار پروگراماتیک برای سایر ماژول برای انجام کارکردهایی مانند تجدید گواهی‌های TLS/SSL به صورت دوره‌ای است. به عبارت دیگر، حالت auto-renew نیازمند فعال‌بودن mod_watchdog در سرور شما خواهد بود. برای ‌آگاهی از فعال‌بودن ماژول mod_watchdog می‌توانید از فرمان زیر استفاده کنید.
php
sudo apache2ctl -Msudo apache2ctl -M | grep mod_watchdog
ماژول‌های بارگذاری شده
php
core_module (static)so_module (static)watchdog_module (static)http_module (static)unixd_module (static)access_compat_module (shared)alias_module (shared)auth_basic_module (shared)authn_core_module (shared).........ssl_module (shared)status_module (shared)

گام ۷) بررسی و پایش وضعیت گواهی

حالا نوبت به مانیتورینگ گواهی ما می‌رسد. دو روش برای این منظور وجود دارد. اول اینکه می‌توانید آدرس وضعیت سرور را باز کنید.
php
https://www42.ariaservice.net/server-statushttps://your-public-ip-here/server-status
برای ویرایش فایل تنظیمات سرور به صورت زیر عمل کنید.
php
sudo nano /etc/apache2/sites-available/www42.ariaservice.net.conf
موارد زیر را اضافه کنید.
php
<Location "/md-status">SetHandler md-status</Location>
فایل را ذخیره کرده و ببندید. سپس باید سرور را دوباره اندازی کنید.
php
sudo systemctl restart apache2.servicecurl https://www42.ariaservice.net /md-status
نمونه خروجی
php
{"version": "2.0.10","managed-domains": [{"name": "www42.cyberciti.biz","domains": ["www42.cyberciti.biz","www43.cyberciti.biz"],"contacts": ["mailto:webmaster@cyberciti.biz"],"transitive": 1,"ca": {"proto": "ACME","url": "https://acme-v02.api.letsencrypt.org/directory","agreement": "accepted"},"state": 2,"renew-mode": 1,"renew-window": "33%","warn-window": "10%","must-staple": false,"cert": {"valid-from": "Wed, 06 May 2020 19:17:37 GMT","valid-until": "Tue, 04 Aug 2020 19:17:37 GMT","serial": "040E339A0A7D2224819A550BBB4596279F67","sha256-fingerprint": "d78933fa946cb71810111876049defa4feb6820c319c69918ba925b463bbd11c"},"renew": false}]}

جمع‌بندی

در این آموزش، نحوه ایمن کردن آپاچی با استفاده از ماژول mod_md Let’s Encrypt و ایجاد گواهی خودکار TLS/SSL را در سرور اوبونتو 20.04 LTS را فرا گرفتیم. برای اطلاعات بیشتر می‌توانید به صفحه رسمی mod_md در اینجا مراجعه کنید. منبع: Cybercity.biz