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.
Để thực hiện theo hướng dẫn này, bạn sẽ cầ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. /etc/apache2/sites-available/your_domain.conf
cho tệp máy chủ ảo.your_domain
trỏ đến địa chỉ IP chung của máy chủ của bạn.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.
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:
- sudo apt update
Sau đó cài đặt gói tiện ích Apache:
- sudo apt install apache2-utils
Với cài đặt này, bây giờ bạn có quyền truy cập vào lệnh htpasswd
.
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:
- 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ỏ 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:
- 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 mỗi bản ghi:
- cat /etc/apache2/.htpasswd
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.
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 đầ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
:
sudo nano /etc/apache2/sites-available/your_domain.conf
Ở bên trong, với các nhận xét bị loại bỏ, tệp sẽ trông giống như sau:
<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ở 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:
<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, 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:
<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>n3
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:
- sudo apache2ctl configtest
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:
- sudo systemctl restart apache2
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:
- 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.
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
:
- sudo nano /etc/apache2/apache2.conf
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:
. . .
<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 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:
sudo nano /var/www/your_domain/.htaccess
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:
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
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
:
- sudo systemctl restart apache2
Sau đó chạy systemctl status
để xác minh khởi động lại thành công:
- 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ờ đã được bảo vệ bằng 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):
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: