SSL và bảo vệ thư mục trong OpenLiteSpeed

Sắp cuối năm rồi, mình sẽ cố gắng hoàn thành nốt hành trình khám phá của mình về OpenLiteSpeed. Bài này sẽ hướng dẫn cách cài đặt SSL trên OpenLiteSpeed một cách thật chi tiết, đi kèm với một số khuyến nghị để nâng cao chất lượng của kết nối SSL giữa máy của người truy cập và website.

Ngoài ra, bài viết này cũng chỉ cho các bạn cách bảo vệ một thư mục hoặc file bất kỳ qua việc sử dụng realm trong OpenLiteSpeed và áp dụng nó vào trong một context (phạm vi) nhất định. Việc bảo vệ này sẽ có ích lớn hơn nếu người dùng thực hiện kết nối SSL đến server, nên mình viết chung về SSL và realm vào chung một bài lớn.

  1. Thiết lập SSL
  2. Realm, cách thiết lập và áp dụng trong virtual host

Thiết lập SSL

Kích hoạt SSL

Để sử dụng SSL, trước hết các bạn tiến hành kích hoạt SSL tại listener. Trong trang admin của OpenLiteSpeed, các bạn chọn mục Listeners ở cột trái, rồi ấn chọn tên của listener mà các bạn muốn kích hoạt SSL ở trong bảng Listener List ở bên phải. Phần thiết lập chi tiết của listener được mở ra với tab General được mở sẵn. Tại đó, các bạn chỉnh lại dòng Secure thuộc bảng Address Settings sang giá trị Yes (có) để bật SSL cho listener này. Chi tiết về cách cài đặt listener, các bạn có thể tham khảo thêm tại bài viết về listener và virtual host.

Chọn vị trí thiết lập SSL

Thiết lập SSL ngay tại listener

Bất cứ virtual host nào được gán vào listener có SSL đều sẽ sử dụng lại (thừa kế) thiết lập tại listener. Điều này tốt nếu các bạn muốn áp dụng chung nhiều thiết lập SSL cho nhiều virtual host. Sau đó, bất cứ thay đổi thiết lập SSL nào ở virtual host sẽ được áp dụng riêng cho chính virtual host đó, mà không ảnh hưởng đến các virtual host khác sử dụng chung listener. Để thiết lập SSL tại listener, ấn mở tiếp tab SSL trong phần cài đặt chi tiết của listener được chọn điều chỉnh.

Thiết lập SSL tại virtual host

Để tạo SSL tại virtual host, các bạn chuyển sang mục Virtual Hosts ở cột trái. Trong danh sách virtual host hiện ra ở bên phải, chọn tên của virtual host mà các bạn muốn điều chỉnh. Sau đó, phần thiết lập chi tiết của virtual host hiện ra, các bạn chọn mở tab SSL.

Các thiết lập chi tiết trong tab SSL

Tab SSL gồm có nhiều bảng. Bên phải tiêu đề mỗi bảng là nút Edit để sửa các dòng thiết lập trong bảng đó.

Tab SSL trong phần cài đặt chi tiết của listener

Mình sẽ giới thiệu từng bảng một để mọi người nắm được tác dụng của các thiết lập trong bảng đó.

Bảng SSL Private Key & Certificate

Bảng này là nơi các bạn xác định sử dụng các file private key (khoá riêng) và certificate (chứng chỉ) dùng cho SSL.

Dòng Private Key File

Đường dẫn tuyệt đối của file khoá riêng.

Dòng Certificate File

Đường dẫn tuyệt đối của file chứng chỉ.

Dòng Chained Certificate

Xác định file chứng chỉ tại đường dẫn ở trên có chứa một chuỗi chứng chỉ hay không?

Chuỗi này bắt đầu từ chứng chỉ dành cho website. Tiếp theo đó là chứng chỉ trung gian (intermediate certificate), tức là chứng chỉ riêng của nhà cung cấp chứng chỉ (certification authority – CA). Kết thúc là chứng chỉ gốc (root certificate), là chứng chỉ riêng của CA đóng vai trò đầu nguồn (root CA).

