Một tip đơn giản và hiệu quả để bảo vệ website

Trong quá trình pentest cho một anh bạn nước ngoài, mình đã tìm được 1 bug nho nhỏ dẫn tới RCE (blind). Tuy nhiên, sau khi hý hửng up shell lên thành công, mình thực thi command và chợt phát hiện ra con shell của mình đã biến mất chỉ sau vài chục giây :)) Cứ nghĩ đối phương đang dùng những giải pháp bảo mật tối tân, mình đã thử encrypt webshell các kiểu còn đà điểu nhưng vẫn không trụ nổi được quá 1p. Sau một hồi chày cối cuối cùng cũng lấy được interactive shell. Lần mò một hồi mình mới phát hiện ra thực ra anh bạn này không sử dụng biện pháp bảo vệ nào cả. Chỉ đơn giản, anh ta đồng bộ thư mục web chính của mình với thư mục web đặt trên 1 server backup, mỗi khi có sự thay đổi trên web chính như thay đổi source code, tải file mới, hệ thống sẽ phát hiện ra và khôi phục về nguyên trạng trong vòng 1 phút. Công cụ anh bạn này sử dụng là rsync, một công cụ có sẵn trên Ubuntu @@.
1 RSYNC là gì?
Rsync (Remote Sync) là một công cụ hữu hiệu để sao lưu và đồng bộ dữ liệu trên Linux. Với câu lệnh rsync bạn có thể sao lưu và đồng bộ dữ liệu remote từ các máy sử dụng hệ điều hành Linux một cách dễ dàng và thuận tiện.
Thực tế trên Linux có nhiều công cụ có thể giải quyết nhiệm vụ trên (ví dụ như scp), tuy nhiên Rsync có một số ưu điểm như:
- Hiệu quả trong việc sao lưu và dồng bộ file từ 1 hệ thống khác
- Hỗ trợ sao chép links, devices, owners, groups và permissions
- Nhanh hơn sử dụng scp
- Rsync tiêu tốn ít băng thông vì nó có sử dụng cơ chế nén khi truyền tải và nhận dữ liệu.
2 Tại sao nên sử dụng rsync?
Thực tế, khi các attacker tấn công website của bạn, mục tiêu lớn nhất thường là RCE (thực thi câu lệnh từ xa). Khi đã có thể RCE hoặc ghi file tùy ý, các attacker thường muốn để lại webshell để persistence hoặc thuận tiện hơn cho việc thực thi command, hoặc đơn giản là deface website để show off hoặc cảnh báo quản trị viên :)) Vậy mỗi lần attacker deface hoặc để lại webshell trên website của bạn và chỉ vài chục giây sau website sẽ trở về hiện trạng cũ sẽ khiến họ rất nản, và một số có thể sẽ bỏ cuộc. Với case vừa rồi, rất may web server của anh bạn không chặn outbound connection, từ đó có thể mở interactive shell, nếu không có lẽ mình đã bỏ cuộc :D
Như vậy bên cạnh những phương pháp bảo vệ website truyền thống như sử dụng những các giải pháp WAF, IDS, IPS... Thì việc sử dụng rsync để đồng bộ website của bạn liên tục với website backup, kết hợp với chặn outbound connection sẽ là 1 combo khiến website của bạn trở nên khó nhằn hơn rất nhiều với các attacker ^^
3 Cách cấu hình rsync hiệu quả
Cài đặt rsync
yum install rsync (On Red Hat based systems)
sudo apt-get install rsync (On Debian based systems)
Cú pháp cơ bản
rsync options source destination
Các tùy chọn cơ bản trong rsync
-v : verbose
-r : sao chép dữ liệu theo cách đệ quy ( không bảo tồn mốc thời gian và permission trong quá trình truyền dữ liệu)
-a :chế độ lưu trữ cho phép sao chép các tệp đệ quy và giữ các liên kết, quyền sở hữu, nhóm và mốc thời gian
-z : nén dữ liệu
-h : định dạng số
Cấu hình & lập lịch để rsync đồng bộ dữ liệu qua ssh
Giả sử bạn có 2 server: webserver cho phép kết nối từ Internet, là server tiếp nhận các request từ người dùng; secureserver được đặt trong vùng mạng nội bộ, cách ly với mạng Internet, mở kết nối SSH đến webserver để quản trị nội dung website. Ý tưởng cấu hình như sau:
- Webserver chỉ trả lời các HTTP request, chặn hết các kết nối khác ra mạng Internet.
- Nội dung thư mục web của secureserver sẽ được đồng bộ liên tục với thư mục tương ứng trên webserver. Mọi thay đổi liên quan đến website sẽ được thực hiện trên secureserver.

Các bước cấu hình:
- Test kết nối rsync qua SSH (có sử dụng pass):
Câu lệnh sau đây sẽ đồng bộ thư mục /var/www/html từ secureserver (10.1.1.2) tới thư mục /var/www/html2 webserver (10.1.1.1), đồng thời loại bỏ các file trên webserver khác với thư mục gốc ở secureserver.
Câu lệnh sẽ yêu cầu password của user ssh trên webserver
rsync -avz --delete -e ssh /var/www/html kevin@10.1.1.1:/var/www/html2
2. Tạo ssh key pair để kết nối ssh không cần password
Để thuận tiện hơn cho mỗi lần đồng bộ, ta sẽ dùng ssh-keygen trên secureserver để tạo cặp public và private key.
$ ssh-keygen
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Note: Khi hệ thống yêu cầu nhập passphrase, bạn chỉ cần ấn enter để bỏ qua.
3. Copy publickey tới webserver
ssh-copy-id -i ~/.ssh/id_rsa.pub 10.1.1.1
Như vậy hiện tại bạn có thể ssh từ secureserver tới webserver mà không cần password
ssh 10.1.1.1
4. Lập lịch đồng bộ rsync thông qua giao thức ssh không cần mật khẩu
rsync -avz --delete -e ssh /var/www/html kevin@10.1.1.1:/var/www/html2
Gõ lệnh crontab -e hoặc sửa file /etc/crontab trên secureserver sau đó thêm dòng sau để lập lịch chạy đồng bộ mỗi phút 1 lần:
* * * * * rsync -avz --delete -e ssh /var/www/html kevin@10.1.1.1:/var/www/html2
Lưu lại để quá trình lập lịch có tác dụng. Bạn cũng có thể sử dụng website https://crontab.guru/ để sinh ra các quy luật chạy crontab cho phù hợp.
Bonus: Ứng dụng với Windows Server
Vẫn với ý tưởng cài đặt webserver và secure server, chúng ta có thể sử dụng rsync hoặc các công cụ tương đương hỗ trợ windows như FreeFileSync, RealTimeSync...