Ransomware trên Linux — không còn là chuyện hiếm gặp
Audit security cho 10+ server, mình thấy một pattern lặp đi lặp lại: SSH dùng password yếu, cron job chạy script nguồn lạ, không có backup plan bài bản. Khi ransomware thật sự tấn công, đội DevOps lúc đó chỉ còn nhìn nhau — không có gì để khôi phục.
Nhiều anh em vẫn nghĩ Linux ít bị ransomware hơn Windows. Đúng là ít hơn — nhưng không có nghĩa là miễn dịch. REvil, Cl0p, LockBit đều có phiên bản nhắm thẳng vào Linux server. Câu hỏi không phải là “có bị tấn công không” mà là “khi bị tấn công, team mình đã chuẩn bị gì”.
So sánh các approach phòng chống
Approach 1: Reactive — Phản ứng sau khi bị tấn công
Đây là kiểu phổ biến nhất mình gặp. Server bị encrypt xong mới chạy đi tìm giải pháp, liên hệ vendor, cân nhắc trả tiền chuộc. Theo IBM Cost of Data Breach Report, trung bình mất 21 ngày để recover sau một incident ransomware — chưa kể tiền chuộc từ $200K đến vài triệu USD tùy quy mô. Đội nào đang ở approach này — đổi ngay đi.
Approach 2: Backup-only — Chỉ dựa vào backup
Backup là cần thiết nhưng không đủ. Không có detection thì không biết ransomware bắt đầu mã hóa từ lúc nào. Từng có case team mount NAS vào đúng server bị nhiễm — cả 3 TB trên NAS bị encrypt theo, không còn gì để restore. Và dù có backup sạch, restore xong mà không patch entry point thì vài ngày sau bị lại.
Approach 3: Defense-in-depth — Nhiều lớp bảo vệ
Kết hợp hardening hệ thống + giám sát real-time + backup offline + response plan. Setup ban đầu tốn vài buổi — nhưng khi incident xảy ra, thời gian recover rút từ nhiều tuần xuống còn vài tiếng. Đây là approach mình recommend cho bất kỳ server nào expose ra internet.
Phân tích ưu nhược từng approach
- Reactive: Không cần setup — nhưng downtime tính bằng tuần, dữ liệu có thể mất vĩnh viễn, tiền chuộc không đảm bảo lấy lại được key.
- Backup-only: Đơn giản, dễ triển khai — nhưng backup online-mounted có thể bị encrypt theo, và không phát hiện được sớm.
- Defense-in-depth: Phát hiện sớm, giảm thiệt hại, recover nhanh — cần vài buổi setup ban đầu. Tốn nhất về thời gian, rẻ nhất về hậu quả.
Chọn cách phù hợp cho từng tình huống
VPS cá nhân hay staging server ít dữ liệu quan trọng: backup 3-2-1 kết hợp monitoring cơ bản là đủ. Còn production server chứa database khách hàng, file người dùng, hoặc code proprietary — cần đủ cả 3 lớp, không thỏa hiệp.
Thứ tự ưu tiên khi implement: backup offline trước (phao cứu sinh), rồi hardening, cuối cùng là detection. Không cần làm hết một lúc — mỗi tuần một bước là đủ để giảm đáng kể rủi ro.
Hướng dẫn triển khai: 3 lớp bảo vệ
Lớp 1: Hardening — Giảm attack surface từ đầu
Ransomware thường xâm nhập qua 3 con đường: SSH brute force, web vulnerability chưa vá, và script độc hại trong cron job. Chặn từ đầu vào là bước hiệu quả nhất.
Tắt password SSH, chỉ dùng key:
# Sửa sshd_config
sudo nano /etc/ssh/sshd_config
# Đổi các dòng sau:
PasswordAuthentication no
PermitRootLogin no
Port 2222
sudo systemctl restart sshd
Cài fail2ban chặn brute force:
sudo apt install fail2ban -y
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# Thêm vào jail.local:
[sshd]
enabled = true
port = 2222
maxretry = 3
bantime = 86400
findtime = 600
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
Mount /tmp và /var/tmp với noexec — ngăn malware chạy từ thư mục tạm:
# Thêm vào /etc/fstab
tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev 0 0
tmpfs /var/tmp tmpfs defaults,noexec,nosuid,nodev 0 0
# Apply ngay không cần reboot
sudo mount -o remount,noexec,nosuid /tmp
sudo mount -o remount,noexec,nosuid /var/tmp
Lớp 2: Detection — Phát hiện sớm trước khi thiệt hại lan rộng
May mắn là ransomware để lại dấu vết khá rõ: hàng loạt file đổi sang extension lạ (.encrypted, .locked), CPU spike đột ngột, disk I/O tăng vọt lúc 3 giờ sáng. Bắt được tín hiệu này kịp thời là cắt đứt thiệt hại trước khi nó lan ra cả hệ thống.
Script phát hiện extension file bất thường:
#!/bin/bash
# /usr/local/bin/ransomware-detector.sh
WATCH_DIRS="/var/www /home /etc"
SUSPICIOUS_EXT="\.encrypted$|\.locked$|\.crypt$|\.enc$|\.WNCRY$"
THRESHOLD=10
ALERT_EMAIL="[email protected]"
for dir in $WATCH_DIRS; do
count=$(find "$dir" -newer /tmp/.ransomware_check -type f 2>/dev/null \
| grep -E "$SUSPICIOUS_EXT" | wc -l)
if [ "$count" -gt "$THRESHOLD" ]; then
msg="ALERT: $count file bị mã hóa trong $dir tại $(date)"
echo "$msg" | mail -s "RANSOMWARE ALERT: $(hostname)" "$ALERT_EMAIL"
logger -t ransomware-detector "$msg"
# Tùy chọn: isolate network ngay
# iptables -I INPUT -j DROP && iptables -I OUTPUT -j DROP
fi
done
touch /tmp/.ransomware_check
# Chạy mỗi 5 phút
chmod +x /usr/local/bin/ransomware-detector.sh
echo "*/5 * * * * root /usr/local/bin/ransomware-detector.sh" \
| sudo tee /etc/cron.d/ransomware-monitor
Dùng auditd theo dõi thay đổi trên thư mục quan trọng:
sudo apt install auditd -y
sudo systemctl enable --now auditd
# Watch thư mục web và home
sudo auditctl -w /var/www -p wa -k ransomware_watch
sudo auditctl -w /home -p wa -k ransomware_watch
# Xem log realtime
sudo ausearch -k ransomware_watch --start recent | tail -30
Lớp 3: Offline Backup — Phao cứu sinh khi mọi thứ thất bại
Nguyên tắc sống còn: backup phải offline hoặc immutable. Backup mount vào server bị nhiễm đồng nghĩa backup cũng bị mã hóa — case NAS bị encrypt luôn ở phần trên là ví dụ điển hình. Bài học đó không cần phải trả hai lần.
BorgBackup — encrypted, deduplicated, hiệu quả nhất:
sudo apt install borgbackup -y
# Khởi tạo repo trên backup server riêng biệt
borg init --encryption=repokey \
backup-user@backup-server:/backups/$(hostname)
# Script backup hàng ngày
borg create --stats --compression lz4 \
backup-user@backup-server:/backups/$(hostname)::backup-{now:%Y%m%d_%H%M} \
/var/www /home /etc /var/lib/mysql
# Giữ 7 bản daily, 4 bản weekly, 6 bản monthly
borg prune --keep-daily=7 --keep-weekly=4 --keep-monthly=6 \
backup-user@backup-server:/backups/$(hostname)
# Xem danh sách backup
borg list backup-user@backup-server:/backups/$(hostname)
# Restore file cụ thể từ snapshot
borg extract \
backup-user@backup-server:/backups/$(hostname)::backup-20250601_030000 \
var/www/html/wp-config.php
# Thêm vào crontab — chạy 3 giờ sáng mỗi ngày
echo "0 3 * * * root /usr/local/bin/borg-backup.sh >> /var/log/borg-backup.log 2>&1" \
| sudo tee /etc/cron.d/borg-backup
Response Plan — Khi đã bị tấn công
Dù phòng thủ tốt đến đâu cũng cần kịch bản ứng phó. 15 phút đầu quyết định phạm vi thiệt hại — xử lý đúng thì khoanh được ở một vài server, xử lý sai thì cả infrastructure dính.
- Isolate ngay: Ngắt server khỏi network. Chưa tắt máy — RAM dump có thể cần cho forensics.
- Xác định phạm vi: File nào bị encrypt? Thời điểm nào? Entry point từ đâu?
- Không trả tiền chuộc: Không có gì đảm bảo nhận được key. FBI khuyến cáo không trả — và theo Cybereason, 80% nạn nhân trả tiền chuộc bị tấn công lại trong vòng một năm.
- Restore từ snapshot sạch nhất: Chọn backup trước thời điểm nhiễm.
- Patch lỗ hổng trước khi đưa server trở lại: Tìm và vá entry point. Không vá, vài ngày sau bị lại.
# Kiểm tra file bị thay đổi gần đây
find /var/www /home -newer /tmp/.last_check -type f \
| grep -v ".log$" | head -50
# Xem process lạ đang chạy
ps aux --sort=-%cpu | head -20
# Kết nối mạng bất thường
ss -tunap | grep ESTABLISHED | grep -v "127.0.0.1\|::1"
Kết lại
Mình từng thấy team mất cả tuần để restore sau ransomware chỉ vì không có backup plan. Team khác xử lý incident tương tự trong 4 tiếng nhờ BorgBackup snapshot sẵn sàng. Sự khác biệt không phải ở công cụ hay budget — mà ở việc setup quy trình từ sớm.
Ba bước để bắt đầu ngay hôm nay: tắt password SSH, setup BorgBackup lên server riêng, thêm script detection vào cron. Chỉ vậy thôi — đủ để không phải trải qua cái cảm giác nhìn màn hình thấy toàn file .encrypted.

