امنیت آپاچی با ابزار 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 انجام دهیم.

sudo apt update
sudo apt upgrade

سپس با اجرای فرمان زیر، ماژول mod_md را نصب کنید.

sudo apt install libapache2-mod-md

نصب ماژول mod_md Let's Encrypt همراه با سرور آپاچی در لینوکس اوبونتو 20.04 LTS

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

برای فعال کردن این ماژول به صورت زیر عمل کنید.

sudo a2enmod md

نمونه خروجی

Enabling module md.
To activate the new configuration, you need to run:
systemctl restart apache2

حتماً دقت کنید که mod_ssl را نیز فعال کرده باشید. برای این منظور فرمان زیر را اجرا کنید.

sudo a2enmod ssl

خروجی

Considering dependency setenvif for ssl:
Module setenvif already enabled
Considering dependency mime for ssl:
Module mime already enabled
Considering 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 انجام می‌گیرد.

sudo systemctl reload apache2.service

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

حتماً مطمئن شوید که آپاچی 2 عملکرد خود را دارد و ورودی‌های پورت 80 را دریافت می‌کند. برای برررسی این موضوع می‌توانید از فرمان ss یا netstat استفاده کنید.

sudo netstat -tulpn | grep ':80'
## or ##
sudo ss -tulpn | grep ':80'

نمونه خروجی

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 برای شما تأیید نخواهد شد.

curl -I http://www42.ariaservice.net

خروجی فرمان curl برای ما مشخص می‌کند که اتصال به پورت TCP شماره 80 برقرار است.

HTTP/1.1 200 OK
Date: Wed, 06 May 2020 19:30:43 GMT
Server: Apache/2.4.41 (Ubuntu)
Last-Modified: Wed, 06 May 2020 19:15:29 GMT
ETag: "15e-5a4ff965902a3"
Accept-Ranges: bytes
Content-Length: 350
Vary: Accept-Encoding
Connection: close
Content-Type: text/html

حالا نوبت ویرایش فایل /etc/apache2/sites-available/www42.ariaservice.net.conf است. برای این منظور داریم:

sudo nano /etc/apache2/sites-available/www42.ariaservice.net.conf

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

## Secure Apache with mod_md Let's Encrypt directives ##
ServerAdmin webmaster@ariaservice.net
MDCertificateAgreement accepted
MDomain www42.ariaservice.net
MDPrivateKeys RSA 4096

که در آن:

  • ServerAdmin webmaster@ariaservice.net : ماژول mod_md از این آدرس ایمیل برای ثبت دامین‌های شما در Let’s Encrypt استفاده خواهد کرد.
  • MDCertificateAgreement accepted[donotprint][/donotprint] : باید شرایط خدمات ارائه شده توسط Let’s Encrypt را تأیید کنید.
  • MDomain www42.ariaservice.net: نام دامینی که بر اساس آن ماژول mod_md برای ارائه و تجدید گواهی‌ها استفاده می‌کند. شما می‌توانید نام کامل دامین مانند ariaservice.net یا ariaservice.net یا www42.ariaservice.net را وارد کنید. در هر صورت دقت کنید که این دامین با ServerName منطبق باشد.
  • MDPrivateKeys RSA 4096: تنظیم اندازه و نوع کلیدهای اختصاصی که تولید می‌شوند.

در اینجا فایل تنظیمات را به صورت کلی مشاهده می‌کنید.

