Cách bảo mật Apache bằng Let's Encrypt trên Debian 8
Hướng dẫn này sẽ chỉ cho bạn cách cài đặt certificate TLS / SSL từ Let's Encrypt trên server Debian 8 chạy Apache dưới dạng web server . Ta cũng sẽ trình bày cách tự động hóa quy trình gia hạn certificate bằng cron job.Chứng chỉ SSL được sử dụng trong web server để mã hóa lưu lượng giữa server và client , cung cấp thêm bảo mật cho user truy cập ứng dụng của bạn. Let's Encrypt cung cấp một cách dễ dàng để lấy và cài đặt các certificate tin cậy miễn phí.
Yêu cầu
 Để hoàn thành hướng dẫn này, bạn  cần  một  server  Debian 8 với  user  sudo không phải root cho  các việc  quản trị.  Bạn có thể cài đặt   user  với các quyền thích hợp  theo  hướng dẫn  cài đặt   server  ban đầu Debian 8 của  ta .
Bạn phải sở hữu hoặc kiểm soát domain đã đăng ký mà bạn muốn sử dụng certificate . Nếu bạn chưa có domain đã đăng ký, bạn có thể đăng ký một domain với một trong nhiều công ty đăng ký domain hiện có (ví dụ: Namecheap, GoDaddy, v.v.).
 Nếu bạn chưa có, hãy đảm bảo tạo Bản ghi A trỏ domain  của bạn đến địa chỉ IP công cộng trên  server  của bạn (nếu bạn đang sử dụng DNS của DigitalOcean, bạn có thể làm theo hướng dẫn này ). Điều này là bắt buộc vì cách Let's Encrypt xác thực rằng bạn sở hữu domain  mà nó đang cấp certificate . Ví dụ: nếu bạn muốn lấy certificate  cho example.com , thì domain  đó phải phân giải tới  server  của bạn để quá trình xác thực hoạt động.  Cài đặt  của  ta  sẽ sử dụng example.com và www.example.com làm domain , vì vậy cả hai bản ghi DNS đều được yêu cầu .
Khi đã sẵn sàng để tiếp tục, hãy đăng nhập vào server bằng account sudo của bạn.
Bước 1: Cài đặt Certbot, Ứng dụng khách Hãy Mã hóa
 Bước đầu tiên để sử dụng Let's Encrypt để lấy certificate  SSL là cài đặt  ứng dụng client  certbot Let's Encrypt trên  server  của bạn.
 Gói certbot không khả dụng khi Debian 8 được phát hành. Để truy cập vào gói certbot ,  ta  sẽ phải kích hoạt repository  Jessie backports trên  server  của  ta . Kho lưu trữ này  được dùng  để cài đặt các version  phần mềm mới hơn những version  có trong repository  lưu trữ ổn định.
Thêm repository backports vào server của bạn bằng lệnh :
- echo 'deb http://ftp.debian.org/debian jessie-backports main' | sudo tee /etc/apt/sources.list.d/backports.list 
Sau khi thêm repository  mới, hãy cập nhật  index gói  apt để  download  thông tin về các gói mới:
- sudo apt-get update 
Sau khi cập nhật repository , bạn có thể cài đặt gói python-certbot-apache , gói này kéo certbot vào, bằng cách  nhắm đến  repository  backports:
Lưu ý: Khi sử dụng backports, bạn chỉ nên cài đặt các gói cụ thể mà bạn yêu cầu, thay vì sử dụng repository cho các bản cập nhật chung. Các gói backport có ít đảm bảo tương thích hơn các kho chính.
 Để giúp tránh vô tình cài đặt hoặc cập nhật các gói bằng cách sử dụng repository  này, bạn phải chuyển rõ ràng cờ -t với tên repository  để cài đặt các gói từ các cổng lùi.
- sudo apt-get install python-certbot-apache -t jessie-backports 
certbot dụng certbot bây giờ đã sẵn sàng để sử dụng.
Bước 2: Cài đặt Apache ServerName và ServerAlias
 Có thể chuyển các domain  mà  ta  muốn bảo mật làm đối số khi gọi tiện ích certbot . Tuy nhiên, certbot cũng có thể đọc chúng từ chính cấu hình Apache. Vì thông lệ tốt là luôn nói rõ ràng về các domain  mà  server  của bạn phải phản hồi,  ta  sẽ đặt trực tiếp ServerName và ServerAlias trong cấu hình Apache.
 Khi  ta  cài đặt dịch vụ python-certbot-apache , Apache đã được cài đặt nếu nó chưa có trên hệ thống. Mở file   Server  ảo Apache mặc định để  ta  có thể đặt domain   của bạn  một cách rõ ràng:
- sudo nano /etc/apache2/sites-available/000-default.conf 
Bên trong, trong khối Virtual Host, thêm hoặc bỏ ghi chú chỉ thị ServerName và đặt nó thành domain  chính của bạn. Bất kỳ domain  thay thế nào mà  server  này cũng sẽ phản hồi có thể được thêm vào bằng cách sử dụng chỉ thị ServerAlias .
 Đối với ví dụ của  ta ,  ta  đang sử dụng example.com làm tên chuẩn và www.example.com làm alias . Khi  ta   cài đặt  các chỉ thị này, nó sẽ giống như sau:
