Ask question

Ask Questions and Get Answers from Our Community

Answer

Answer Questions and Become an Expert on Your Topic

Contact Staff

Our Experts are Ready to Answer your Questions

Linux Bảo mật traffic HTTP bằng SSL termination và reverse proxy NGINX

BlackDrag0n

Moderator
Joined
Jan 4, 2021
Messages
21
Reaction score
15
Points
3

Bảo mật traffic HTTP bằng SSL termination và reverse proxy NGINX


Nội dung:


GIới thiệu SSL Termination:


- SSL Termination là một giải pháp giúp bảo vệ traffic của người dùng bằng giao thức HTTPS thông qua một server NGINX. Server NGINX sẽ đứng ra làm endpoint SSL cho người dùng truy cập vào. Traffic từ NGINX đến Server có thể là HTTP hoặc HTTPS.
1.png

Chuẩn bị:


- Một Server Linux cài đặt Nginx ( Ở đây mình dùng Fedora)
- Certificate SSL ( Sử dụng Let's Encrypt)

Tiến hành:


Trên Server Linux thực hiện cài đặt các package cần dùng:
Bash:
# Cài đặt Nginx
dnf install nginx
# Cài đặt certbot
dnf install certbot python-certbot-nginx
Tiến hành mở port firewall trên Server:
Bash:
#Mở port 80 trên Firewall
firewall-cmd --addport=80/tcp --pernament
#Mở port 443 trên Firewall
firewall-cmd --addport=443/tcp --pernament
#Restart Firewall
firewall-cmd --reload
Disable SELINUX - Nếu không Disable thì request từ client sẽ bị chặn.
Bash:
setenforce 0
## Cần reboot Server

Sau khi reboot lại Server, tiến hành cấu hình Nginx. Chỉnh sửa file /etc/nginx/nginx.conf như hình.
include /etc/nginx/conf.d/*.conf sẽ lấy tất cả các cấu hình trong thư mục conf.d/
1617250266550.png

Lưu lại và tạo một file config trong thư mục conf.d/ . Ở đây mình sẽ tạo file tên reverseproxy.conf

NGINX:
# vim /etc/nginx/conf.d/reverseproxy.conf

server {
        server_name server1.securityzone.vn;
        location /{
                proxy_pass http://<IP Server 1>;
                }
    }
server {
        server_name server2.securityzone.vn;
        location /{
                proxy_pass http://<IP Server 2>;
                }
    }
Tuy nhiên nếu để mặc định các tham số vậy thì một số chức năng của website sẽ không load được
1617251131511.png

Vì thế cần thêm một số thuộc tính nữa vào file reverseproxy.conf
NGINX:
server {
    server_name server1.securityzone.vn;
    location /{
        proxy_pass http://<IP Server 1>;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        Host $host;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto https;
        proxy_set_header        SSL_PROTOCOL $ssl_protocol;
    }
   listen 80;
}
server {
    server_name server2.securityzone.vn;
    location /{
        proxy_pass http://<IP Server 2>;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        Host $host;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto https;
        proxy_set_header        SSL_PROTOCOL $ssl_protocol;
    }
listen 80;
}
Sau khi config xong, kiểm tra lại bằng lệnh nginx -t để kiểm tra cú pháp config. Nếu file config ổn thì tiến hành Start service để tiến hành lấy SSL Certificate.
Bash:
systemctl start nginx
systemctl enable nginx

Sử dụng certbot để lấy SSL Certificate :


Yêu cầu:

- Cần có tên miền và trỏ cả 2 tên miền cấu hình về server Nginx
- Mở port 80 và 443 trên Server nếu sử dụng method là http-challenge
- Cấu hình thêm DNS để challenge nếu không mở được port 80 trên server để sử dụng method là dns-challenge
=> Ở đây mình đã mở sẵn port 80 và 443 nên sẽ sử dụng http-challenge
Bash:
certbot --nginx -d server1.securityzone.vn -d server2.securityzone.vn
Sau khi certbot chạy xong, file reverseproxy.conf đã được thay đổi cấu hình. Restart lại service nginx để kiểm tra thành quả
Bash:
systemctl restart nginx

Kiểm tra thành quả của mình sau khi cấu hình :)
 
Last edited:
Cái này mình nên thử dùng wireshark bắt traffic trước và sau triển khai để compare cho rõ nhé
 
Sự thay đổi traffic thì trước khi traffic đi qua proxy sẽ dùng giao thức HTTP. Ở đây mình test bằng cách thực hiện đăng nhập vào web gửi phương thức POST chứa Username/password lên.

1617521836542.png


Đối với giao thức HTTP thì nội dung từ client lên server sẽ không được mã hoá nên khi mình mở gói tin chứa thông tin POST lên sẽ đọc được các header chứa trong đó gồm username/password để đăng nhập.

1617522047974.png


Sau khi traffic đi qua proxy thì sẽ dùng giao thức HTTPS để truyền dữ liệu.

1617522084574.png


Mình thử đọc nội dùng truyền lên Server thì dữ liệu đã được mã hoá và không thể đọc được.

1617522139674.png


Proxy còn giúp giấu đi các thông tin của Server web của mình:
  • Trước khi có proxy:
1617522187549.png

  • Sau khi thiết lập traffic đi qua proxy:
1617522207761.png

Như hình thì bạn thấy là Status_code là 301 ( Được Proxy redirect về Server thật). Các thông tin về Server thật cũng được giấu đi.
 
Top