Bối cảnh & Tại sao cần
2 giờ sáng, điện thoại rung bần bật. Cảnh báo Prometheus réo liên hồi: CPU con server database production vọt lên 98%. SSH vào bằng htop, đập vào mắt mình là cả chục process lạ đang fork liên tục dưới quyền user www-data. Tường lửa UFW vẫn bật. Lịch sử log SSH không có vết brute-force. Lúc này, nếu ngồi lục lọi từng file trong /etc/ hay gõ netstat soi từng port, chắc chắn bạn sẽ mất cả đêm mà vẫn sót lỗ hổng.
Trong tình huống đó, công cụ cứu cánh nhanh nhất là Lynis — scanner kiểm toán bảo mật mã nguồn mở chạy trực tiếp trên Linux shell. Các tool quét từ xa như Nessus hay OpenVAS chỉ thăm dò được bề mặt mạng bên ngoài. Ngược lại, Lynis kiểm tra sâu từ bên trong OS (local scan). Nó rà soát toàn bộ: quyền hạn file, thông số Kernel sysctl, cấu hình PAM, SSH daemon, cronjob ẩn và cả nguy cơ leo thang đặc quyền (privilege escalation).
Ưu điểm lớn nhất? Cực nhẹ và không cần cài daemon chạy ngầm. Lynis chạy xong là thoát, không ngốn RAM và không gây nghẽn dịch vụ. Kết thúc lượt quét khoảng 2 phút, bạn sẽ nhận ngay chỉ số Hardening Index kèm danh sách việc cần vá gấp.
Cài đặt
Trên server production, nguyên tắc sống còn là hạn chế cài package thừa thãi. Bạn có hai cách triển khai Lynis tùy theo mục đích: xử lý sự cố khẩn cấp hoặc quản trị dài hạn.
Cách 1: Chạy trực tiếp qua Git (Khuyên dùng khi ứng cứu khẩn cấp)
Khi cần audit ngay trong đêm, bạn không nên add thêm repo bên thứ ba vào hệ thống. Giải pháp gọn nhất là clone mã nguồn chính thức về thư mục /opt:
cd /opt
sudo git clone --depth=1 https://github.com/CISOfy/lynis
cd lynis
sudo chown -R root:root .
sudo chmod 700 lynis
Kiểm tra nhanh phiên bản:
sudo ./lynis show version
Cách 2: Cài đặt qua Package Manager (Dành cho quản trị lâu dài)
Nếu muốn Lynis tự động cập nhật định kỳ qua apt trên Ubuntu/Debian, hãy cấu hình repository chính thức từ CISOfy:
# Thêm GPG key của CISOfy
curl -fsSL https://packages.cisofy.com/keys/cisofy-software-public.key | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/cisofy-software-public.gpg
# Thêm repository chính thức
echo "deb [arch=amd64,arm64 signed-by=/etc/apt/trusted.gpg.d/cisofy-software-public.gpg] https://packages.cisofy.com/community/lynis/deb/ stable main" | sudo tee /etc/apt/sources.list.d/cisofy-lynis.list
# Cập nhật và cài đặt
sudo apt-get update
sudo apt-get install lynis -y
Cấu hình chi tiết
Lệnh lynis audit system mặc định sẽ tuôn ra hàng trăm dòng log khiến bạn ngợp. Để dùng thực chiến, chúng ta cần tạo profile riêng nhằm tắt bớt cảnh báo giả (false positives) và tập trung vào các điểm trọng yếu.
Tạo profile tùy chỉnh custom.prf
Lynis đọc cấu hình gốc từ default.prf. Đừng bao giờ sửa trực tiếp file này vì nó sẽ bị ghi đè khi update. Thay vào đó, hãy tạo file override riêng trong /etc/lynis/:
sudo mkdir -p /etc/lynis
sudo nano /etc/lynis/custom.prf
Thêm các tùy chọn để tăng tốc độ quét và bỏ qua bài kiểm tra không liên quan (ví dụ test phần cứng boot loader trên VPS ảo hóa KVM):
# Bỏ qua bài test không cần thiết trên cloud/VPS
skip-test=KRNL-5695
skip-test=BOOT-5121
# Tự động quét không dừng chờ phím Enter
quick=yes
# Đường dẫn log phân tích
log_file=/var/log/lynis.log
report_file=/var/log/lynis-report.dat
Chạy bài quét đầu tiên
Kích hoạt lượt quét toàn diện bằng lệnh sau:
sudo lynis audit system --profile /etc/lynis/custom.prf
Quá trình quét thường mất từ 1 đến 3 phút. Kết quả trả về một điểm số Hardening Index (thường từ 55 đến 65 điểm với server Ubuntu mới cài đặt). Ngay dưới đó là hai mục bạn bắt buộc phải đọc: Warnings (lỗ hổng nghiêm trọng) và Suggestions (khuyến nghị nâng cao).
Vá ngay 3 lỗ hổng điển hình sau audit
Trong ca trực hôm đó, Lynis chỉ đích danh 3 điểm yếu chí mạng trên cụm máy chủ của mình:
- SSH mở cửa cho root và xác thực mật khẩu yếu (Test ID:
SSH-7408):
Mặc định nhiều bên vẫn để password login cho tiện. Đây là miếng mồi ngon cho botnet. Sửa ngay/etc/ssh/sshd_configđể chỉ cho phép đăng nhập bằng SSH Key:PermitRootLogin no PasswordAuthentication no MaxAuthTries 3Khởi động lại daemon SSH:
sudo systemctl restart sshd.
Tiện đây khi cấp tài khoản sudoer mới cho nhân sự trực thay ca, mình dùng công cụ tạo mật khẩu tại toolcraft.app/vi/tools/security/password-generator để sinh chuỗi ngẫu nhiên từ 24 ký tự trở lên. Trang này chạy thuật toán mã hóa 100% bằng JavaScript offline trên trình duyệt. Bạn không lo mật khẩu bị lộ qua mạng hay dính nguy cơ logger từ các website online trôi nổi. - Kernel Network Parameters chưa gia cố (Test ID:
KRNL-6000):
Cấu hình mạng mặc định của nhân Linux rất dễ bị dính đòn SYN Flood hoặc IP spoofing. Mở/etc/sysctl.d/99-security.confvà dán khối tham số sau:# Chống tấn công SYN flood net.ipv4.tcp_syncookies = 1 # Chặn gói tin giả mạo IP (IP spoofing) net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 # Không nhận gói ICMP redirect để chống nghe lén MITM net.ipv4.conf.all.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 # Tắt IP forwarding (trừ khi server đóng vai trò NAT/Router) net.ipv4.ip_forward = 0Nạp lại cấu hình ngay mà không cần reboot:
sudo sysctl --system - Quyền ghi bất thường trên thư mục cron (Test ID:
FILE-7524):
Lynis phát hiện một file script trong/etc/cron.daily/bị ai đó set nhầm quyền777. Bất kỳ user dịch vụ nào bị hack cũng có thể ghi đè shellcode vào đây để chiếm quyền root vào ngày hôm sau. Khắc phục ngay lập tức:sudo chmod 700 /etc/cron.daily/backup-script.sh sudo chown root:root /etc/cron.daily/backup-script.sh
Sau khi vá xong 3 mục trên và quét lại, điểm Hardening Index của server nhảy vọt từ 61 lên 79 điểm.
Kiểm tra & Giám sát tự động
Làm bảo mật một lần rồi bỏ xó thì vô nghĩa. Sau vài tuần vận hành, dev cài thêm module hay admin sửa tạm quyền file sẽ khiến hệ thống lại hở như cũ. Vì vậy, ta cần tự động hóa việc này.
Bóc tách số liệu từ lynis-report.dat
Mỗi lần chạy xong, Lynis ghi toàn bộ dữ liệu vào /var/log/lynis-report.dat dưới dạng key-value. Bạn có thể trích xuất nhanh thông tin quan trọng bằng vài dòng lệnh ngắn:
# Đếm tổng số cảnh báo nghiêm trọng
grep -c "^warning\[\]" /var/log/lynis-report.dat
# Xem chỉ số bảo mật hiện tại
grep "^hardening_index=" /var/log/lynis-report.dat | cut -d '=' -f2
Viết script tự động quét và gửi cảnh báo về Telegram
Tạo file script giám sát tại /usr/local/bin/auto-lynis.sh:
#!/bin/bash
set -euo pipefail
REPORT_FILE="/var/log/lynis-report.dat"
TELEGRAM_BOT_TOKEN="123456789:ABCdefGHIjklMNOpqrSTUvwxYZ"
TELEGRAM_CHAT_ID="-1001234567890"
# Chạy audit ẩn không cần tương tác
/usr/sbin/lynis audit system --profile /etc/lynis/custom.prf --cronjob > /dev/null 2>&1
if [ -f "$REPORT_FILE" ]; then
HARDENING_INDEX=$(grep "^hardening_index=" "$REPORT_FILE" | cut -d '=' -f2 || echo "0")
WARNINGS_COUNT=$(grep -c "^warning\[\]" "$REPORT_FILE" || true)
# Bắn cảnh báo nếu xuất hiện lỗi hoặc điểm số tụt dốc
if [ "$WARNINGS_COUNT" -gt 0 ]; then
MESSAGE="⚠️ [BẢO MẬT] Server $(hostname) có vấn đề!%0A- Hardening Index: ${HARDENING_INDEX}/100%0A- Số cảnh báo nguy hiểm: ${WARNINGS_COUNT}%0ACheck log chi tiết: /var/log/lynis.log"
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-d chat_id="${TELEGRAM_CHAT_ID}" \
-d text="${MESSAGE}" > /dev/null
fi
fi
Phân quyền và đặt lịch chạy định kỳ vào 3h sáng Chủ Nhật hàng tuần:
sudo chmod 700 /usr/local/bin/auto-lynis.sh
sudo crontab -e
Dán cấu hình cron vào cuối file:
0 3 * * 0 /usr/local/bin/auto-lynis.sh
Giờ thì bạn có thể yên tâm kê cao gối ngủ. Nếu ai đó lỡ tay mở port lạ, nới lỏng quyền thư mục root hoặc để sót script độc hại, bot Telegram sẽ rung chuông báo cho bạn trước khi kẻ tấn công kịp khai thác.

