Là một 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 đối với người truy cập là điều có giá trị, cho dù tạm thời hoặc vĩnh viễn. Mặc dù các ứng dụng web có thể cung cấp các phương thức xác thực và cấp quyền riêng, bạn cũng có thể dựa vào chính máy chủ web để hạn chế truy cập nếu những phương thức này không đầy đủ hoặc không khả dụng.
Hướng dẫn này sẽ chỉ cho bạn cách bảo vệ tài nguyên bằng mật khẩu trên máy chủ web Apache chạy trên Ubuntu 20.04. Điều này 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 tiên quyết
Để hoàn thành 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 người dùng không phải root có đặc quyền sudo
và tường lửa được bật. Bạn có thể thực hiện điều này bằng cách làm theo hướng dẫn thiết lập máy chủ ban đầu cho 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 thiết lập, hướng dẫn Cách Cài Đặt Máy Chủ Web Apache trên Ubuntu 20.04 có thể giúp bạn. Hãy chắc chắn 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ẽ sử dụng 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 với Let’s Encrypt, cung cấp chứng chỉ tin cậy miễn phí. Làm theo hướng dẫn Let’s Encrypt cho Apache để thiết lập.
● Nếu bạn không có tên miền và bạn đang sử dụng cấu hình này để kiểm tra hoặc sử dụng cá nhân, bạn có thể sử dụng chứng chỉ tự ký thay thế. Điều này cung cấp cùng loại mã hóa, nhưng không có xác thực tên miền. Làm theo hướng dẫn SSL tự ký cho Apache để thiết lập.
● Nếu bạn muốn thiết lập tên miền (tùy chọn), bạn có thể làm vậy bằng cách mua tên miền trên Namecheap, nhận miễn phí trên Freenom, hoặc sử dụng nhà đă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 đây được thiết lập cho máy chủ của bạn. Làm theo phần giới thiệu về DNS của DataOnline để biết chi tiết về cách thêm chúng.
● Một bản ghi A với your_domain
trỏ đến địa chỉ IP công khai của máy chủ của bạn.
● Một bản ghi A với www.your_domain
trỏ đến địa chỉ IP công khai của máy chủ của bạn.
Khi bạn đã hoàn thành các điều kiện tiên quyết này, hãy đăng nhập vào máy chủ của bạn với tư cách người dùng sudo
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 việc cập nhật máy chủ và cài đặt gói mà chúng ta sẽ cần. Để hoàn thành hướng dẫn này, chúng ta sẽ sử dụng một tiện ích gọi là 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 để truy cập nội dung bị hạn chế.
Đầu tiên, cập nhật chỉ mục gói của máy chủ:
sudo apt update
Sau đó cài đặt gói tiện ích Apache:
sudo apt install apache2-utils
Với gói này được cài đặt, 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 bạ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
đã 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ột mục mới trong tệp:
sudo htpasswd -c /etc/apache2/.htpasswd sammy
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ỏ đố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:
sudo htpasswd /etc/apache2/.htpasswd another_user
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 từng bản ghi:
cat /etc/apache2/.htpasswd
Output
sammy:$apr1$eponJaBR$9uyVIRpDpbHoseI.hS1cq/ another_user:$apr1$dDXiQxte$RGn3CVfFLQOPf5lSJgNvV1
Bây giờ bạn đã có 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 — Cấu hình Xác thực Mật khẩu Apache
Trong bước này, bạn cần cấu hình Apache để kiểm tra tệp .htpasswd
trước khi phục vụ nội dung được bảo vệ của bạn. Bạn có thể làm điều này theo một trong hai cách: hoặc trực tiếp trong tệp máy chủ ảo của trang web hoặc bằng cách đặt các tệp .htaccess
trong các thư mục cần hạn chế. Thông thường 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 người dùng không phải là root quản lý các hạn chế truy cập của riêng họ, tham khảo tùy chọn thứ hai để kiểm tra các hạn chế vào phiên bản kiểm soát cùng với trang web, hoặc có một ứng dụng web sử dụng các tệp .htaccess
cho các mục đích khác đã tồn tại.
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 đang hoạt động nào. Nếu bạn đang sử dụng máy chủ của riêng mình, hãy chắc chắn thay đổi bất kỳ lệnh và giá trị nào để phản ánh cấu hình của bạn.
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: Cấu hình Kiểm soát Truy cập trong Định nghĩa Máy chủ Ảo (Khuyến nghị)
Tùy chọn đầu tiên là chỉnh sửa cấu hình Apache và thêm bảo vệ mật khẩu vào tệp máy chủ ảo. Điều này thường cung cấp hiệu suất tốt hơn vì nó tránh chi phí đọc các tệp cấu hình phân tán. Tùy chọn này đòi hỏi quyền truy cập vào cấu hình, điều này không phải lúc nào cũng có sẵn, nhưng khi bạn có quyền truy cập, nó được khuyến nghị.
Bắt đầu bằng cách mở tệp máy chủ ảo mà bạn muốn thêm hạn chế. Đối với ví dụ của chúng ta, chúng ta 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 chỉnh sửa văn bản dòng lệnh như nano
:
sudo nano /etc/apache2/sites-available/your_domain.conf
Bên trong, với các bình luận bị loại bỏ, tệp sẽ trông giống như sau:
/etc/apache2/sites-available/your_domain.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost ServerName your_domain ServerAlias www.your_domain DocumentRoot /var/www/your_domain ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
Xác thực được thực hiện trên cơ sở mỗi thư mục. Để thiết lập xác thực, bạn sẽ cần nhắm mục tiêu thư mục bạn muốn hạn chế với một khối <Directory ___ >
. Trong ví dụ của chúng ta, chúng ta sẽ hạn chế toàn bộ thư mục gốc tài liệu, nhưng bạn có thể sửa đổi danh sách này để chỉ nhắm mục tiêu một thư mục cụ thể trong không gian web:
/etc/apache2/sites-available/your_domain.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost ServerName your_domain ServerAlias www.your_domain DocumentRoot /var/www/your_domain ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <Directory "/var/www/your_domain"> </Directory> </VirtualHost>
Trong khối thư mục này, chỉ định rằng bạn đang thiết lập xác thực Basic
. Đối với AuthName
, chọn một tên miền xác thực sẽ được hiển thị cho người dùng khi nhắc nhập thông tin đăng nhập. Sử dụng chỉ thị AuthUserFile
để chỉ cho Apache đến tệp mật khẩu bạn đã tạo. Cuối cùng, đặt yêu cầu rằng chỉ một valid-user
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 cho phép vào:
/etc/apache2/sites-available/your_domain.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost ServerName your_domain ServerAlias www.your_domain DocumentRoot /var/www/your_domain ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <Directory "/var/www/your_domain"> AuthType Basic AuthName "Restricted Content" AuthUserFile /etc/apache2/.htpasswd Require valid-user </Directory> </VirtualHost>
Lưu và đóng tệp khi bạn đã hoàn thành. 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
tiếp theo là Y
sau đó ENTER
.
Trước khi khởi động lại máy chủ web, bạn có thể kiểm tra cấu hình với lệnh sau:
sudo apache2ctl configtest
Nếu mọi thứ kiểm tra OK và bạn nhận được Syntax OK
làm đầu ra, bạn có thể khởi động lại máy chủ để thực hiện chính sách mật khẩu của mình:
sudo systemctl restart apache2
Vì 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
để chắc chắn rằng máy chủ đang chạy:
sudo systemctl status apache2
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: Cấu hình Kiểm soát Truy cập với Tệp .htaccess
Apache có thể sử dụng các tệp .htaccess
để cho phép một số mục cấu hình nhất định được đặt trong thư mục nội dung. Vì Apache phải đọc lại các tệp này trên mỗi yêu cầu liên quan đến thư mục, điều này có thể ảnh hưởng tiêu cực đến hiệu suất, Tùy chọn 1 được ưu tiên hơn, nhưng nếu bạn đã sử dụng tệp .htaccess
hoặc cần cho phép người dùng không phải root quản lý các hạn chế, các tệp .htaccess
là hợp lý.
Để bật bảo vệ mật khẩu bằng các tệp .htaccess
, mở tệp cấu hình Apache chính bằng trình chỉnh sửa văn bản dòng lệnh như nano
:
sudo nano /etc/apache2/apache2.conf
Tìm khối <Directory>
cho thư mục /var/www/
giữ thư mục gốc tài liệu. Cập nhật dòng này để phản ánh thư mục gốc tài liệu 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:
. . . <Directory /var/www/your_domain> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> . . .
Lưu và đóng tệp khi bạn đã hoàn thành.
Tiếp theo, thêm một tệp .htaccess
vào thư mục bạn muốn hạn chế. Trong bài diễn giải của chúng ta, chúng ta sẽ hạn chế toàn bộ thư mục gốc tài liệu (toàn bộ trang web) được đặt 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ế truy cập:
sudo nano /var/www/your_domain/.htaccess
Trong tệp này, chỉ định rằng bạn muốn thiết lập xác thực Basic
. Đối với AuthName
, chọn một tên miền xác thực sẽ được hiển thị cho người dùng khi nhắc nhập thông tin đăng nhập. Sử dụng chỉ thị AuthUserFile
để chỉ cho Apache đến tệp mật khẩu mà chúng ta đã tạo. Cuối cùng, bạn sẽ yêu cầu một valid-user
để 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 cho phép vào:
/var/www/your_domain/.htaccess
AuthType Basic AuthName "Restricted Content" AuthUserFile /etc/apache2/.htpasswd Require valid-user
Lưu và đóng tệp. Khởi động lại máy chủ web để bảo vệ mật khẩu cho tất cả nội dung trong hoặc dưới thư mục có tệp .htaccess
:
sudo systemctl restart apache2
Sau đó chạy systemctl status
để xác minh việc khởi động lại:
sudo systemctl status apache2
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ờ sẽ đượ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 thử 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ị một lời nhắc tên người dùng và mật khẩu trông giống 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 nội dung. Nếu bạn nhập thông tin đăng nhập sai hoặc nhấn “Cancel”, bạn sẽ nhận được trang lỗi “Unauthorized”:
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.
Còn nhiều điều bạn có thể làm 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 sau:
● Để 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.
● 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ề việc viết lại URL, tùy chỉnh trang lỗi như thông báo “Unauthorized” trước đó, hoặc bao gồm các yếu tố chung 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.