Tại dòng này có ba giá trị có thể chọn: Yes (có), No (không), Not Set (không xác định). Khi chọn giá trị cuối cùng, OpenLiteSpeed sẽ tự động xác định thiết lập tại dòng này, hoặc thừa kế từ thiết lập tại listener.

Nếu file chứng chỉ được xác định có chứa chuỗi chứng chỉ, thì các bạn không cần phải điền gì vào hai dòng sau đây nữa.

Dòng CA Certificate Path

Đường dẫn tuyệt đối của thư mục chứa chứng chỉ riêng của nhà cung cấp. Nếu chỉ có duy nhất một file chứng chỉ như vậy thì không cần điền dòng này, mà điền thẳng đường dẫn vào dòng dưới đây.

Dòng CA Certificate File

Đường dẫn tuyệt đối của file chứng chỉ riêng của nhà cung cấp.

Một ví dụ thiết lập cụ thể cho bảng trên

Giả sử các bạn đã sử dụng chương trình certbot để yêu cầu cấp chứng chỉ miễn phí từ Let’s Encrypt cho một website nằm tại tên miền vidu.com. Các bạn sẽ chỉnh sửa bảng trên như sau:

  • Private Key File: /etc/letsencrypt/live/vidu.com/privkey.pem
  • Certificate File: /etc/letsencrypt/live/vidu.com/fullchain.pem
  • Chained Certificate: Yes
  • CA Certificate Path, CA Certificate File: (để trống)

Hoặc các bạn có thể điều chỉnh như sau:

  • Private Key File: /etc/letsencrypt/live/vidu.com/privkey.pem
  • Certificate File: /etc/letsencrypt/live/vidu.com/cert.pem
  • Chained Certificate: No
  • CA Certificate Path: (để trống)
  • CA Certificate File: /etc/letsencrypt/live/vidu.com/chain.pem

Bảng SSL Protocol

Bảng này cài đặt các chuẩn mã hoá SSL và các bộ mã hoá được phép sử dụng. Đối với hầu hết trường hợp sử dụng, chỉ cần điều chỉnh dòng Protocol Version của bảng này, không cần động đến các dòng còn lại (trừ phi có nhu cầu bảo mật cao hơn).

Dòng Protocol Version (phiên bản/chuẩn giao thức)

Tại dòng này có các chuẩn khác nhau của giao thức SSL từ SSLv3 (chuẩn cũ), cho đến các chuẩn TLS tiên tiến hơn. Chọn bật/tắt các phiên bản bằng cách đánh dấu hoặc bỏ dấu tick tương ứng.

Hiện tại, chỉ có TLS 1.1 trở lên là đủ an toàn cho tổ chức nhỏ. Đối với tổ chức lớn cần sử dụng TLS 1.2 trở lên. Chỉ nên bật các chuẩn cũ nếu có nhiều khách truy cập bằng trình duyệt phiên bản cũ. (Hiện tại thì đại đa số đều đang sử dụng các trình duyệt phiên bản mới rồi.)

Dòng Ciphers (các bộ mã hoá)

Tại dòng này các bạn điền một chuỗi liên tiếp gồm các bộ mã hoá cần sử dụng, với mức độ ưu tiên sử dụng giảm dần. Giữa tên hai bộ mã hoá liên tiếp trong chuỗi là dấu hai chấm (:).

Để biết tên chính xác của các bộ mã hoá, các bạn sử dụng lệnh sau để tham khảo từ OpenSSL:

openssl ciphers -v

Lệnh trên vốn được sử dụng để liệt kê các bộ mã hoá mà phiên bản hiện thời của OpenSSL trên server có hỗ trợ, cùng với các phiên bản giao thức SSL sử dụng từng bộ mã hoá đó.

