0

Cấu hình BasicAuthentication + SSL trong Webserver Apache

Webserver Apache đã quá quen thuộc với các lập trình viên web rồi nên mình sẽ không giới thiệu về nó nữa mà sẽ đi thẳng vào phần cài đặt luôn. Bạn nào chưa biết thì có thể google với từ khóa Webserver Apache để tìm hiểu thêm nhé 😃

I - Cài đặt :

Apache server có thể cài đặt trên cả Windows, Mac OSX và Linux. Trong bài viết này mình sẽ sử dụng Linux cụ thể là Ubuntu server 16.04 làm môi trường triển khai. Các bạn lưu ý là 1 vài lệnh hoặc đường dẫn của các file hệ thống có thể khác nhau đối với các bản OS khác nhau nhé.

  • Cài đặt Apache server :
[email protected]:~$ sudo apt-get update
[email protected]:~$ sudo apt-get install apache2

Sau khi cài đặt hoàn thành, bạn có thể dùng lệnh apache2 -v để xem phiên bản apache đã được cài đặt hoặc có thể mở trình duyệt và truy cập vào localhost để xem kết quả.

[email protected]:~$ apache2 -v
Server version: Apache/2.4.18 (Ubuntu)
Server built:   2016-07-14T12:32:26

Lệnh để quản lý server apache :

test@ubuntu:~$ sudo service apache2 [command]

Thẻ command bao gồm các lệnh restart, stop, start, status ....

II - Basic Authentication :

Apache cung cấp 2 khả năng xác thực người dùng là Basic authentication và Digest authentication. Trong đó, Digest authentication được đánh giá là an toàn hơn nhưng lại ít được phát triển. Cách xác thực được sử dụng phổ biến với các Web server Apache hiện nay là basic authentication, cách xác thực này sử dụng 64 bit để mã hóa tên tài khoản và mật khẩu trước khi gửi đến server.

Các thông tin về tên tài khoản và mật khẩu được tạo bằng chương trình htpasswd. Các thông tin này sẽ được lưu vào một file text với truờng mật khẩu đã được mã hoá và khi cần xác thực người dùng Apache sẽ giải mã mật khẩu mà người dùng cung cấp sau đó mang so sánh với mật khẩu lưu trữ. Cú pháp của câu lệnh htpasswd như sau:

htpasswd [options] pwfile username [password]

Các options bao gồm:

m: Chọn thuật toán mã hoá mật khẩu là MD5.

d: Dùng thuật toán mã hoá của hệ thống để mã hóa mật khẩu.

s: Mã hóa mật khẩu theo thuật toán SHA.

b: Nhập mật khẩu trực tiếp vào dòng lệnh.

c: Mặc định htpasswd hiểu rằng file chứa tài khoản và mật khẩu (pwfile) đã tồn tại. Vì vậy để tạo một file mới bạn phải sử dụng tuỳ chọn -c.

Các tham số khác của lệnh

pwfile: Là tên file lưu trữ tên tài khoản và mật khẩu.

username: Tên tài khoản cần tạo.

password: Mật khẩu của tài khoản tương ứng (chỉ sử dụng khi có option là -b).

Ví dụ cụ thể mình sẽ tạo 1 tài khoản là admin1 với mật khẩu là 123456 lưu vào 1 file tên là user

[email protected]:~$ sudo htpasswd -cb /etc/apache2/user admin1 123456

Kết quả lệnh trên sẽ tạo ra file user lưu ở /etc/apache2/user chứa thông tin tài khoản admin1. Lưu ý là tùy chọn -c chỉ sử dụng lần đầu để tạo file user. Trường hợp bạn đã có 1 sẵn 1 file lưu thông tin các tài khoản rồi thì không phải thêm tùy chọn -c nữa.

Sau khi đã khai báo các tài khoản. Chúng ta sẽ tiến hành cấu hình để yêu cầu người dùng khi truy cập vào trang web của bạn phải có tên tài khoản và mật khẩu đã tạo ở trên.

File cấu hình của apache trong ubuntu là file apache2.conf được đặt ở /etc/apache2/ .Lưu ý là trên CentOS hoặc 1 bản Distro nào khác của Linux có thể khác nhé.

Để chỉnh sửa file apache2.conf, chúng ta có thể dùng các công cụ soạn thảo trong linux như vi, nano và tất nhiên là phải sử dụng với quyền super user. Ở đây mình sẽ dùng nano.

[email protected]:/etc/apache2/user$ sudo nano /etc/apache2/apache2.conf

Sau khi mở file lên. Các bạn thêm vào file config của apache đoạn command sau :

<Directory "/var/www/html/">
      AuthName "Free description"
      AuthType Basic
      AuthUserFile /etc/apache2/user
      Require valid-user
</Directory>

Lưu lại và thoát ra. Nhớ restart lại apache nhé.

Sau khi restart apache, các bạn truy cập vào lại localhost. Lúc này sẽ hiển thị ra 1 cửa sổ yêu cầu nhập user/pass là các bạn đã thành công ^^.

Lưu ý phần tùy chọn <Directory "/var/www/html/"> Nếu trang web của bạn đặt ở đâu thì thay đổi đường dẫn tương ứng về đó nhé. Nó sẽ tương ứng với DocumentRoot trong apache.

Để thay đổi DocumentRoot apache, các bạn vào edit file /etc/apache2/sites-available/000-default.conf. Đường dẫn này có thể khác nếu các bạn dùng CentOS hoặc 1 bản Linux nào khác nhé.

III - Secure Sockets Layer (SSL) :

Đây là một tiêu chuẩn an ninh công nghệ toàn cầu tạo ra một liên kết giữa máy chủ web và trình duyệt. Liên kết này đảm bảo tất cả dữ liệu trao đổi giữa máy chủ web và trình duyệt luôn được bảo mật và an toàn.

Ý tưởng của kỹ thuật này là sẽ có 1 bên thứ 3 đáng tin cậy cung cấp 1 bộ chứng chỉ cho một website(domain name). Mỗi chứng chỉ SSL là duy nhất đối với 1 domain name. Khi người dùng truy cập vào 1 trang web có đăng ký và sử dụng SSL. Trình duyệt web ngay lập tức sẽ kiểm tra chứng chỉ SSL của trang web đó có "đáng tin" hay không. Nếu có thì nó sẽ cho phép truy cập đến trang web đó. Lúc này trang web kia cũng sẽ gửi đến trình duyệt 1 bộ khóa dùng để mã hóa và giải mã các dữ liệu trong suốt quá trình tương tác.

Thường thì các nhà quản trị web sẽ đi xin (đúng hơn là mua @@) các chứng chỉ SSL này từ bên thứ 3 nào đó để sử dụng. Tất nhiên thằng thứ 3 cấp chứng chỉ SSL kia phải là thằng có uy tín trong lĩnh vực bảo mật. Có thể kể ra như Symantec. Các chứng chỉ này đều có thời hạn sử dụng.

Trong hướng dẫn này, vì chúng ta không có domain cũng như ko có tiền mua cái chứng chỉ SSL nào nên mình sẽ hướng dẫn các bạn tự tạo 1 chứng chỉ SSL, gọi là Self-Signed SSL Certificat, một hình thức tự sướng không hơn không kém ^^.

Về cách sử dụng cũng như cấu hình thì giống như 1 chứng chỉ "xịn" chỉ khác ở cách sở hữu. Cái xịn bạn đi mua và người ta cấp cho, còn hàng rỏm thì mình tự tạo.

Bước 1: kích hoạt chế độ SSL trong apache

sudo a2enmod ssl

Sau khi kích hoạt thì nhớ sudo service apache2 restart.

Bước 2: Tự tạo một Self-Signed SSL Certificate ( tự sướng =)) )

  • Đầu tiên bạn tạo một thư mục chứa key (key xịn mua về cũng nên làm thế để dễ quản lý ý mờ)
sudo mkdir /etc/apache2/ssl
  • Chạy lệnh tự gen SSL key :
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt

Câu lệnh trên sẽ tạo ra 1 bộ key SSL gồm 2 file apache.crtapache.key lưu ở /etc/apache2/ssl/ với hạn sử dụng là 365 ngày.

Khi bấm ENTER để chạy câu lệnh tự gen key. Hệ thống sẽ trả ra 1 hộp thoại tương tác để bạn điền các thông tin về cái key sắp được tạo ra. Đầy đủ các thông tin như sau :

Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Your Company
Organizational Unit Name (eg, section) []:Department of Kittens
Common Name (e.g. server FQDN or YOUR name) []:your_domain.com
Email Address []:[email protected]

Đối với 1 bộ key SSL "tự sướng" thì các thông tin trên bạn điền thế nào cũng được trừ dòng Common Name (e.g. server FQDN or YOUR name) []: Bạn phải điền chính xác domain của mình hoặc IP máy chủ host web.

Trong trường hợp mình làm thì mình sử dụng máy ảo VMWere để cài Ubuntu serverApache nên mình sẽ điền IP máy ảo vào. Sau khi điền xong thì bạn sẽ thấy 2 file apache.crtapache.key xuất hiện ở /etc/apache2/ssl/.

