1. Phân tách nội dung tĩnh và động
1. Tạo điểm mount cho NFS
mkdir /static
vim /etc/exports
/static 172.16.1.0/20(rw,sync,all_squash,anonuid=666,anongid=666)
systemctl restart nfs-server
chown -R www.www /static/
2. Di chuyển tài nguyên tĩnh vào thư mục mount
mkdir /opt/static/s
[root@web01 static]# cp -r /opt/bbs/static/* /opt/static/s/
3. Mount trên máy lb
yum install nfs-utils -y
mount -t nfs 172.16.1.31:/static /opt/static/
4. Kiểm tra hoạt động
2. Tổng quan về Rewrite
Rewrite chủ yếu dùng để thay đổi địa chỉ URL và thực hiện chuyển hướng, tức là chuyển hướng yêu cầu từ web đến một URL khác.
3.1. Tổng quan về Rewrite
1. Chuyển hướng địa chỉ, khi người dùng truy cập www.linux.com thì sẽ được chuyển hướng đến www.baidu.com.
2. Chuyển đổi giao thức, khi người dùng truy cập bằng HTTP thì sẽ được chuyển sang HTTPS.
3. Ẩn URL động, biến đổi trang động thành dạng tĩnh giúp dễ dàng cho SEO và bảo mật hơn.
4. Tối ưu hóa SEO, URL dễ nhớ giúp công cụ tìm kiếm dễ dàng thu thập thông tin.
3.2. Cú pháp của Rewrite
Syntax: rewrite regex replacement [flag];
Default: —
Context: server, location, if
rewrite # Lệnh của module
regex # Đường dẫn yêu cầu (có thể dùng biểu thức chính quy)
replacement # Đường dẫn đích
[flag]; # Cờ đánh dấu
location /download/ {
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break;
return 403;
}
3.3. Các cờ (Flag) trong Rewrite
Rewrite có thể áp dụng trong server, location hoặc if, mỗi lệnh đều kết thúc bằng một cờ. Các cờ hỗ trợ bao gồm:
| cờ | mô tả |
|---|---|
| last | Kết thúc việc kiểm tra các rule tiếp theo sau khi rule này khớp |
| break | Dừng kiểm tra các rule còn lại khi rule này khớp |
| redirect | Trả về mã 302, địa chỉ sẽ hiển thị thay đổi trong trình duyệt |
| permanent | Trả về mã 301, địa chỉ sẽ được lưu lại trong cache trình duyệt |
3.3.1. Sự khác biệt giữa last và break
server {
server_name _;
listen 80;
location ~ ^/break {
rewrite (.*) /test break;
}
location ~ ^/last {
rewrite (.*) /test last;
}
location /test {
default_type text/html;
return 200 "test";
}
}
Yêu cầu với break:
1. Truy cập linux.rewrite.com/break
2. Khớp với location ~ ^/break, chuyển hướng đến linux.rewrite.com/test
3. Trình duyệt sẽ tìm kiếm đường dẫn /test trong hệ thống
4. Nếu tồn tại trả về nội dung, nếu không sẽ báo lỗi 404 hoặc 403
Yêu cầu với last:
1. Truy cập linux.rewrite.com/last
2. Khớp với location ~ ^/last, chuyển hướng đến linux.rewrite.com/test
3. Nếu tồn tại trả về nội dung
4. Nếu không tồn tại sẽ gửi lại yêu cầu đến server với đường dẫn mới
5. Yêu cầu mới sẽ khớp với location /test và trả về nội dung
6. Nếu không khớp với bất kỳ location nào sẽ trả về lỗi 404
3.3.2. Sự khác biệt giữa redirect và permanent
Chuyển hướng:
location /redirect {
rewrite (.*) http://www.baidu.com redirect;
}
location /permanent {
rewrite (.*) http://www.baidu.com permanent;
}
redirect: Mỗi lần truy cập sẽ hỏi lại máy chủ, nếu máy chủ không hoạt động sẽ thất bại.
permanent: Lần đầu tiên sẽ hỏi, trình duyệt lưu lại đường dẫn, lần sau sẽ dùng trực tiếp từ cache.
3.3.3. Ví dụ thực tế
Trong môi trường cân bằng tải, phân tách nội dung tĩnh và động cho game nhỏ.
4. HTTPS
HTTPS cần thiết vì HTTP không an toàn, dữ liệu có thể bị chặn hoặc sửa đổi. Với HTTPS, dữ liệu được mã hóa nên hacker không thể lấy hay thay đổi thông tin.
Để triển khai HTTPS, cần hiểu về giao thức SSL, hiện nay phổ biến hơn là TLS.
TLS đảm bảo dữ liệu được mã hóa như thế nào? Trong mô hình OSI, HTTP nằm ở tầng ứng dụng, phía dưới là tầng trình bày, nơi SSL/TLS hoạt động, thông qua quá trình handshake, trao đổi khóa, cảnh báo và mã hóa để đảm bảo an toàn mà không ảnh hưởng đến tầng ứng dụng.
4.1. Mô phỏng việc tấn công website
4.1.1. Trang web bình thường
[root@web01 ~]# vim /code/index.html
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Trang đăng ký thông tin sinh viên</title>
</head>
<body>
<h3 align="center">Đăng ký thông tin sinh viên</h3>
<form name="stu"action="">
| Tên: | <input name="stuName" type="text"></input> |
|---|---|
| Giới tính: | <input checked="checked" name="stuSex" type="radio"></input>Nam <input name="stuSex" type="radio"></input>Nữ |
| Ngày sinh | <input name="stuBirthday" type="text"></input> | Theo định dạng yyyy-mm-dd |
| Trường: | <input name="stuSchool" type="text"></input> |
| Chuyên ngành: | <select name="stuSelect2"> <option selected="selected">Khoa học máy tính</option> <option>Kỹ thuật mạng</option> <option>Kỹ thuật IoT</option> <option>Toán ứng dụng</option> </select> |
| Kỹ năng thể thao: | <input name="stuCheck" type="checkbox"></input>Bóng rổ <input name="stuCheck" type="checkbox"></input>Bóng đá <input name="stuCheck" type="checkbox"></input>Bóng chuyền <input name="stuCheck" type="checkbox"></input>Bơi lội |
| Upload ảnh: | <input type="file"></input> |
| Mật khẩu: | <input name="stuPwd" type="password"></input> |
| Giới thiệu bản thân: | <textarea cols="40" name="Letter" rows="4"></textarea> |
| <input type="submit" value="Gửi"></input><input type="reset" value="Hủy"></input> |
</form>
</body>
</html>
[root@web01 ~]# chown -R www.www /code/index.html
4.1.2. Website bị tấn công
[root@lb01 ~]# vim /etc/nginx/conf.d/linux.jc.com.conf
server {
listen 80;
server_name linux.jc.com;
location / {
proxy_pass http://10.0.0.7:80;
include proxy_params;
sub_filter '<title>Trang đăng ký thông tin sinh viên</title>' '<title>Casino online số 1 tại澳门</title>';
sub_filter '<h3 align="center">Đăng ký thông tin sinh viên</h3>' '<h3 align="center">Đăng ký thông tin VIP</h3>';
sub_filter '<tr><td>Giới tính:</td>' '<tr><td>Sở thích:</td>';
sub_filter '<option selected>Khoa học máy tính</option>' '<option selected>Massage</option>';
sub_filter '<option>Kỹ thuật mạng</option>' '<option>Thuốc lá</option>';
sub_filter '<option>Kỹ thuật IoT</option>' '<option>Rượu</option>';
sub_filter '<option>Toán ứng dụng</option>' '<option>Uốn tóc</option>';
sub_filter '<tr><td>Upload ảnh:</td><td colspan="2"><input type="file" ></td></tr>' '';
}
}
[root@lb01 ~]# systemctl restart nginx
4.2. Quy trình mã hóa
1. Trình duyệt gửi yêu cầu đến cổng 443, kèm theo các thuật toán mã hóa mà trình duyệt hỗ trợ.
2. Máy chủ chọn thuật toán phù hợp từ yêu cầu.
3. Máy chủ gửi chứng chỉ số cho trình duyệt. Có thể tự tạo hoặc từ tổ chức đáng tin cậy.
4. Trình duyệt xác minh chứng chỉ:
4.1 Tìm tổ chức phát hành trong danh sách chứng chỉ nội bộ, nếu không tìm thấy sẽ cảnh báo không đáng tin cậy.
4.2 Giải mã chứng chỉ bằng khóa công khai của tổ chức, kiểm tra chữ ký số và thông tin chứng chỉ.
4.3 Kiểm tra tên miền và thời hạn hiệu lực.
4.4 Nếu xác thực thành công, trình duyệt sử dụng khóa công khai để mã hóa một số ngẫu nhiên R.
5. Trình duyệt gửi R đã mã hóa cho máy chủ.
6. Máy chủ giải mã R bằng khóa riêng.
7. Máy chủ dùng R làm khóa mã hóa nội dung và gửi cho trình duyệt.
8. Trình duyệt dùng R để giải mã nội dung nhận được.
4.3. So sánh loại chứng chỉ
| So sánh | Chứng chỉ DV | Chứng chỉ OV | Chứng chỉ EV |
|---|---|---|---|
| Thanh địa chỉ xanh | Khóa + HTTPS | Khóa + HTTPS | Khóa + Tên doanh nghiệp + HTTPS |
| Mục đích | Website cá nhân, yêu cầu đơn giản | Website thương mại, doanh nghiệp nhỏ | Platfrom tài chính lớn, tổ chức lớn |
| Xác minh | Chứng minh quyền sở hữu tên miền | Xác minh doanh nghiệp + tên miền | Xác minh hoàn chỉnh + tên miền |
| Thời gian cấp | 10 phút - 24 giờ | 3-5 ngày làm việc | 5-7 ngày làm việc |
| Thời hạn | 1 năm | 1-2 năm | 1-2 năm |
| Bảo hiểm | Không | 125-175 triệu USD | 150-175 triệu USD |
4.4. Tạo chứng chỉ tự ký
# Sử dụng openssl tạo chứng chỉ (không dùng trong môi trường sản xuất)
[root@web01 ssl_key]# openssl genrsa -idea -out server.key 2048
Generating RSA private key, 2048 bit long modulus
...............................+++
........+++
e is 65537 (0x10001)
Enter pass phrase for server.key: 123456
Verifying - Enter pass phrase for server.key: 123456
[root@web01 ssl_key]# ll
total 4
-rw-r--r--. 1 root root 1739 Dec 9 11:27 server.key
# Tạo chứng chỉ công khai, bỏ mật khẩu khóa riêng
[root@web01 ssl_key]# openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
Generating a 2048 bit RSA private key
.....................................+++
............+++
writing new private key to 'server.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]:china
string is too long, it needs to be less than 2 bytes long
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:meiguo
Locality Name (eg, city) [Default City]:riben
Organization Name (eg, company) [Default Company Ltd]:heishoudang
Organizational Unit Name (eg, section) []:oldboy
Common Name (eg, your name or your server's hostname) []:oldboy
Email Address []:123@qq.com
# req --> Tạo mới chứng chỉ
# new --> Tạo chứng chỉ mới
# x509 --> Định dạng chuẩn chứng chỉ
# key --> Khóa riêng
# out --> Xuất chứng chỉ
# days --> Thời hạn
# sha256 --> Thuật toán mã hóa
#1. Kích hoạt SSL
Syntax: ssl on | off;
Default: ssl off;
Context: http, server
#2. Chỉ định chứng chỉ
Syntax: ssl_certificate file;
Default: —
Context: http, server
#3. Chỉ định khóa riêng
Syntax: ssl_certificate_key file;
Default: —
Context: http, server
[root@lb01 conf.d]# cat https.conf
upstream ssl {
server 172.16.1.7;
server 172.16.1.8;
server 172.16.1.9;
}
server {
listen 443 ssl;
server_name _;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
location / {
proxy_pass http://ssl;
include /etc/nginx/proxy_params;
}
}
server {
listen 80;
server_name _;
rewrite (.*) https://192.168.15.5 permanent;
}