Trang khuyến nghị này của Mozilla có ghi các chuỗi bộ mã hoá nên sử dụng tại dòng Ciphersuites, tương ứng với phiên bản trình duyệt phía người dùng mà các bạn muốn hỗ trợ.

Dòng Enable DH Key Exchange

Kích hoạt trao đổi khoá Diffie-Hellman (DH) theo cơ chế thường. Một số bộ mã hoá cần sử dụng cơ chế này để được chọn sử dụng. Cơ chế này làm tăng độ an toàn của SSL.

Dòng DH Parameter (tham số DH)

Đường dẫn tuyệt đối của file tham số dùng cho cơ chế trao đổi khoá DH.

Vào mỗi lần các bạn cài đặt OpenLiteSpeed, một tham số DH mới sẽ được tạo ra với độ dài 2048 bit, đủ an toàn cho hầu hết trường hợp. Mặc định, nếu các bạn để trống dòng DH Parameter, OpenLiteSpeed sẽ sử dụng tham số mới tạo đó.

Nếu có nhu cầu bảo mật cao hơn, các bạn chạy dòng lệnh sau để tạo một file tham số mới bằng chương trình OpenSSL:

openssl dhparam -out dhparam.pem 2048

Các bạn có thể thay dhparam.pem bằng tên file .pem mà các bạn muốn. Con số 2048 là độ dài bit của tham số, các bạn có thể tăng con số này lên 4096. Tham số này càng dài thì càng an toàn, nhưng tốc độ giải mã sau đó sẽ càng thấp.

Dòng Enable ECDH Key Exchange

Kích hoạt cơ chế trao đổi khoá Diffie-Hellman cải tiến với đường cong elliptic (elliptic curve – EC). Cơ chế này nhanh hơn và an toàn hơn cơ chế trao đổi khoá DH thường ở trên. Một số bộ mã hoá tân tiến cần sử dụng cơ chế này để được server chọn dùng.

Bảng Security & Features

Bảng này chứa các thiết lập bật/tắt một số biện pháp cải thiện quá trình kết nối SSL cả về độ an toàn và tốc độ.

Dòng SSL Renegotiation Protection

Bảo vệ quá trình bắt tay (handshake) lại giữa client và server. Đã có một số phương thức tấn công vào quá trình bắt tay lại này.

Dòng Enable Session Cache

Bật bộ đệm (cache) cho phiên kết nối SSL, giúp làm giảm hiện tượng bắt tay lại.

Enable Session Tickets

Sử dụng session ticket (“vé phiên”) trong các chuẩn giao thức TLS. Đó là một đoạn dữ liệu được server mã hoá trước khi gửi đến client, trong đó chứa trạng thái của phiên kết nối. Khi client kết nối lại với server, client chỉ cần gửi kèm theo session ticket có từ lần kết nối trước đó, mà không cần gửi lại ID của phiên (session ID). Điều này sẽ cải thiện tốc độ kết nối SSL trong các lần kết nối tiếp theo.

Dòng Enable SPDY/HTTP2

Kích hoạt các giao thức tiên tiến SPDY hoặc HTTP/2, chúng hoạt động nhanh hơn giao thức HTTP/1.1 được sử dụng bấy lâu nay.

OpenLiteSpeed hỗ trợ ba phiên bản giao thức sau: SPDY/2, SPDY/3, HTTP/2. Nếu không sử dụng các giao thức này, các bạn chọn tuỳ chọn None ở dòng này.

Bảng OCSP Stapling

OCSP stapling là một cơ chế cải tiến OCSP (Online Certificate Status Protocol – giao thức trạng thái chứng chỉ trực tuyến). Cơ chế này được sử dụng trong các chuẩn giao thức TLS.

Giao thức OCSP được sử dụng để kiểm tra tính hợp lệ của chứng chỉ được sử dụng trên website. Trong giao thức OCSP thông thường, client phải gửi một yêu cầu OCSP đến CA. Sau đó CA gửi lại trạng thái của chứng chỉ. Việc này làm cho CA biết được có những client nào đang truy cập website. Và khi website có lượng truy cập lớn, server của CA sẽ bị quá tải.