Bước 3: Cấu hình Apache để sử dụng SSL

Để sử dụng SSL,chúng ta tiến hành chỉnh sửa file default-ssl.conf được lưu ở /etc/apache2/sites-available/. Lưu ý là apache cài trên cái bản Distro khác nhau của Linux có thể khác chỗ lưu các file config nhé.

sudo nano /etc/apache2/sites-available/default-ssl.conf

Nội dung file default-ssl.conf sau khi bỏ qua các dòng comment:

<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
        ServerAdmin [email protected]
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        SSLEngine on
        SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
        SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
        <FilesMatch "\.(cgi|shtml|phtml|php)$">
                        SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
                        SSLOptions +StdEnvVars
        </Directory>
        BrowserMatch "MSIE [2-6]" \
                        nokeepalive ssl-unclean-shutdown \
                        downgrade-1.0 force-response-1.0
        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
    </VirtualHost>
</IfModule>

Để sử dụng SSL, bạn chỉ cần lưu ý các dòng sau:

1 - DocumentRoot /var/www/html: Cũng giống như file 000-default.conf dòng này sẽ chỉ định đường dẫn lưu trang web của các bạn. Trong config của Apache server thì sẽ có 2 file chỉ định DocumentRoot đó là 000-default.confdefault-ssl.conf, thông thường 2 file đều được lưu ở cùng 1 chỗ (trong hướng dẫn của mình dùng Ubuntu server + Apache thì chúng được lưu ở /etc/apache2/sites-available/).

Chức năng của chúng thì như sau:

  • 000-default.conf sẽ cấu hình cho giao thức HTTP mặc định dùng port 80
  • default-ssl.conf sử dụng HTTPS mặc định port 443.

2 - Các dòng khai báo SSL:

        SSLEngine on
        SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
        SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
  • SSLEngine on : Khai báo sử dụng SSL.
  • SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem : Khai báo đường dẫn lưu file .crt
  • SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key : Khai báo đường dẫn lưu file .key

Lưu ý: Đối với các bạn đã sở hữu cho mình một domain name và muốn sử dụng SSL thì phải khai báo thêm 2 dòng như sau :

        ServerName your_domain.com
        ServerAlias www.your_domain.com

Hai dòng trên sẽ được thêm vào sau dòng ServerAdmin và trước dòng DocumentRoot

Nội dung file default-ssl.conf sau khi chỉnh sửa :

<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
        ServerAdmin [email protected]
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        SSLEngine on
        SSLCertificateFile /etc/apache2/ssl/apache.crt
        SSLCertificateKeyFile /etc/apache2/ssl/apache.key
        <FilesMatch "\.(cgi|shtml|phtml|php)$">
                        SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
                        SSLOptions +StdEnvVars
        </Directory>
        BrowserMatch "MSIE [2-6]" \
                        nokeepalive ssl-unclean-shutdown \
                        downgrade-1.0 force-response-1.0
        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
    </VirtualHost>
</IfModule>

Sau khi chỉnh sửa thì save và đóng lại nhé.

Bước 4: Bật chế độ HTTPS và test.

Lệnh kích hoạt trang HTTPS : sudo a2ensite default-ssl.conf

Restart apache để load cài đặt : sudo service apache2 restart

Để kiểm tra xem cài đặt thành công chưa. Các bạn mở trình duyệt và truy cập https://server_domain_name_or_IP

Thành công thì các bạn sẽ phải nhập user/pass (do cài đặt BasicAuth ở trên) và sau đó sẽ thấy như này :

ssl_warning.png

Sau khi bỏ qua cảnh báo, các bạn sẽ thấy như này :

encrypted.png

Vậy là đã thành công !

Lưu ý :

Trong thực tế, các website có cài đặt SSL đều được tự động chuyển về giao thức HTTPS mặc dù bạn không hề gõ HTTPS://xxx.xxx (các bạn cứ gõ google.com thì thấy tự động nó chuyển thành https://www.google.com)

Ý tưởng của việc này là hướng các truy cập đến giao thức http mặc định trở thành giao thức https một cách tự động. Để làm việc này thì chúng ta cần cấu hình trong file /etc/apache2/sites-available/000-default.conf. Như mình có đề cập đến ở trên thì file này sẽ cấu hình các vấn đề liên quan http port 80.

Thêm các dòng này vào file 000-default.conf

        ServerName minhung.tk
        Redirect / https://minhung.tk

All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.