Posted on: 10 tháng 10 năm 2023
Khi thiết lập một máy chủ web, thường có những phần của trang web mà bạn muốn hạn chế quyền truy cập. Các ứng dụng web thường cung cấp các phương thức xác thực và ủy quyền riêng, nhưng bản thân máy chủ web có thể được sử dụng để hạn chế quyền truy cập nếu những phương thức này không đầy đủ hoặc không khả dụng.
Trong hướng dẫn này, chúng tôi sẽ trình bày cách bảo vệ tài sản bằng mật khẩu trên máy chủ web Apache chạy trên Ubuntu 14.04.
Để bắt đầu, bạn sẽ cần quyền truy cập vào môi trường máy chủ Ubuntu 14.04. Bạn sẽ cần một non-root user với đặc quyền sudo
để thực hiện các tác vụ quản trị. Để tìm hiểu cách tạo người dùng như vậy, hãy làm theo hướng dẫn thiết lập máy chủ ban đầu Ubuntu 14.04 của chúng tôi.
Để tạo tệp lưu trữ mật khẩu cần thiết để truy cập nội dung bị hạn chế của chúng tôi, chúng tôi sẽ sử dụng tiện ích có tên htpasswd
. Điều này được tìm thấy trong gói apache2-utils
trong kho Ubuntu.
Cập nhật bộ đệm gói cục bộ và cài đặt gói bằng cách gõ lệnh này. Chúng tôi sẽ nhân cơ hội này để lấy máy chủ Apache2 trong trường hợp nó chưa được cài đặt trên máy chủ:
- sudo apt-get update
- sudo apt-get install apache2 apache2-utils
Bây giờ chúng ta có quyền truy cập vào lệnh htpasswd
. Chúng ta có thể sử dụng điều này để 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. Chúng tôi sẽ tạo một tệp ẩn cho mục đích này có tên là .htpasswd
trong thư mục cấu hình /etc/apache2
của chúng tôi.
Lần đầu tiên sử dụng tiện ích này, chúng ta cần thêm tùy chọn -c
để tạo tệp được chỉ định. Chúng tôi 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ỏ đối số -c
cho bất kỳ người dùng bổ sung nào bạn muốn thêm:
- sudo htpasswd /etc/apache2/.htpasswd another_user
Nếu chúng tôi xem nội dung của tệp, chúng tôi có thể thấy 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$lzxsIfXG$tmCvCfb49vpPFwKGVsuYz.
another_user:$apr1$p1E9MeAf$kiAhneUwr.MhAE2kKGYHK.
Bây giờ chúng ta đã có một tệp chứa người dùng và mật khẩu ở định dạng mà Apache có thể đọc được, chúng ta cần định cấu hình Apache để kiểm tra tệp này trước khi phân phát nội dung được bảo vệ của mình. Chúng ta có thể làm điều này theo hai cách khác nhau.
Cách đầu tiên là chỉnh sửa cấu hình Apache và thêm bảo vệ bằng mật khẩu của chúng tôi vào tệp máy chủ ảo. Điều này thường 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 phân tán.
Nếu bạn không có khả năng sửa đổi tệp máy chủ ảo (hoặc nếu bạn đang sử dụng tệp .htaccess
cho các mục đích khác), bạn có thể hạn chế quyền truy cập bằng tệp .htaccess
. Apache sử dụng các tệp .htaccess
để cho phép đặt một số mục cấu hình nhất định trong một tệp trong thư mục nội dung. Điểm bất lợi là 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, điều này có thể ảnh hưởng đến hiệu suất.
Hãy chọn cách phù hợp nhất với nhu cầu của bạn dưới đây.
Bắt đầu bằng cách mở tệp máy chủ ảo mà bạn muốn thêm hạn chế. Trong ví dụ của chúng tôi, chúng tôi sẽ sử dụng tệp 000-default.conf
chứa máy chủ ảo mặc định được cài đặt thông qua gói apache của Ubuntu:
- sudo nano /etc/apache2/sites-enabled/000-default.conf
Bên trong, khi đã loại bỏ các nhận xét, tệp sẽ trông giống như thế này:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Việc 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 thư mục 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ộ thư mục gốc của 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 đến một thư mục cụ thể trong không gian web:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory "/var/www/html">
</Directory>
</VirtualHost>
Trong khối thư mục này, hãy chỉ định rằng chúng tôi muốn thiết lập 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 thông tin xác thực. Sử dụng lệnh AuthUserFile
để trỏ Apache tới tệp mật khẩu mà chúng tôi đã tạo. Cuối cùng, chúng tôi sẽ yêu cầu valid-user
truy cập tài nguyên này, điều đó 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:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory "/var/www/html">
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>
</VirtualHost>
Lưu và đóng tập tin khi bạn hoàn tất. Khởi động lại Apache để triển khai chính sách mật khẩu của bạn:
- sudo service apache2 restart
Thư mục bạn chỉ định bây giờ sẽ được bảo vệ bằng mật khẩu.
Nếu bạn muốn thiết lập bảo vệ bằng mật khẩu bằng tệp .htaccess
, bạn nên bắt đầu bằng cách chỉnh sửa tệp cấu hình Apache chính để cho phép tệp .htaccess
:
- sudo nano /etc/apache2/apache2.conf
Tìm khối <Directory>
cho thư mục /var/www
chứa gốc tài liệu. Bật xử lý .htaccess
bằng cách thay đổi lệnh AllowOverride
trong khối đó từ “None” thành “All”:
. . .
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
. . .
Lưu và đóng tập tin khi bạn hoàn tất.
Tiếp theo, chúng ta cần thêm tệp .htaccess
vào thư mục mà chúng ta muốn hạn chế. Trong phần trình bày của chúng tôi, chúng tôi sẽ hạn chế toàn bộ gốc tài liệu (toàn bộ trang web) dựa trên /var/www/html
, nhưng bạn có thể đặt tệp này vào bất kỳ thư mục nào bạn muốn hạn chế quyền truy cập vào:
- sudo nano /var/www/html/.htaccess
Trong tệp này, hãy chỉ định rằng chúng tôi muốn thiết lập 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 thông tin xác thực. Sử dụng lệnh AuthUserFile
để trỏ Apache tới tệp mật khẩu mà chúng tôi đã tạo. Cuối cùng, chúng tôi sẽ yêu cầu valid-user
truy cập tài nguyên này, điều đó 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:
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ệ mật khẩu tất cả nội dung trong hoặc bên dưới thư mục bằng tệp .htaccess
:
- sudo service apache2 restart
Để 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ạn sẽ thấy một dấu nhắc tên người dùng và mật khẩu trông như thế này:
Nếu bạn nhập thông tin xác thực chính xác, bạn sẽ được phép truy cập nội dung. Nếu bạn nhập sai thông tin xác thực hoặc nhấn “Cancel”, bạn sẽ thấy trang lỗi “Unauthorized”:
Bây giờ bạn sẽ có mọi thứ bạn cần để thiết lập xác thực cơ bản cho trang web của mình. Hãy nhớ rằng việc bảo vệ bằng mật khẩu phải được kết hợp với mã hóa SSL để thông tin xác thực của bạn không được gửi đến máy chủ ở dạng văn bản thuần túy. Để tìm hiểu cách tạo chứng chỉ SSL tự ký để sử dụng với Apache, hãy làm theo hướng dẫn Cách tạo chứng chỉ SSL trên Apache cho Ubuntu 14.04. Để tìm hiểu cách cài đặt chứng chỉ thương mại, hãy làm theo hướng dẫn Cách cài đặt chứng chỉ SSL từ cơ quan cấp chứng chỉ thương mại (CCA).