Bài 4: Làm việc với HTTPS, SSL và TLS

Bài này yêu cầu cài đặt một máy chủ web có hỗ trợ bảo mật với SSL/TLS trên một máy chủ và sử dụng Firefox browser kết nối đến nó từ một máy trạm. Các bước thực hiện như sau:

Bước 1: Cài đặt và cấu hình máy chủ web apache

Cài apache http server với lệnh yum. Máy chủ sau khi cài đặt đã được tự động cấu hình với file cấu hình /etc/httpd/conf/httpd.conf. Nếu không có lỗi gì xảy ra, có thể khởi động máy chủ với file cấu hình mặc định này bằng lệnh apachectl.

> yum install httpd
. . . .
> apachectl -k start
. . . .

Sau khi khởi động máy chủ web apache, sử dụng Firefox web browser truy nhập vào địa chỉ http://127.0.0.1 để kiểm tra kết nối.

Tiếp theo, cần thiết lập thư mục dữ liệu trên máy chủ để các máy trạm truy nhập đến. Có hai cách là sử dụng DocumentRoot hoặc URL mapping. DocumentRoot là tham số trong file cấu hình apache cho phép xác định các file dữ liệu của máy chủ được đặt ở đâu. Các file này sẽ được truy nhập với địa chỉ URL mà không có thành phần thư mục (http://127.0.0.1).   Có thể tìm tham số này trong file cấu hình /etc/httpd/conf/httpd.conf rồi tạo các thư mục con nằm bên trong thư mục DocumentRoot (ví dụ mywebpage). Khởi động lại máy chủ apache để nó đọc lại file cấu hình và dùng browser truy nhập theo địa chỉ có tên thư mục (http://127.0.0.1/mywebpage).

> cat /etc/httpd/conf/httpd.conf | grep DocumentRoot
# DocumentRoot: The directory out of which you will serve your
DocumentRoot "/var/www/html"
# This should be changed to whatever you set DocumentRoot to.
#    DocumentRoot /www/docs/dummy-host.example.com

> mkdir /var/www/html/mywebpage
> cp ./index.html /var/www/html/mywebpage/index.html

> apachectl -k stop
> apachectl -k start

Phương pháp URL mapping cho phép thiết lập ánh xạ giữa các địa chỉ URL với các thư mục ở bất cứ đâu trên máy chủ, không nhất thiết phải nằm trong DocumentRoot. Khi thực hiện phương pháp này, một số vấn đề về quyền truy nhập thư mục cần được lưu ý. Đầu tiên cần xác định apache sử dụng user nào để đọc các thư mục. Nguyên lý hoạt động của apache là khi một browser truy nhập đến một thư mục web thông qua địa chỉ URL nào đó, máy chủ web apache thay mặt người sử dụng đọc các file trong thư mục tương ứng với quyền của user đang chạy tiến trình apache (thông thường user này là apache). Có thể sử dụng lênh ps aux để biết người sử dụng này là ai:

> ps aux | grep http
root     18431  0.0  0.0 100952   656 pts/0    S+   21:24   0:00 tail -f /var/log/httpd/error_log
root     18552  0.0  0.1 198528  5304 ?        Ss   21:47   0:00 /usr/sbin/httpd -k start
apache   18553  0.0  0.0 198528  3064 ?        S    21:47   0:00 /usr/sbin/httpd -k start
apache   18554  0.0  0.0 198528  3608 ?        S    21:47   0:00 /usr/sbin/httpd -k start
apache   18555  0.0  0.0 198528  3068 ?        S    21:47   0:00 /usr/sbin/httpd -k start
apache   18556  0.0  0.0 198528  3064 ?        S    21:47   0:00 /usr/sbin/httpd -k start
apache   18557  0.0  0.0 198528  3064 ?        S    21:47   0:00 /usr/sbin/httpd -k start
apache   18558  0.0  0.0 198528  3064 ?        S    21:47   0:00 /usr/sbin/httpd -k start
apache   18559  0.0  0.0 198528  3064 ?        S    21:47   0:00 /usr/sbin/httpd -k start
apache   18560  0.0  0.0 198528  3064 ?        S    21:47   0:00 /usr/sbin/httpd -k start
root     18572  0.0  0.0 103312   880 pts/9    S+   21:54   0:00 grep http

Nếu một thư mục web không được cấu hình quyền truy nhập để user apache có thể đọc được, lỗi sẽ xảy ra khi browser muốn truy nhập đến thư mục web này. Để đảm bảo quyền truy nhập thư mục, phương pháp đơn giản nhất là để thư mục web nằm trong thư mục home của user apache (thông thường là /var/www). Có thể đọc file /etc/passwd để xác định thư mục home của user apache:

> cat /etc/passwd | grep apache
apache:x:48:48:Apache:/var/www:/sbin/nologin

Tiếp theo, tạo thư mục web và các file dữ liệu cần thiết trong thư mục home của user apache (giả sử là /var/www/myweb). Cuối cùng, thiếp lập URL mapping trong file cấu hình /etc/httpd/conf/httpd.conf để trỏ tới thư mục này.

alias /myweb/ "/var/www/myweb/"
<Directory "/var/www/myweb/">
Order allow,deny
Allow from all
</Directory>

Khởi động lại apache với lệnh apachectl -k, dùng web browser truy nhập đến địa chỉ http://127.0.0.1/myweb sẽ đọc được nội dung thư mục web đã chuẩn bị trên máy chủ.

Bước 2: Thiếp lập thư mục bảo mật trên máy chủ web

Để apache có thể làm việc với SSL/TLS, cần cài đặt thư viện mod_ssl:

> yum install mod_ssl

Nếu cài đặt thành công, chế độ làm việc bảo mật SSL/TLS của apache đã được cấu hình mặc định theo file cấu hình /etc/httpd/conf.d/ssl.conf. Theo cấu hình mặc định này (tham số VirtualHost), một máy chủ apache “ảo” (gọi là máy chủ HTTPS để phân biệt với máy chủ apache đã thiết lập trong bước 1) đã được thiết lập để tiếp nhận và xử lý các truy nhập theo giao thức HTTPS tại cổng 443.

> cat /etc/httpd/conf.d/ssl.conf | grep VirtualHost
<VirtualHost _default_:443>
</VirtualHost>  

Tương tự như trong bước 1, thư mục web của máy chủ HTTPS này có thể được thiết lập theo hai cách - DocumentRootURL mapping. Để cho đơn giản, ta sẽ thay DocumentRoot trong máy chủ ảo bằng một thư mục nằm trong home của user apache (giả sử là /var/www/security).

> cat /etc/httpd/conf.d/ssl.conf | grep DocumentRoot
DocumentRoot "/var/www/security"

Tạm thời trong bước này ta chưa xử lý chứng thư kỹ thuật số của máy chủ HTTPS. Thay vào đó, ta sử dụng chứng thư mặc định đi kèm với apache SSL/TLS:

> cat /etc/httpd/conf.d/ssl.conf | grep SSLCertificate
# Point SSLCertificateFile at a PEM encoded certificate.  If
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key

Cuối cùng, dùng web browser truy nhập đến thư mục gốc của máy chủ HTTPS này, lần đầu tiên sẽ xuất hiện yêu cầu người sử dụng xác nhận chứng thư kỹ thuật số của máy chủ HTTPS:

Click chuột vào nút Advanced để xem và xác nhận chứng thư của máy chủ HTTPS này (bằng cách Add Exception), browser đã hoàn thành bước thiết lập phiên làm việc SSL/TLS và cho phép truy nhập vào thư mục gốc:

Bước 3: Cấu hình chứng thư kỹ thuật số cho máy chủ

Trong bước 2, ta đã sử dụng chứng thư kỹ thuật số mặc định đi kèm với apache SSL/TLS để cho phép browser truy nhập đến các vùng dữ liệu an toàn của máy chủ HTTPS. Chứng thư kỹ thuật số này được lưu lại trên browser sau khi được xác nhận lần đầu để sử dụng cho các lần tuy nhập tiếp theo. Khi truy nhập đến một địa chỉ web nào đó với giao thức HTTPS, browser kiểm tra đã có chứng thư kỹ thuật số của HTTPS server được lưu lại hay chưa, nếu đã có, nó tự động chấp nhận HTTPS server và hoàn thành bước thiết lập phiên làm việc SSL. Các chứng thư kỹ thuật số này có thể được xem trong browser. Với Firefox, chọn Preference/Advanced“View Certificates”:



Trong bước này, ta sẽ tạo chứng thư kỹ thuật số mới cho máy chủ HTTPS. Một chứng thư kỹ thuật số gồm có 2 thành phần - khóa công khai (thường được gọi là các certificate, hay public key) và khóa bí mật (thường được gọi là private key). Lệnh openssl cho phép tạo ra bộ đôi này với các thông số đưa vào:

> openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/pki/tls/private/myapache.key -out /etc/pki/tls/certs/myapache.crt
Generating a 2048 bit RSA private key
............+++
........................................................................................................................................+++
writing new private key to '/etc/pki/tls/private/myapache.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:VN
State or Province Name (full name) []:Hanoi
Locality Name (eg, city) [Default City]:Hanoi
Organization Name (eg, company) [Default Company Ltd]:Hanoi University of Science and Technology
Organizational Unit Name (eg, section) []:School of Information and Communication Technology
Common Name (eg, your name or your server's hostname) []:My Sercurity Web Server
Email Address []:hoangph@soict.hust.edu.vn

Sau khi bộ đôi khóa được tạo ra (khóa bí mật /etc/pki/tls/private/myapache.key và khóa công khai /etc/pki/tls/certs/myapache.crt), cần thiết lập lại các file khóa này trong fie cấu hình /etc/httpd/conf.d/ssl.conf:

> cat /etc/httpd/conf.d/ssl.conf | grep SSLCertificate
# Point SSLCertificateFile at a PEM encoded certificate.  If
SSLCertificateFile /etc/pki/tls/certs/myapache.crt
SSLCertificateKeyFile /etc/pki/tls/private/myapache.key

Khởi động lại máy chủ HTTPS và phía client, xóa chứng thư cũ đã được lưu trữ từ trước cho máy chủ 127.0.0.1. Tiếp theo, truy nhập vào máy chủ HTTP ở địa chỉ https://127.0.0.1, browser sẽ hiển thị thông tin chứng thư để xác nhận. Có thể thấy các thông tin khi tạo chứng thư trên may chủ đã được lưu lại và hiển thị trong browser: