Bảo mật apache với let-s-encrypt trên Ubuntu 20.04
Let's Encrypt là Tổ chức phát hành certificate (CA) tạo điều kiện cho việc lấy và cài đặt certificate TLS / SSL miễn phí, do đó cho phép HTTPS được mã hóa trên web server. Nó đơn giản hóa quy trình bằng cách cung cấp một ứng dụng client, có tên là Certbot, cố gắng tự động hóa hầu hết (nếu không phải tất cả) các bước cần thiết. Hiện tại, toàn bộ quá trình lấy và cài đặt certificate hoàn toàn tự động trên cả Apache và Nginx.Trong hướng dẫn này, ta sẽ sử dụng Certbot để lấy certificate SSL miễn phí cho Apache trên Ubuntu 20.04 và đảm bảo certificate này được cài đặt để gia hạn tự động.
Hướng dẫn này sử dụng file VirtualHost riêng biệt thay vì file cấu hình mặc định của Apache để cài đặt trang web sẽ được bảo mật bằng Let's Encrypt. Bạn nên tạo file VirtualHost Apache mới cho từng domain được lưu trữ trong server vì nó giúp tránh các lỗi thường gặp và duy trì file cấu hình mặc định dưới dạng cài đặt dự phòng.
Yêu cầu
Để làm theo hướng dẫn này, bạn cần:
-
Một server Ubuntu 20.04 được cài đặt theo cài đặt server ban đầu này cho hướng dẫn Ubuntu 20.04 , bao gồm một user không phải root có quyền sudo và firewall.
-
Domain đã đăng ký đầy đủ. Hướng dẫn này sẽ sử dụng your_domain làm ví dụ xuyên suốt. Bạn có thể mua một domain trên Namecheap , nhận một domain miễn phí trên Freenom hoặc sử dụng công ty đăng ký domain mà bạn chọn.
-
Cả hai bản ghi DNS sau được cài đặt cho server.
- Một bản ghi với
your_domain
trỏ đến địa chỉ IP công cộng của server. - Một bản ghi A với
www. your_domain
trỏ đến địa chỉ IP công cộng của server.
- Một bản ghi với
-
Đã cài đặt Apache theo Cách cài đặt Apache trên Ubuntu 20.04 . Đảm bảo bạn có file VirtualHost cho domain của bạn. Hướng dẫn này sẽ sử dụng
/etc/apache2/sites-available/your_domain.conf
làm ví dụ.
Bước 1 - Cài đặt Certbot
Để có được certificate SSL với Let's Encrypt, trước tiên ta cần cài đặt phần mềm Certbot trên server. Ta sẽ sử dụng repository Ubuntu mặc định cho việc đó.
Ta cần hai gói: certbot
và python3-certbot-apache
. Sau này là một plugin tích hợp Certbot với Apache, giúp bạn có thể tự động lấy certificate và cấu hình HTTPS trong web server bằng một lệnh duy nhất.
- sudo apt install certbot python3-certbot-apache
Bạn cần xác nhận cài đặt bằng cách nhấn Y
, sau đó ENTER
.
Certbot hiện đã được cài đặt trên server. Trong bước tiếp theo, ta sẽ xác minh cấu hình của Apache đảm bảo VirtualHost của bạn được đặt phù hợp. Điều này sẽ đảm bảo tập lệnh ứng dụng client certbot
sẽ có thể phát hiện các domain của bạn và cấu hình lại web server để tự động sử dụng certificate SSL mới được tạo của bạn.
Bước 2 - Kiểm tra cấu hình VirtualHost Apache của bạn
Để có thể tự động lấy và cấu hình SSL cho web server, Certbot cần tìm đúng VirtualHost trong các file cấu hình Apache của bạn. Các domain server sẽ được truy xuất từ dòng ServerName
và ServerAlias
được xác định trong đoạn cấu hình VirtualHost
của bạn.
Nếu bạn đã làm theo bước cài đặt VirtualHost trong hướng dẫn cài đặt Apache , bạn nên cài đặt đoạn VirtualHost cho domain của bạn tại /etc/apache2/sites-available/your_domain.conf
với ServerName
và cả các chỉ thị ServerAlias
đã được cài đặt thích hợp.
Để kiểm tra điều này, hãy mở file VirtualHost cho domain của bạn bằng nano
hoặc editor bạn quen dùng:
- sudo nano /etc/apache2/sites-available/your_domain.conf
Tìm dòng ServerName
và ServerAlias
hiện có. Chúng sẽ trông như thế này:
...
ServerName your_domain
ServerAlias www.your_domain
...
Nếu bạn đã cài đặt ServerName
và ServerAlias
như thế này, bạn có thể thoát khỏi editor và chuyển sang bước tiếp theo. Nếu đang sử dụng nano
, bạn có thể thoát bằng lệnh CTRL+X
, sau đó là Y
và ENTER
để xác nhận.
Nếu cấu hình VirtualHost hiện tại của bạn không trùng với ví dụ, hãy cập nhật nó cho phù hợp. Khi bạn hoàn tất, hãy lưu file và thoát khỏi trình chỉnh sửa. Sau đó, chạy lệnh sau để áp dụng các thay đổi:
- sudo apache2ctl configtest
Bạn sẽ thấy Syntax OK
nếu không có lỗi gì. Nếu bạn gặp lỗi, hãy mở lại file VirtualHost và kiểm tra bất kỳ lỗi chính tả hoặc ký tự bị thiếu nào. Khi cú pháp của file cấu hình của bạn chính xác, hãy reload (tải-lại) Apache để các thay đổi có hiệu lực:
- sudo systemctl reload apache2
Với những thay đổi này, Certbot sẽ có thể tìm thấy đoạn VirtualHost chính xác và cập nhật nó.
Tiếp theo, ta sẽ cập nhật firewall để cho phép truy cập HTTPS.
Bước 3 - Cho phép HTTPS thông qua firewall
Nếu bạn đã bật firewall UFW, bạn cần cho phép truy cập HTTPS. Sau khi cài đặt, Apache đăng ký một số cấu hình ứng dụng UFW khác nhau. Ta có thể tận dụng profile Apache Full để cho phép cả truy cập HTTP và HTTPS trên server.
Để xác minh loại lưu lượng nào hiện được phép trên server, bạn có thể sử dụng:
- sudo ufw status
Nếu bạn đã làm theo một trong các hướng dẫn cài đặt Apache , kết quả của bạn sẽ trông giống như thế này, nghĩa là chỉ truy cập HTTP trên cổng 80
hiện được phép:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Apache ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Apache (v6) ALLOW Anywhere (v6)
Ngoài ra, để cho phép lưu lượng truy cập HTTPS, hãy cho phép cấu hình “Apache Full” và xóa cấu hình “Apache” thừa:
- sudo ufw allow 'Apache Full'
- sudo ufw delete allow 'Apache'
Trạng thái của bạn bây giờ sẽ giống như sau:
- sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Apache Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Apache Full (v6) ALLOW Anywhere (v6)
Đến đây bạn đã sẵn sàng để chạy Certbot và lấy certificate của bạn.
Bước 4 - Lấy certificate SSL
Certbot cung cấp nhiều cách khác nhau để lấy certificate SSL thông qua các plugin. Plugin Apache sẽ đảm nhiệm việc cấu hình lại Apache và reload (tải-lại) cấu hình khi nào cần thiết. Để sử dụng plugin này, hãy nhập như sau:
- sudo certbot --apache
Tập lệnh này sẽ nhắc bạn trả lời một loạt câu hỏi để cấu hình certificate SSL của bạn. Đầu tiên, nó sẽ yêu cầu bạn cung cấp một địa chỉ e-mail hợp lệ. Email này sẽ được sử dụng cho các thông báo gia hạn và thông báo bảo mật:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): you@your_domain
Sau khi cung cấp một địa chỉ e-mail hợp lệ, hãy nhấn ENTER
để chuyển sang bước tiếp theo. Sau đó, bạn cần xác nhận nếu bạn đồng ý với các điều khoản dịch vụ của Let's Encrypt. Bạn có thể xác nhận bằng cách nhấn A
và sau đó ENTER
:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A
Tiếp theo, bạn sẽ được hỏi liệu bạn có muốn chia sẻ email của bạn với Electronic Frontier Foundation để nhận tin tức và thông tin khác hay không. Nếu bạn không muốn đăng ký nội dung của họ, hãy nhập N
, Nếu không, hãy nhập Y
Sau đó, nhấn ENTER
để chuyển sang bước tiếp theo.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N
Bước tiếp theo sẽ nhắc bạn thông báo cho Certbot về những domain bạn muốn kích hoạt HTTPS. Các domain được liệt kê được tự động lấy từ cấu hình VirtualHost Apache của bạn, đó là lý do tại sao điều quan trọng là bạn phải đảm bảo bạn đã cấu hình đúng cài đặt ServerName
và ServerAlias
trong VirtualHost của bạn. Nếu bạn muốn bật HTTPS cho tất cả các domain được liệt kê (được khuyến khích), bạn có thể để trống dấu nhắc và nhấn ENTER
để tiếp tục. Nếu không, hãy chọn các domain bạn muốn bật HTTPS bằng cách liệt kê từng cái, phân tách bằng dấu phẩy và / hoặc dấu cách, sau đó nhấn ENTER
.
Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: your_domain
2: www.your_domain
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):
Bạn sẽ thấy kết quả như thế này:
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for your_domain
http-01 challenge for www.your_domain
Enabled Apache rewrite module
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/apache2/sites-available/your_domain-le-ssl.conf
Enabled Apache socache_shmcb module
Enabled Apache ssl module
Deploying Certificate to VirtualHost /etc/apache2/sites-available/your_domain-le-ssl.conf
Enabling available site: /etc/apache2/sites-available/your_domain-le-ssl.conf
Deploying Certificate to VirtualHost /etc/apache2/sites-available/your_domain-le-ssl.conf
Tiếp theo, bạn chọn có muốn chuyển hướng truy cập HTTP đến HTTPS hay không, nghĩa là các truy cập trang web thông qua các kênh không được mã hóa (HTTP) sẽ tự động được chuyển hướng đến địa chỉ HTTPS. Chọn 2
(như bên dưới) để bật chuyển hướng hoặc 1
nếu bạn muốn giữ cả HTTP và HTTPS đều cho truy cập.
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): 2
Sau bước này, cấu hình của Certbot đã hoàn tất và bạn sẽ thấy những thông tin cuối cùng về certificate mới của bạn, nơi các file được tạo và cách kiểm tra cấu hình bằng một công cụ bên ngoài kiểm tra xác thực certificate:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://your_domain and
https://www.your_domain
You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=your_domain
https://www.ssllabs.com/ssltest/analyze.html?d=www.your_domain
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/your_domain/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/your_domain/privkey.pem
Your cert will expire on 2020-07-27. 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
Certificate của bạn hiện đã được cài đặt và đưa vào dùng với Apache. Hãy thử truy cập lại trang web bằng https://
. Nó sẽ cho biết trang web được bảo mật đúng cách, thường bằng cách hiển thị biểu tượng ổ khóa trong đầu thanh địa chỉ.
Bạn có thể sử dụng Kiểm tra server SSL Labs để xác minh cấp certificate của bạn và nhận thông tin chi tiết về certificate đó, từ quan điểm của một dịch vụ bên ngoài.
Trong bước tiếp theo và cuối cùng, ta sẽ thử nghiệm tính năng tự động gia hạn của Certbot, đảm bảo certificate của bạn sẽ tự động được gia hạn trước ngày hết hạn.
Bước 5 - Xác minh Tự động gia hạn Certbot
Certificate của Let's Encrypt chỉ có giá trị trong chín mươi ngày. Điều này nhằm khuyến khích user tự động hóa gia hạn certificate, cũng như đảm bảo các certificate bị lạm dụng hoặc khóa bị đánh cắp sẽ hết hạn sớm.
Các certbot
ta cài đặt sẽ quản lý gia hạn bằng một kịch bản trong /etc/cron.d
, được quản lý bởi một systemctl
dịch vụ gọi là certbot.timer
. Tập lệnh này chạy hai lần một ngày và sẽ tự động gia hạn các certificate khi sắp hết hạn (30 ngày).
Để kiểm tra trạng thái của dịch vụ này và đảm bảo nó đang đang chạy, bạn có thể sử dụng:
- sudo systemctl status certbot.timer
Bạn sẽ nhận được kết quả tương tự như sau:
● certbot.timer - Run certbot twice daily
Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Tue 2020-04-28 17:57:48 UTC; 17h ago
Trigger: Wed 2020-04-29 23:50:31 UTC; 12h left
Triggers: ● certbot.service
Apr 28 17:57:48 fine-turtle systemd[1]: Started Run certbot twice daily.
Để kiểm tra quá trình gia hạn, bạn có thể thực hiện chạy thử nghiệm với certbot
:
- sudo certbot renew --dry-run
Nếu không thấy lỗi, bạn đã hoàn tất. Khi cần thiết, Certbot sẽ gia hạn certificate của bạn và reload (tải-lại) Apache để áp dụng các thay đổi. Nếu quá trình gia hạn tự động không thành công, Let's Encrypt sẽ gửi một thông báo đến email bạn đã chỉ định, cảnh báo cho bạn khi certificate sắp hết hạn.
Kết luận
Trong hướng dẫn này, bạn đã cài đặt certbot
ứng dụng client Let's Encrypt, cấu hình và cài đặt certificate SSL cho domain của bạn và xác nhận dịch vụ gia hạn tự động của Certbot đang hoạt động trong systemctl
. Nếu bạn có thêm câu hỏi về việc sử dụng Certbot, tài liệu của họ là một nơi tốt để tham khảo.
Các tin trước
Cài đặt LEMP Linux Nginx MySQL PHP (LEMP ) trên Ubuntu 20 04 2020-04-29
Cài đặt Linux Apache MySQL PHP (LAMP) trên Ubuntu 20 04 2020-04-29
Cài đặt Apache Web Server trên Ubuntu 20.04 2020-04-27
Cài đặt Nginx trên Ubuntu 20.04 2020-04-24
Khởi tạo bảo mật Server Ubuntu 20.04 2020-04-23
Cài đặt SSH Key trên Ubuntu 20.04 2020-04-23
Cài đặt MySQL trên Ubuntu 18.04 2020-04-21
Cài đặt và bảo mật phpMyAdmin trên Ubuntu 18.04 2020-04-21
Cài đặt Webserver Apache trên CentOS 7 2019-05-29
So sánh SQLite , MySQL , PostgreSQL 2019-03-19