Hướng dẫn cấu hình Basic Authentication cho Nginx trên Ubuntu

Hướng dẫn cấu hình Basic Authentication cho Nginx trên Ubuntu

1. Giới thiệu

Khi quản trị website sẽ có lúc bạn muốn giới hạn người dùng truy cập vào một phần hoặc toàn bộ trang web. Ví dụ một website đang được xây dựng, bạn muốn chỉ bạn và khách hàng có thể truy cập được. Giải pháp đơn gian nhất là sử dụng Basic Authentication. Các framework, cms dùng để xây dựng website hiện nay đều cung cấp giải pháp xác thực Basic Authentication. Nếu website của bạn không hỗ trợ thì bạn có thể cấu hình webserver để thực hiện điều này.

Trong hướng dẫn này, chúng tôi sẽ hướng dẫn cách cấu hình Basic Authentication cho Nginx trên Ubuntu để bảo vệ trang web bằng cách yêu cầu cung tài khoản và mật khẩu.

2. Yêu cầu

Để bắt đầu, bạn cần truy cập vào môi trường máy chủ Ubuntu thông qua ssh. Bạn cần một tài khoản không phải là tài khoản quản trị (non-root) nhưng có quyền sudo để thực hiện các bước cấu hình.

Nếu máy chủ chưa có Nginx, hãy cài đặt Nginx bằng các lệnh sau:

sudo apt-get update
sudo apt-get install nginx

3. Tạo Tài Khoản Và Mật Khẩu

Để bắt đầu, chúng ta cần tạo tệp chứa các cặp tài khoản và mật khẩu. Bạn có thể làm điều này bằng cách sử dụng tiện ích OpenSSL có thể có sẵn trên máy chủ. Hoặc bạn có thể sử dụng tiện ích htpasswd của gói apache2-utils (tuy của Apache nhưng Nginx vẫn dùng được). Hãy chọn một trong hai phương pháp dưới đây:

3.1 Tạo Tài Khoản Và Mật Khẩu Bằng Tiện Ích OpenSSL

Nếu bạn đã cài đặt OpenSSL trên máy chủ của bạn, bạn có thể tạo tệp mật khẩu mà không cần các gói bổ sung. Chúng ta 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ữ các cặp tài khoản và mật khẩu của chúng ta.

Bạn có thể thêm một tài khoản vào tệp bằng lệnh bên dưới. Chúng tôi sử dụng "client10" làm tên tài khoản, 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 'client10:' >> /etc/nginx/.htpasswd"

Tiếp theo, tạo một mật khẩu đã mã hóa cho tên người dùng bằng cách gõ:

sudo sh -c "openssl passwd -apr1 >> /etc/nginx/.htpasswd"

Bạn sẽ được yêu cầu nhập mật khẩu và xác nhận mật khẩu. Sau khi nhập mật khẩu xong bạn có thể xem thành quả của mình trong tệp .htpasswd bằng cách gõ:

cat /etc/nginx/.htpasswd

3.2 Tạo Tệp Mật Khẩu Sử Dụng Tiện Ích htpasswd

Mặc dù OpenSSL có thể mã hóa mật khẩu cho xác thực Nginx, nhiều người lại thích dùng tiện ích httpasswd hơn vì tính dễ dùng của nó. Tiện ích htpasswd có trong gói apache2-utils vì vậy bạn cần cài đặt gói apache2-utils trên máy chủ của bạn bằng cách gõ:

sudo apt-get update
sudo apt-get install apache2-utils

Bây giờ, bạn đã có thể sử dụng lệnh htpasswd. Chúng ta có thể sử dụng nó để 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. Chúng tôi sẽ tạo một tệp ẩn cho mục đích này có tên .htpasswd trong thư mục cấu hình /etc/nginx.

Lần đầu tiên chúng ta sử dụng tiện ích này, chúng ta cần thêm tham số -c để tạo tệp được chỉ định. Chúng ta chỉ định một tài khoản (trong ví dụ này tôi đặt là clien10) ở cuối lệnh để tạo một mục mới trong tệp:

sudo htpasswd -c /etc/nginx/.htpasswd client10

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.

Với những tài khoản tiếp theo bạn không cần sử dụng tham số -c:

sudo htpasswd /etc/nginx/.htpasswd another_user

Ok giờ là lúc kiểm tra thành quả bằng lệnh:

cat /etc/nginx/.htpasswd

4. Cấu hình Xác Thực Mật Khẩu Nginx 

Bây giờ chúng ta có một tệp chứa tài khoản và mật khẩu dưới định dạng mà Nginx có thể đọc, chúng ta cần cấu hình Nginx để kiểm tra tệp này trước khi cho phép chúng ta truy cập vào website.

Bắt đầu bằng cách mở tệp cấu hình nginx của website mà bạn muốn giới hạn truy cập. Trong ví dụ của chúng tôi, chúng tôi sẽ sử dụng tệp cấu hình mặc định của Nginx:

sudo nano /etc/nginx/sites-enabled/default

Nội dung tệp cấu hình lúc đầu như sau:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /usr/share/nginx/html;
    index index.html index.htm;

    server_name localhost;

    location / {
        try_files $uri $uri/ =404;
    }
}

Bạn cần xác định phạm vi giới hạn truy cập. Có thể là toàn bộ website hoặc chỉ một phần ( chẳng hạn chỉ phần quản trị /admin). Trong ví dụ của chúng tôi, chúng tôi sẽ giới hạn toàn bộ trang web:

Chúng ta cần thêm 2 dòng cấu hình cho location / là auth_basic để bật xác thực và auth_basic_user_file để Nginx biết tệp lưu thông tin xác thực:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /usr/share/nginx/html;
    index index.html index.htm;

    server_name localhost;

    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 thành. Khởi động lại Nginx để triển khai chính sách mật khẩu của bạn:

sudo service nginx restart

Ok giời là lúc kiểm tra thành quả. Bạn truy cập vào website nếu thấy bật ra popup yêu cầu nhập tài khoản và mật khẩu thì việc cấu hình đã ok. Tuy nhiên để chắc chắn mọi thứ hoạt động trơn chu thì bạn cần nhập tài khoản và mật khẩu vào xem có truy câp được website không.

5. Kết luận 

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 luôn bảo vệ thông tin tài khoản và mật khẩu bằng cách sử dụng chứng chỉ SSL (hay còn gọi là https) để thông tin đăng nhập của bạn không được gửi đến máy chủ dưới dạng văn bản thô. Nếu website của bạn chưa triển khai SSL bạn có thể tham khảo bảng giá dịch vụ SSL của chúng tôi.