Khi OCSP stapling được kích hoạt trên server của website, client không phải gửi yêu cầu OCSP đến CA nữa, mà server của website sẽ tự động thực hiện việc này, rồi sau đó lưu tạm trạng thái nhận được trong một khoảng thời gian nhất định. Trạng thái này được gửi trong quá trình bắt tay giữa client và server.

Bảng OCSP stapling trong tab SSL chứa các thiết lập chi tiết thông số cho cơ chế này.

Dòng Enable OCSP stapling

Kích hoạt cơ chế OCSP stapling. Các bạn cần quan tâm đến hai giá trị Yes (có) hoặc No (không).

Dòng OCSP Response Max Age

Khoảng thời gian mà server được lưu tạm kết quả chứa trạng thái chứng chỉ được gửi từ server của CA. Các bạn sẽ điền một con số được tính bằng giây vào dòng này. Sau khoảng thời gian này, server sẽ gửi lại yêu cầu OCSP đến CA để lấy trạng thái mới.

Dòng OCSP Responder

Link HTTP thường đến server của CA được sử dụng để nhận và trả lời yêu cầu OCSP.

Có một cách để tìm thấy thông tin này. Sử dụng trình duyệt để truy cập vào website và xem thông tin chi tiết (details) về chứng chỉ qua đó. Link này xuất hiện tại dòng Authority Information Access.

Dòng OCSP CA Certificates

Đường dẫn tuyệt đối của file chứng chỉ riêng của CA, được lưu trên server của website. Khi các bạn không điền dòng này, OpenLiteSpeed sẽ mặc định sử dụng file ghi tại dòng CA Certificate File trong bảng SSL Private Key & Certificate.

Bảng Client Verification (xác thực client)

Server có thể xác thực người dùng bằng cách kiểm tra chứng chỉ được cài đặt trên máy của người đó, nếu người đó thực sự sở hữu chứng chỉ này và chứng chỉ còn thời hạn sử dụng, thì quá trình xác thực sẽ hoàn tất. Bảng Client Verification chứa các thiết lập liên quan đến phương thức xác thực này. Khi kích hoạt phương thức ấy, client phải có chứng chỉ mới có thể kết nối đến server.

Lưu ý: Nếu server được sử dụng để chạy website công khai, thì các bạn phải để trống bảng này để “mở cửa” thông thoáng cho mọi khách truy cập.

Dòng Client Verification

Kích hoạt chế độ xác thực. Các giá trị cần quan tâm:

  • None: Không xác thực. Đây là tuỳ chọn mặc định.
  • Optional (tuỳ chọn): Client có thể có chứng chỉ hay không tuỳ ý, nhưng một khi đã có chứng chỉ thì server sẽ kiểm tra nó.
  • Required (bắt buộc): Client bắt buộc phải có chứng chỉ. Server sẽ kiểm tra chứng chỉ này.

Dòng Verify Depth

Tương tự file chứng chỉ SSL được cài đặt ở server, file chứng chỉ ở client có thể chứa một chuỗi các chứng chỉ nhỏ từ cấp thấp lên cấp cao. Con số được điền ở dòng này chỉ cấp cao nhất trong chuỗi này mà server được phép kiểm tra.

Dòng Client Revocation Path

Đường dẫn tuyệt đối của thư mục chứa các file CRL (Client Revocation List – danh sách các chứng chỉ đã bị vô hiệu hoá). Các file này phải được mã hoá theo định dạng PEM. Tên các file này phải ở dạng hash: giátrịhash.rN

Để sinh giá trị hash cho một file bằng OpenSSL, các bạn sử dụng lệnh sau:

openssl x509 -hash -noout -in tênfile.pem

Dòng Client Revocation File

Đường dẫn tuyệt đối của file CRL. OpenLiteSpeed có thể sử dụng thêm file được chỉ định tại dòng này. Tên file không nhất thiết phải ở dạng hash giống như các file trong thư mục được chỉ định tại dòng trên.


Giới thiệu về realm và thiết lập về nó

Realm là gì?

Từ tiếng Anh realm được dùng để chỉ một vùng có chủ quyền. OpenLiteSpeed sử dụng từ này nhằm chỉ các vùng đặc biệt mà chỉ có một số người dùng, kèm theo username và mật khẩu nhất định, được phép truy cập.

Cách tạo realm trong virtual host

OpenLiteSpeed cho phép tạo và sử dụng realm trong virtual host. Nhưng trước tiên, các bạn tạo sẵn một file rỗng trên server.

Các bạn hãy sử dụng chương trình PuTTY để kết nối với server qua cổng SSH (cổng 22). Tiến hành tạo một file rỗng tại vị trí nhất định. Ví dụ, đây là đường dẫn tuyệt đối của file rỗng mà mình tạo:

/usr/local/lsws/test/.htuser

Các bạn có thể sử dụng các biến đặc biệt của OpenLiteSpeed khi viết lại đường dẫn này trong trang admin của nó.

Để OpenLiteSpeed có thể chỉnh sửa file này, các bạn sử dụng lệnh chown để thay đổi user và group thành nobodynogroup, rồi sử dụng lệnh chmod để đổi quyền cho file này thành 664.

sudo chown nobody:nogroup .htuser
sudo chmod 664 .htuser

Vấn đề về user và group đối với OpenLiteSpeed được đề cập tại bài giải quyết vấn đề FTP cho OpenLiteSpeed.

Tiếp theo, các bạn mở trình duyệt mà đăng nhập vào trang admin, rồi mở mục Virtual Hosts ở cột trái. Chọn tên của virtual host cần tạo và sử dụng realm ở bên phải.

Bước 1 - Chọn tên của virtual host muốn bổ sung realm

Phần thiết lập chi tiết của virtual host được mở ra. Các bạn chọn mở tiếp tab Security. Danh sách (bảng liệt kê) Realm List trong tab này là nơi các bạn xem và tạo realm.

Bước 2 - Tìm đến nơi tạo realm trong virtual host và bắt đầu tạo realm

Để tạo một realm mới, các bạn ấn vào nút Add ở bên phải thanh tiêu đề của bảng này. Các bạn sẽ được chuyển sang bảng Password File Realm Definition.

Bước 3 - Điền thông tin cho realm mới

Tại đây, các bạn phải điền vào hai dòng được khoanh đỏ trong hình trên.

  • Realm Name: Tên của realm.
  • User DB Location: Đường dẫn tuyệt đối đến file cơ sở dữ liệu (database, DB) chứa các user (người dùng) sở hữu realm cùng với mật khẩu cho từng user. File này chính là file rỗng mà các bạn đã tạo.

Ấn nút Save của bảng này để lưu thông tin về realm mới. Realm này sẽ xuất hiện trong danh sách Realm List.

Bước 4 - Realm mới xuất hiện trong danh sách. Ấn vào tên để vào điều chỉnh tiếp realm.

Tiếp theo, các bạn ấn vào tên của realm trong danh sách Realm List, hoặc ấn vào nút View (xem chi tiết). Các bạn sẽ được xem qua bảng Password File Realm Definition một lần nữa, nhưng chú ý là ở dòng User DB Location, đường dẫn được xuất hiện dưới dạng liên kết (link) như trong hình dưới.

Bước 5 - Chú ý dòng User DB Location được hiển thị dưới dạng đường link. Ấn vào link đó.

Các bạn ấn vào link đó để bắt đầu biên tập nội dung file User DB. Một bảng liệt kê tên là User DB Entries hiện ra. Vì file rỗng nên trong bảng này hiện thời chưa có gì.