<VirtualHost *:80>     . . .     ServerName example.com     ServerAlias www.example.com     . . . </VirtualHost> Khi bạn hoàn tất, hãy lưu file bằng cách giữ CTRL và nhấn X. Nhập Y và nhấn Enter để lưu file .
Kiểm tra file cấu hình để biết bất kỳ lỗi cú pháp nào có thể do các thay đổi tạo ra:
- sudo apache2ctl configtest 
Tìm dòng này trong kết quả :
OutputSyntax OK Nếu file đã vượt qua kiểm tra cú pháp, hãy khởi động lại dịch vụ Apache để thực hiện các thay đổi :
- sudo systemctl restart apache2 
Bây giờ Apache đã được  cấu hình  với domain  của bạn,  ta  có thể sử dụng certbot để lấy certificate  SSL  của bạn .
Bước 3: Điều chỉnh firewall
Nếu bạn đã bật firewall , bạn cần điều chỉnh cài đặt để cho phép lưu lượng SSL. Quy trình bắt buộc phụ thuộc vào phần mềm firewall bạn đang sử dụng. Nếu hiện tại bạn chưa cấu hình firewall , vui lòng bỏ qua.
UFW
Nếu bạn đang sử dụng ufw , bạn có thể xem cài đặt hiện tại bằng lệnh :
- sudo ufw status 
Nó có thể trông như thế này, nghĩa là chỉ lưu lượng SSH được phép đến web server :
OutputStatus: active  To                         Action      From --                         ------      ---- SSH                        ALLOW       Anywhere SSH (v6)                   ALLOW       Anywhere (v6) Ngoài ra, để cho phép truy cập HTTP và HTTPS, ta có thể cho phép cấu hình ứng dụng “WWW Full”:
- sudo ufw allow 'WWW Full' 
Trạng thái của bạn bây giờ sẽ như thế này:
- sudo ufw status 
OutputStatus: active  To                         Action      From --                         ------      ---- SSH                        ALLOW       Anywhere WWW Full                   ALLOW       Anywhere SSH (v6)                   ALLOW       Anywhere (v6) WWW Full (v6)              ALLOW       Anywhere (v6) Các yêu cầu HTTP và HTTPS hiện sẽ được server của bạn chấp nhận.
IPTables
 Nếu bạn đang sử dụng iptables , bạn có thể xem các  luật  hiện tại  bằng lệnh :
- sudo iptables -S 
Nếu bạn đã bật bất kỳ luật nào, chúng sẽ được hiển thị. Một cấu hình ví dụ có thể trông như thế này:
Output-P INPUT DROP -P FORWARD ACCEPT -P OUTPUT ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT Các lệnh cần thiết để mở lưu lượng SSL sẽ phụ thuộc vào các luật hiện tại của bạn. Đối với bộ luật cơ bản như luật ở trên, bạn có thể thêm quyền truy cập SSL bằng lệnh :
- sudo iptables -I INPUT -p tcp --dport 443 -j ACCEPT 
Nếu ta xem lại các luật firewall , ta sẽ thấy luật mới:
- sudo iptables -S 
Output-P INPUT DROP -P FORWARD ACCEPT -P OUTPUT ACCEPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT Nếu bạn đang sử dụng một chương trình để tự động áp dụng các  luật  iptables khi khởi động,  bạn cần   đảm bảo  bạn cập nhật cấu hình  của bạn  với  luật  mới.
Bước 4: Cài đặt certificate SSL
Tạo Chứng chỉ SSL cho Apache bằng ứng dụng Let's Encrypt khá đơn giản. Máy khách sẽ tự động lấy và cài đặt certificate SSL mới hợp lệ cho các domain trong cấu hình Apache của ta .
Để thực hiện cài đặt tương tác và lấy certificate cho tất cả các domain được xác định trong cấu hình Apache của bạn, hãy nhập:
- sudo certbot --apache 
Tiện ích certbot sẽ đánh giá cấu hình Apache của bạn để tìm các domain  nên được bao phủ bởi certificate  được yêu cầu.  Bạn có thể  bỏ chọn bất kỳ domain  đã xác định nào mà bạn không muốn được đề cập trong certificate .
  Bạn sẽ thấy  với hướng dẫn từng bước để tùy chỉnh các tùy chọn certificate   của bạn .  Bạn cần  cung cấp địa chỉ email để khôi phục khóa bị mất và các thông báo, đồng thời bạn có thể chọn giữa bật cả truy cập http và https hoặc buộc tất cả các yêu cầu chuyển hướng đến https . Thường an toàn nhất là yêu cầu https , trừ khi bạn có nhu cầu cụ thể về lưu lượng truy cập http không được mã hóa.
 Khi quá trình cài đặt hoàn tất, bạn có thể tìm thấy các file  certificate  đã tạo tại /etc/letsencrypt/live . Bạn có thể xác minh trạng thái certificate  SSL  của bạn  bằng liên kết sau (đừng quên thay thế example.com bằng domain  của bạn):
