Giới thiệu
Với tư cách là quản trị viên web, bạn có thể thấy việc hạn chế một số phần của trang web khỏi khách truy cập, cho dù tạm thời hay lâu dài đều rất hữu ích. Mặc dù các ứng dụng web có thể cung cấp các phương pháp xác thực và ủy quyền của riêng chúng, nhưng bạn cũng có thể dựa vào chính máy chủ web để hạn chế quyền truy cập nếu các phương thức này không đủ hoặc không khả dụng.
Bài viết này sẽ hướng dẫn bạn các nội dung bảo vệ bằng mật khẩu trên máy chủ web Apache chạy trên Ubuntu 20.04. Nó sẽ cung cấp cho máy chủ của bạn một lớp bảo mật bổ sung.
Điều kiện
Để thực hiện theo hướng dẫn này, bạn sẽ cần:
- Một máy chủ Ubuntu 20.04 được thiết lập với non-root user có đặc quyền
sudo
và tường lửa được bật. Bạn có thể thực hiện việc này bằng cách làm theo Hướng dẫn thiết lập máy chủ ban đầu Ubuntu 20.04. - Máy chủ web Apache được cài đặt trên máy chủ Ubuntu của bạn. Nếu bạn chưa cài đặt, bạn có thể tham khảo hướng dẫn Cách cài đặt máy chủ web Apache trên Ubuntu 20.04. Đảm bảo hoàn thành Bước 5 và có một tệp máy chủ ảo cho tên miền của bạn. Hướng dẫn này sẽ đề cập đến your_domain làm ví dụ xuyên suốt và sử dụng
/etc/apache2/sites-available/your_domain.conf
cho tệp máy chủ ảo. - Máy chủ ảo của bạn được bảo mật bằng SSL. Việc thiết lập này phụ thuộc vào việc bạn có tên miền cho trang web của mình hay không.
- Nếu bạn có tên miền, bạn có thể bảo mật trang web của mình bằng Let’s Encrypt, đây là công cụ cung cấp các chứng chỉ miễn phí đáng tin cậy. Làm theo Hướng dẫn Let’s Encrypt cho Apache để cài đặt nó.
- Nếu bạn không có miền và bạn đang sử dụng cấu hình này để thử nghiệm hoặc sử dụng cho mục đích cá nhân, bạn có thể sử dụng chứng chỉ tự ký (self-signed certificate) để thay thế. Nó cung cấp cùng một loại mã hóa, nhưng không có xác thực tên miền. Hãy làm theo Hướng dẫn SSL tự ký (self-signed SSL) cho Apache để cài đặt.
- Nếu bạn muốn thiết lập một tên miền (tùy chọn), bạn có thể mua một tên miền trên Namecheap, nhận một tên miền miễn phí trên Freenom hoặc sử dụng công ty đăng ký tên miền mà bạn chọn. Ngoài ra, bạn sẽ cần cả hai bản ghi DNS sau để thiết lập cho máy chủ của mình. Làm theo bài Giới thiệu về CloudFly DNS để biết chi tiết về cách thêm chúng.
- Một bản ghi với
your_domain
trỏ đến địa chỉ IP chung của máy chủ của bạn. - Một bản ghi có
www.your_domain
trỏ đến địa chỉ IP chung của máy chủ của bạn.
Khi bạn đã hoàn thành các điều kiện này, hãy đăng nhập vào máy chủ của bạn với tư cách là sudo
user và tiếp tục với bước đầu tiên.
Bước 1: Cài đặt Gói tiện ích Apache
Hãy bắt đầu bằng cách cập nhật máy chủ và cài đặt một gói mà chúng ta sẽ cần. Để hoàn thành theo hướng dẫn này, chúng ta sẽ sử dụng tiện ích có tên htpasswd
, một phần của gói apache2-utils
, để tạo tệp và quản lý tên người dùng và mật khẩu cần thiết và truy cập nội dung bị hạn chế.
Trước tiên, hãy cập nhật gói mục lục của máy chủ bạn:
Sau đó cài đặt gói tiện ích Apache:
Với cài đặt này, bây giờ bạn có quyền truy cập vào lệnh htpasswd
.
Bước 2: Tạo tệp mật khẩu
Lệnh htpasswd
cho phép bạn tạo một tệp mật khẩu mà Apache có thể sử dụng để xác thực người dùng. Bạn sẽ tạo một tệp ẩn cho mục đích này gọi là .htpasswd
trong thư mục cấu hình/etc/apache2
của bạn.
Lần đầu tiên sử dụng tiện ích này, bạn cần thêm tùy chọn -c
để tạo tệp .htpasswd
được chỉ định. Ở đây, chúng ta chỉ định tên người dùng (sammy
trong ví dụ này) ở cuối lệnh để tạo mục nhập mới trong tệp:
Bạn sẽ được yêu cầu cung cấp và xác nhận mật khẩu cho người dùng.
Bỏ qua đối số -c
cho bất kỳ người dùng bổ sung nào bạn muốn thêm như trong ví dụ sau để bạn không ghi đè lên tệp:
Nếu bạn kiểm tra nội dung của tệp, nó sẽ chứa tên người dùng và mật khẩu được mã hóa cho mỗi bản ghi:
Outputsammy:$apr1$eponJaBR$9uyVIRpDpbHoseI.hS1cq/
another_user:$apr1$dDXiQxte$RGn3CVfFLQOPf5lSJgNvV1
Bây giờ bạn có tên người dùng và mật khẩu của mình ở định dạng mà Apache có thể đọc được.
Bước 3: Thiết lập cấu hình xác thực mật khẩu Apache
Trong bước này, bạn cần thiết lập cấu hình Apache để kiểm tra tệp .htpasswd
trước khi cung cấp nội dung được bảo vệ của bạn. Bạn có thể thực hiện việc này theo một trong hai cách: làm trực tiếp trong tệp máy chủ ảo của trang web, hoặc bằng cách đặt tệp .htaccess
vào các thư mục cần hạn chế. Nói chung, tốt nhất là sử dụng tệp máy chủ ảo, nhưng nếu bạn cần cho phép non-root users quản lý các hạn chế truy cập riêng, hãy tham khảo lựa chọn thứ hai để kiểm tra các hạn chế trong kiểm soát phiên bản cùng với trang web, hoặc có một ứng dụng web sử dụng các tệp .htaccess
cho những mục đích khác.
Lưu ý: Bạn có thể thực hiện các tùy chọn sau cho bất kỳ máy chủ ảo nào đang hoạt động. Nếu bạn đang sử dụng máy chủ ảo của riêng mình, hãy đảm bảo thay đổi bất kỳ các lệnh và giá trị nào để phản ánh cấu hình của bạn.
Hãy chọn tùy chọn phù hợp nhất với nhu cầu của bạn.
Tùy chọn 1: Thiết lập cấu hình Kiểm soát truy cập trong Định nghĩa Máy chủ Ảo (Ưu tiên)
Tùy chọn đầu tiên là chỉnh sửa cấu hình Apache và thêm mật khẩu bảo vệ vào tệp máy chủ ảo. Điều này sẽ mang lại hiệu suất tốt hơn vì nó tránh được chi phí đọc các tệp cấu hình (configuration files) phân tán. Tùy chọn này yêu cầu quyền truy cập vào cấu hình, không phải lúc nào cũng có sẵn, nhưng khi bạn có quyền truy cập, bạn nên sử dụng nó. Bắt đầu bằng cách mở tệp máy chủ ảo mà bạn muốn thêm hạn chế vào. Đối với ví dụ của chúng tôi, chúng tôi sẽ sử dụng tệp/etc/apache2/sites-available/your_domain.conf
chứa máy chủ ảo. Mở tệp bằng trình soạn thảo văn bản dòng lệnh như là nano
:
Ở bên trong, với các nhận xét bị loại bỏ, tệp sẽ trông giống như sau:
Xác thực được thực hiện trên cơ sở từng thư mục. Để thiết lập xác thực, bạn sẽ cần nhắm mục tiêu vào thư mục mà bạn muốn hạn chế bằng khối <Directory ___>
. Trong ví dụ của chúng tôi, chúng tôi sẽ hạn chế toàn bộ tài liệu gốc, nhưng bạn có thể sửa đổi danh sách này để nhắm mục tiêu vào một thư mục cụ thể trong không gian web:
Trong khối thư mục này, hãy xác định rằng bạn đang cài đặt xác thực Basic
. Đối với AuthName
, hãy chọn tên vùng sẽ được hiển thị cho người dùng khi nhắc nhở nhập thông tin đăng nhập. Sử dụng chỉ thị AuthUserFile
để trỏ Apache tới tệp mật khẩu bạn đã tạo. Cuối cùng, tạo ra một yêu cầu rằng chỉ valid-user
(người dùng hợp lệ) mới có thể truy cập tài nguyên này, có nghĩa là bất kỳ ai có thể xác minh danh tính của họ bằng mật khẩu sẽ được phép truy cập vào:
Lưu và đóng tệp khi bạn hoàn tất. Nếu bạn đang sử dụng nano
, bạn có thể làm như vậy bằng cách nhấn CTRL + X
, sau đó nhấn Y
rồi ENTER
.
Trước khi khởi động lại máy chủ web, bạn có thể kiểm tra cấu hình bằng lệnh sau:
Nếu mọi thứ được kiểm tra và bạn nhận được Syntax OK
ở đầu ra, bạn có thể khởi động lại máy chủ để triển khai chính sách mật khẩu của mình:
Khi systemctl
không hiển thị kết quả của tất cả các lệnh quản lý dịch vụ, hãy sử dụng lệnh status
để đảm bảo máy chủ đang chạy:
Output● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor prese>
Active: active (running) since Fri 2022-04-29 17:12:24 UTC; 4s ago
Docs: https://httpd.apache.org/docs/2.4/
Process: 4493 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SU>
Main PID: 4514 (apache2)
Tasks: 55 (limit: 9508)
Memory: 5.8M
CGroup: /system.slice/apache2.service
├─4514 /usr/sbin/apache2 -k start
├─4516 /usr/sbin/apache2 -k start
└─4517 /usr/sbin/apache2 -k start
Bây giờ, thư mục bạn chỉ định sẽ được bảo vệ bằng mật khẩu.
Tùy chọn 2: Thiết lập cấu hình Kiểm soát truy cập bằng tệp .htaccess
Apache có thể sử dụng các tệp .htaccess
để cho phép các mục cấu hình nhất định được đặt trong một thư mục nội dung. Vì Apache phải đọc lại các tệp này theo mọi yêu cầu liên quan đến thư mục, nó có thể ảnh hưởng tiêu cực đến hiệu suất, nên Tùy chọn 1 được ưu tiên hơn, nhưng nếu bạn đang sử dụng tệp .htaccess
hoặc cần cho phép non-root users quản lý các hạn chế, các tệp .htaccess
sẽ giúp bạn thực hiện đơn giản hơn.
Để cho phép tính năng bảo vệ mật khẩu sử dụng tệp .htaccess
, hãy mở tệp cấu hình Apache chính bằng trình soạn thảo văn bản dòng lệnh như nano
:
Tìm khối <Directory>
cho thư mục /var/www/
chứa tài liệu gốc. Cập nhật dòng này để phản ánh tài liệu gốc của bạn. Tiếp theo, bật xử lý .htaccess
bằng cách thay đổi chỉ thị AllowOverride
trong khối đó từ None
thành All
. Nội dung của khối <Directory>
này bây giờ sẽ đọc như sau:
Lưu và đóng tệp khi bạn hoàn tất.
Tiếp theo, thêm tệp .htaccess
vào thư mục bạn muốn hạn chế. Trong phần trình bày này, chúng tôi sẽ hạn chế toàn bộ tài liệu gốc (toàn bộ trang web) có tại /var/www/your_domain
, nhưng bạn có thể đặt tệp này trong bất kỳ thư mục nào mà bạn muốn hạn chế quyền truy cập:
Trong tệp này, xác định rằng bạn muốn cài đặt xác thực Basic
. Đối với AuthName
, hãy chọn tên vùng sẽ được hiển thị cho người dùng khi nhắc nhở nhập thông tin đăng nhập. Sử dụng chỉ thị AuthUserFile
để trỏ Apache tới tệp mật khẩu mà chúng tôi đã tạo. Cuối cùng, bạn sẽ yêu cầu valid-user
(người dùng hợp lệ) truy cập tài nguyên này, có nghĩa là bất kỳ ai có thể xác minh danh tính của họ bằng mật khẩu sẽ được phép vào:
Lưu và đóng tập tin. Khởi động lại máy chủ web để bảo vệ bằng mật khẩu tất cả nội dung trong hoặc dưới thư mục có tệp .htaccess
:
Sau đó chạy systemctl status
để xác minh khởi động lại thành công:
Output● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor prese>
Active: active (running) since Fri 2022-04-29 17:18:17 UTC; 3s ago
Docs: https://httpd.apache.org/docs/2.4/
Process: 4721 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SU>
Main PID: 4744 (apache2)
Tasks: 55 (limit: 9508)
Memory: 5.9M
CGroup: /system.slice/apache2.service
├─4744 /usr/sbin/apache2 -k start
├─4745 /usr/sbin/apache2 -k start
└─4746 /usr/sbin/apache2 -k start
Thư mục bạn đã chỉ định bây giờ đã được bảo vệ bằng mật khẩu.
Bước 4: Xác nhận xác thực mật khẩu
Để xác nhận rằng nội dung của bạn được bảo vệ, hãy cố gắng truy cập nội dung bị hạn chế của bạn trong trình duyệt web bằng cách điều hướng đến https://your_domain_or_server_IP
.
Bạn sẽ được hiển thị lời nhắc tên người dùng và mật khẩu như sau:
Nếu bạn nhập thông tin đăng nhập chính xác, bạn sẽ được phép truy cập vào nội dung. Nếu bạn nhập sai thông tin đăng nhập hoặc nhấn "Cancel" (Hủy), bạn sẽ nhận được trang lỗi "Unauthorized" (Không được phép):
Kết luận
Bây giờ bạn đã thiết lập xác thực cơ bản cho trang web của mình.
Bạn có thể làm nhiều hơn thế nữa với cấu hình Apache và .htaccess
. Để tìm hiểu thêm về tính linh hoạt và sức mạnh có sẵn trong cấu hình Apache, hãy thử một trong các hướng dẫn dưới đây:
- Để hiểu rõ hơn về tệp cấu hình chính, hãy đọc phần Làm quen với các tệp và thư mục Apache quan trọng trong hướng dẫn cài đặt Apache của chúng tôi.
- Tìm hiểu thêm về Cách thiết lập tệp máy chủ ảo trong Apache
- Tìm hiểu về cách viết lại URL, tùy chỉnh các trang lỗi như thông báo “Unauthorized" (Không được phép) trước đó hoặc bao gồm các yếu tố phổ biến trên tất cả các trang của bạn với Server Side Includes trong hướng dẫn Cách Sử dụng Tệp .htaccess của chúng tôi.