Bước 6 - Chuyển sang bảng User DB Entries. Ấn Add để bổ sung username và mật khẩu.

Ấn nút Add để bổ sung user. Các bạn sẽ được đưa đến bảng User DB Entry, nơi các bạn điền tên của user và mật khẩu.

Bước 7 - Điền tên và mật khẩu cho user mới trong file User DB

Điền tên vào dòng User Name, điền mật khẩu mới vào dòng New Password, điền lại mật khẩu vào dòng Retype Password. Sau đó ấn nút Save để lưu lại. User sẽ xuất hiện trong bảng User DB Entries.

Bước 8 - User đã được thêm vào User DB

Chúng ta đã thiết lập xong một realm. Giờ chúng ta sẽ áp dụng realm trong một context nhất định của virtual host.

Áp dụng realm trong context của virtual host

Các bạn chuyển sang tab Context trong phần cài đặt chi tiết của virtual host đang được điều chỉnh nhé.

Tab Context của phần cài đặt chi tiết virtual host

Tại đây, các bạn có thể ấn nút Add để tạo context mới kèm theo realm. Nếu chưa biết cách tạo context, mình đã viết trước hướng dẫn rồi.

Hoặc nếu các bạn muốn áp dụng realm trong một context đã tạo từ trước, các bạn ấn vào nút Edit (sửa) nằm ở cuối dòng ghi tên context cần áp dụng. Bảng cài đặt chi tiết context sẽ hiện ra. Như hình dưới là bảng cài đặt chi tiết cho context thuộc loại static.

Bảng thiết lập chi tiết cho static context

Tại bảng này, các bạn tìm đến dòng Realm, và chọn realm mà các bạn đã tạo.

Dòng Realm trong phần cài đặt chi tiết context

Các bạn ấn nút Save nằm ở đầu bảng thiết lập, để lưu lại thiết lập cho context.

Kiểm tra

Để toàn bộ các thiết lập về realm nãy giờ có hiệu lực, các bạn hãy khởi động lại OpenLiteSpeed. Các bạn hãy thử truy cập một đường link nằm trong context mà các bạn đã áp dụng realm.

Nếu realm thực sự được áp dụng, thì server sẽ hỏi ngay tên của user và mật khẩu. Các bạn phải nhập tên và mật khẩu thuộc realm được áp dụng cho context để truy cập. Nếu tên hoặc mật khẩu không đúng, server sẽ trả về mã lỗi HTTP 401 (không được trao quyền).


Đến đây, mình tạm dừng cuộc hành trình khám phá của mình về OpenLiteSpeed tại đây. Hiện tại mình vẫn đang tiếp tục sử dụng OpenLiteSpeed để chạy các trang web của riêng mình trong một thời gian nữa, và bắt đầu tiến hành thử nghiệm các giải pháp phần mềm server tối ưu cho nhu cầu cao hơn của mình về tốc độ và bảo mật. Khi đã có một phương pháp tối ưu, mình sẽ áp dụng chính thức tại server chạy các website của mình.

Hôm nay đã là cuối năm 2017 rồi, chúc tất cả những người đọc bài viết này một năm mới 2018 với sức khoẻ dồi dào, tươi mới, gặp nhiều thuận lợi và may mắn trong công việc cũng như cuộc sống!

Bài viết này có 2 bình luận

  1. Có cách nào để bật ssl cho 2 vhost mà dùng 2 ssl cert khác nhau (SNI SSL) không ad??

    1. Bạn bật và điều chỉnh SSL tại listener, nhưng bạn hãy để trống (không thiết lập gì) cho bảng SSL Private Key & Certificate thuộc tab SSL cũng tại listener. Tiếp đến, tại từng virtual host, bạn sẽ thay đổi riêng các bảng cũng có tên là SSL Private Key & Certificate. Lí do vì sao, bạn đọc lại phần Chọn vị trí thiết lập SSL trong bài là sẽ rõ.

Trả lời