## Apache with mod_md Let's Encrypt ##
## mod_md config for Let's Encrypt ##
ServerAdmin webmaster@cyberciti.biz
MDCertificateAgreement accepted
MDomain www42.cyberciti.biz
MDPrivateKeys RSA 4096
## HTTP port 80 config ##
<VirtualHost *:80>
ServerAdmin webmaster@ariaservice.net
ServerName www42.ariaservice.net
DocumentRoot /home/ariaservice.net/html
DirectoryIndex index.html
ErrorLog ${APACHE_LOG_DIR}/www42.ariaservice.net-error.log
CustomLog ${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 on
ServerAdmin webmaster@ariaservice.net
ServerName www42.ariaservice.net
DocumentRoot /home/ariaservice.net/html
DirectoryIndex index.html
ErrorLog ${APACHE_LOG_DIR}/www42.ariaservice.net-ssl-error.log
CustomLog ${APACHE_LOG_DIR}/www42.ariaservice.net-ssl-access.log combined
# Turn on HTTP/2
Protocols h2 http/1.1
# Set HTTP Strict Transport Security
Header 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.2
SSLHonorCipherOrder     off
SSLSessionTickets       off
## Turn on OCSP Stapling ##
SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
## Permission for our DocumentRoot  ##
<Directory /home/ariaservice.net/html>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>

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

قبلاً یک فراخوانی برای دستور صدور مجدد گواهی در تنظیمات‌مان داشته‌ایم. اکنون نیاز به ابزار mod_rewrite داریم. برای این منظور فرمان زیر را تایپ کنید.

sudo a2enmod rewrite
Enabling module rewrite.
To activate the new configuration, you need to run:
systemctl restart apache2

فعالسازی ماژول mod_headers

sudo a2enmod headers
Enabling module headers.
To activate the new configuration, you need to run:
systemctl restart apache2

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

sudo apache2ctl configtest
Syntax OK

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

فرمان ufw زیر را اجرا کنید تا پورت TCP شماره 443 برای همه باز شود.

sudo ufw allow 443/tcp comment 'accept secure Apache connections'

برای بررسی تنظیمات به صورت زیر عمل کنید.

sudo ufw status

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

تا به اینجا ماژول mod_md را برای آپاچی در اوبونتو نصب کردیم، تمام ماژول اصلی را فعال کردیم و پورت‌های TCP موردنیاز برای فایروال تعریف شد. حالا نوبت به راه‌اندازی دوباره سرور آپاچی 2 برای دسترسی به گواهی رایگان TLS/SSL با استفاده از Let’s Encrypt است. برای این منظور از فرمان زیر استفاده می‌شود.

sudo systemctl restart apache2.service

به محض اینکه آپاچی 2 ری‌استارت شد، ماژول mod_md با Let’s Encrypt ارتباط برقرار می‌کند و درخواست یک گواهی برای دامین شما می‌دهد. معمولاً این روند تا یک دقیقه زمان می‌برد. برای بررسی موفقیت‌آمیز بودن این موضوع می‌توانید به فایل تاریخچه خطاهای سرور یا صفحه mod_status آپاچی مراجعه کنید. این چیزی است که در فایل erro.log مشاهده خواهید کرد.

sudo tail -f /var/log/apache2/error.log

امکان استفاده از فرمان grep نیز برای این منظور وجود دارد.

sudo grep 'The Managed Domain' /var/log/apache2/error.log

نمونه خروجی نشان می‌دهد که Let’s Encrypt یک گواهی رایگان TLS/SSL ارائه داده است.

[Wed May 06 20:17:38.112849 2020] [md:notice] [pid 21777:tid 139807872861952] AH10059: The Managed Domain www42.ariaservice.net has been setup and changes will be activated on next (graceful) server restart.

البته می‌توان از آدرس وضعیت سرور نیز دیدن کنیم. برای این منظور داریم:

http://www42.ariaservice.net/server-status
http://your-public-ip-here/server-status

مدیریت وضعیت دامین برای آپاچی با mod_md Let's Encrypt

برای فعالسازی گواهی، راه‌اندازی دوباره سرور آپاچی 2 در اینجا توصیه می‌شود.

sudo systemctl reload apache2.service

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

تنها کاری که باید انجام دهید، تایپ فرمان زیر یا استفاده از مرورگری مانند کروم یا فایرفوکس است. در هر صورت، شما باید از دریافت یک اتصال HTTPS مطمئن باشید.

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 می‌توانید از فرمان زیر استفاده کنید.

sudo apache2ctl -M
sudo apache2ctl -M | grep mod_watchdog

ماژول‌های بارگذاری شده

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)

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

حالا نوبت به مانیتورینگ گواهی ما می‌رسد. دو روش برای این منظور وجود دارد. اول اینکه می‌توانید آدرس وضعیت سرور را باز کنید.

https://www42.ariaservice.net/server-status
https://your-public-ip-here/server-status

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

sudo nano /etc/apache2/sites-available/www42.ariaservice.net.conf

موارد زیر را اضافه کنید.

<Location "/md-status">
SetHandler md-status
</Location>

فایل را ذخیره کرده و ببندید. سپس باید سرور را دوباره اندازی کنید.

sudo systemctl restart apache2.service
curl https://www42.ariaservice.net /md-status

نمونه خروجی

{
"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