Khi thiết lập máy chủ web, thường có các 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 của riêng chú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, bạn sẽ bảo vệ tài sản bằng mật khẩu trên máy chủ web Nginx chạy trên Ubuntu 20.04.
Để bắt đầu, bạn sẽ cần:
sudo
để thực hiện các tác vụ quản trị. Để tìm hiểu cách tạo một 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 của Ubuntu 20.04.Để bắt đầu, bạn cần tạo một tệp chứa tổ hợp tên người dùng và mật khẩu của mình. Bạn có thể làm điều này bằng cách sử dụng các tiện ích OpenSSL có thể đã có sẵn trên máy chủ của bạn. Ngoài ra, bạn có thể sử dụng tiện ích htpasswd
chuyên dụng có trong gói apache2-utils
(các tệp mật khẩu Nginx sử dụng cùng định dạng với Apache). Chọn phương pháp dưới đây mà bạn thích nhất.
Nếu bạn đã cài đặt OpenSSL trên máy chủ của mình, bạn có thể tạo tệp mật khẩu mà không cần gói bổ sung. Bạn sẽ tạo một tệp ẩn có tên .htpasswd
trong thư mục cấu hình /etc/nginx
để lưu trữ kết hợp tên người dùng và mật khẩu của bạn.
Bạn có thể thêm tên người dùng vào tệp bằng lệnh này. sammy
được sử dụng ở đây làm tên người dùng, nhưng bạn có thể sử dụng bất kỳ tên nào bạn muốn:
- sudo sh -c "echo -n 'sammy:' >> /etc/nginx/.htpasswd"
Tiếp theo, thêm mục nhập mật khẩu được mã hóa cho tên người dùng bằng cách nhập:
- sudo sh -c "openssl passwd -apr1 >> /etc/nginx/.htpasswd"
Bạn có thể lặp lại quy trình này để có thêm tên người dùng. Bạn có thể xem cách tên người dùng và mật khẩu được mã hóa được lưu trữ trong tệp bằng cách nhập:
- cat /etc/nginx/.htpasswd
Outputsammy:$apr1$wI1/T0nB$jEKuTJHkTOOWkopnXqC1d1
Mặc dù OpenSSL có thể mã hóa mật khẩu để xác thực Nginx, nhiều người dùng thấy việc sử dụng tiện ích được xây dựng có mục đích dễ dàng hơn. Tiện ích htpasswd
, được tìm thấy trong gói apache2-utils
, phục vụ tốt chức năng này.
Cài đặt gói apache2-utils
trên máy chủ của bạn bằng cách gõ:
- sudo apt update
- sudo apt install apache2-utils
Bây giờ, bạn có quyền truy cập vào lệnh htpasswd
. Bạn có thể sử dụng điều này để tạo một tệp mật khẩu mà Nginx có thể sử dụng để xác thực người dùng. 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/nginx
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 được chỉ định. 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/nginx/.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:
- sudo htpasswd /etc/nginx/.htpasswd another_user
Nếu bạn xem nội dung của tệp, bạn có thể thấy tên người dùng và mật khẩu được mã hóa cho từng bản ghi:
- cat /etc/nginx/.htpasswd
Outputsammy:$apr1$lzxsIfXG$tmCvCfb49vpPFwKGVsuYz.
another_user:$apr1$p1E9MeAf$kiAhneUwr.MhAE2kKGYHK.
Bây giờ bạn có một tệp chứa người dùng và mật khẩu ở định dạng mà Nginx có thể đọc, bạn cần định cấu hình Nginx để kiểm tra tệp này trước khi cung cấp nội dung được bảo vệ của bạn.
Bắt đầu bằng cách mở tệp cấu hình khối máy chủ mà bạn muốn thêm hạn chế vào. Ví dụ của bạn, bạn sẽ sử dụng tệp khối máy chủ default
được cài đặt thông qua gói Nginx của Ubuntu:
- sudo nano /etc/nginx/sites-enabled/default
Để thiết lập xác thực, bạn cần quyết định bối cảnh cần hạn chế. Trong số các lựa chọn khác, Nginx cho phép bạn đặt các hạn chế ở cấp độ máy chủ hoặc bên trong một vị trí cụ thể.
Ví dụ này sẽ dành cho giới hạn ở cấp độ máy chủ. Lệnh auth_basic
bật xác thực và tên miền sẽ được hiển thị cho người dùng khi nhắc nhập thông tin đăng nhập. Bạn sẽ sử dụng chỉ thị auth_basic_user_file
để trỏ Nginx đến tệp mật khẩu bạn đã tạo:
server {
listen 80 default_server;
. . .
auth_basic "Restricted Content";
auth_basic_user_file /etc/nginx/.htpasswd;
}
Lưu ý: Tùy thuộc vào khối mà bạn đặt các hạn chế, bạn có thể kiểm soát mức độ chi tiết của những phần nào trên trang web của bạn yêu cầu mật khẩu. Ví dụ thay thế này chỉ hạn chế thư mục gốc có khối vị trí và thậm chí 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:
server {
listen 80 default_server;
. . .
location / {
try_files $uri $uri/ =404;
auth_basic "Restricted Content";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
Lưu và đóng tệp khi bạn hoàn tất. Khởi động lại Nginx để thực hiện chính sách mật khẩu của bạn:
- sudo systemctl restart nginx
Thư mục bạn đã chỉ định bây giờ sẽ đượ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 thử truy cập nội dung bị hạn chế của bạn trong trình duyệt web:
http://server_domain_or_IP
Bạn sẽ được cung cấp lời nhắc tên người dùng và mật khẩu:
Nếu bạn nhập đúng thông tin đăng nhập, bạn sẽ được phép truy cập nội dung. Nếu bạn nhập sai thông tin đăng nhập hoặc nhấn “Cancel”, bạn sẽ thấy trang lỗi “Authorization Required”:
Bây giờ bạn đã có mọi thứ cần thiết để thiết lập xác thực cơ bản cho trang web của mình. Hãy nhớ rằng bảo vệ bằng mật khẩu nên được kết hợp với mã hóa TLS để thông tin đăng nhập của bạn không được gửi đến máy chủ ở dạng văn bản thuần túy. Hãy xem hướng dẫn này về cách bảo mật Nginx với Let's Encrypt trên Ubuntu 20.04