https://www.ssllabs.com/ssltest/analyze.html?d=example.com&latest Có thể mất vài phút để hoàn thành bài kiểm tra.  Đến đây bạn  có thể truy cập trang web  của bạn  bằng tiền tố https .
Bước 5: Cài đặt Tự động gia hạn
 Chứng chỉ Let's Encrypt có hiệu lực trong 90 ngày, nhưng bạn nên gia hạn certificate  sau mỗi 60 ngày để hạn chế sai sót. certbot dụng certbot có lệnh renew tự động kiểm tra các certificate  hiện được cài đặt và cố gắng gia hạn chúng nếu chúng còn cách ngày hết hạn chưa đầy 30 ngày.
Để kích hoạt quá trình gia hạn cho tất cả các domain đã cài đặt, bạn nên chạy:
- sudo certbot renew 
Bởi vì ta gần đây đã cài đặt certificate , lệnh sẽ chỉ kiểm tra ngày hết hạn và in một thông báo thông báo rằng certificate chưa đến hạn gia hạn. Đầu ra sẽ giống như sau:
OutputSaving debug log to /var/log/letsencrypt/letsencrypt.log  ------------------------------------------------------------------------------- Processing /etc/letsencrypt/renewal/example.com.conf ------------------------------------------------------------------------------- Cert not yet due for renewal  The following certs are not due for renewal yet:   /etc/letsencrypt/live/example.com/fullchain.pem (skipped) No renewals were attempted. Lưu ý nếu bạn đã tạo certificate đi kèm với nhiều domain , thì chỉ domain cơ sở mới được hiển thị trong kết quả , nhưng việc gia hạn phải hợp lệ cho tất cả các domain có trong certificate này.
Một cách thực tế đảm bảo certificate của bạn không bị lỗi thời là tạo một công việc cron sẽ thực hiện định kỳ lệnh gia hạn tự động cho bạn. Vì lần gia hạn đầu tiên kiểm tra ngày hết hạn và chỉ thực hiện gia hạn nếu certificate còn chưa đầy 30 ngày nữa là hết hạn, ví dụ: có thể an toàn để tạo một công việc cron chạy hàng tuần hoặc thậm chí hàng ngày.
Hãy chỉnh sửa crontab để tạo một công việc mới sẽ chạy lệnh gia hạn hàng tuần. Để chỉnh sửa crontab cho user root, hãy chạy:
- sudo crontab -e 
Bạn có thể được yêu cầu chọn một editor :
Outputno crontab for root - using an empty one  Select an editor.  To change later, run 'select-editor'.   1. /bin/nano        <---- easiest   2. /usr/bin/vim.basic   3. /usr/bin/vim.tiny  Choose 1-3 [1]: Trừ khi  bạn thấy phù hợp  hơn với vim , hãy nhấn Enter để sử dụng nano , mặc định.
Bao gồm nội dung sau vào cuối crontab, tất cả trong một dòng:
crontab. . . 30 2 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log Lưu và thoát. Thao tác này sẽ tạo một công việc cron mới sẽ thực thi lệnh letsencrypt-auto renew vào thứ Hai hàng tuần lúc 2:30 sáng. Đầu ra do lệnh tạo ra sẽ được chuyển đến file  log  có địa chỉ tại /var/log/le-renewal.log .
 Để biết thêm thông tin về cách tạo và lập lịch công việc cron, bạn có thể xem Cách sử dụng Cron để tự động hóa công việc trong hướng dẫn VPS .
Kết luận
Trong hướng dẫn này, ta đã giới thiệu cho các bạn cách cài đặt certificate SSL miễn phí từ Let's Encrypt để bảo mật trang web được lưu trữ bằng Apache. Ta khuyên bạn nên kiểm tra blog Let's Encrypt chính thức để biết các cập nhật quan trọng theo thời gian.
Các tin liên quan
Cách cung cấp các ứng dụng Django với Apache và mod_wsgi trên Debian 82016-12-19
Cách tạo chuyển hướng tạm thời và vĩnh viễn với Apache
2016-12-15
Cách di chuyển web root Apache đến một vị trí mới trên Debian 8
2016-12-14
Cách thiết lập mod_rewrite cho Apache trên CentOS 7
2016-10-26
Cách di chuyển web root Apache đến vị trí mới trên Ubuntu 16.04
2016-07-27
Cách thiết lập xác thực mật khẩu với Apache trên Ubuntu 16.04
2016-07-26
Cách cung cấp các ứng dụng Django với Apache và mod_wsgi trên Ubuntu 16.04
2016-05-17
Cách mã hóa kết nối Tomcat 8 với Apache hoặc Nginx trên Ubuntu 16.04
2016-04-29
Cách tạo chứng chỉ SSL tự ký cho Apache trong Ubuntu 16.04
2016-04-21
Cách thiết lập server ảo Apache trên Ubuntu 16.04
2016-04-21
 

