Hướng dẫn audit an ninh Ubuntu Server với Lynis: Quét lỗ hổng và tối ưu bảo mật thực chiến

Ubuntu tutorial - IT technology blog
Ubuntu tutorial - IT technology blog

Quick start: Quét bảo mật máy chủ trong 5 phút

Vừa dựng xong VPS mà chưa rõ hệ thống còn hở những gì? Bạn hãy chạy ngay các lệnh bên dưới. Gói Lynis trong repo mặc định của Ubuntu thường khá cũ. Vì vậy, lấy trực tiếp từ repository của hãng CISOfy là lựa chọn chuẩn nhất.

# 1. Thêm repo chính thức của CISOfy
sudo apt update && sudo apt install -y curl apt-transport-https
curl -fsSL https://packages.cisofy.com/keys/cisofy-software-public.key | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/cisofy.gpg
echo "deb [arch=amd64] https://packages.cisofy.com/community/lynis/deb/ stable main" | sudo tee /etc/apt/sources.list.d/cisofy-lynis.list

# 2. Cài đặt Lynis
sudo apt update
sudo apt install -y lynis

# 3. Chạy audit toàn bộ hệ thống
sudo lynis audit system --quick

Cờ --quick giúp tiến trình chạy liền mạch mà không dừng chờ bạn nhấn Enter. Sau chừng 2 đến 3 phút, màn hình sẽ trả về điểm Hardening index trên thang 100, đi kèm danh sách Warnings (nguy cơ cao) và Suggestions (gợi ý khắc phục).

Lynis hoạt động thế nào và đọc kết quả ra sao?

Lynis là công cụ kiểm toán an ninh nội bộ (host-based auditing). Không như Nmap chỉ rà cổng mạng từ ngoài vào, Lynis chạy trực tiếp trong OS dưới quyền root. Tool rà soát sâu từ kernel, quyền file nhạy cảm, tài khoản hệ thống, service systemd, cấu hình SSH đến các bản vá còn thiếu.

Hồi mới chuyển từ CentOS sang Ubuntu, mình từng chủ quan nghĩ bật sẵn UFW và Fail2ban là server đã an toàn. Đến khi chạy Lynis lần đầu trên con máy chạy web app Node.js, điểm Hardening Index vỏn vẹn 58/100. Công cụ chỉ ra một loạt cấu hình lỏng lẻo mà bình thường chẳng ai để ý.

Đọc file log và phân loại mức độ rủi ro

Mỗi lượt quét hoàn tất, hệ thống sẽ ghi lại hai file quan trọng:

  • /var/log/lynis.log: Lưu chi tiết từng bài test và lệnh thực thi.
  • /var/log/lynis-report.dat: Báo cáo cô đọng gồm các thông số kỹ thuật và mã gợi ý.

Đừng tốn thời gian đọc cả nghìn dòng log thô. Bạn chỉ cần grep nhanh hai nhóm dữ liệu cốt lõi:

# Lọc các cảnh báo đỏ nguy hiểm
sudo grep -E "^Warning:" /var/log/lynis.log

# Lọc toàn bộ khuyến nghị kèm mã test-id
sudo grep -E "^Suggestion:" /var/log/lynis.log

Mỗi suggestion đều gắn liền với một mã định danh, ví dụ SSH-7408 hay FILE-7524. Muốn xem hướng dẫn xử lý chi tiết từ tác giả, bạn gõ thẳng lệnh:

lynis show details SSH-7408

3 nhóm khuyến nghị hay gặp nhất trên Ubuntu

Quan sát trên cụm 8 máy chủ production, mình thấy 3 nhóm cấu hình sau đây luôn kéo tụt điểm nhiều nhất:

  • Kernel hardening (KRNL-5830): File /etc/sysctl.conf chưa bật chống giả mạo IP (IP spoofing) và chống tràn bộ nhớ SYN flood.
  • Cấu hình SSH (SSH-7408): Server vẫn mở port forwarding, chưa siết ClientAliveInterval 300, hoặc còn giữ cipher yếu.
  • Phân vùng /tmp lỏng lẻo: Các thư mục /tmp và /var/tmp chưa gắn cờ mount noexec,nosuid,nodev. Kẻ tấn công có thể tải script độc vào đây rồi chạy trực tiếp.

Tự động hóa lịch quét và gửi cảnh báo

Quét tay một lần rồi bỏ xó sẽ không giải quyết được vấn đề. Mỗi lần bạn deploy code, sửa user hay cài thêm package, cấu hình bảo mật rất dễ bị xô lệch. Đặt lịch audit tự động vào ban đêm sẽ giúp bạn kiểm soát rủi ro liên tục.

Tạo custom profile để lọc bớt cảnh báo rác

Mỗi máy chủ đảm nhận một nhiệm vụ riêng. Một web server thuần Nginx hiển nhiên không cần đo đạc Apache hay máy in CUPS. Hãy tạo file profile riêng để tắt bớt các bài test thừa:

sudo nano /etc/lynis/custom.prf

Thêm vào cấu hình ngắn gọn:

# Bỏ qua test Apache nếu chỉ chạy Nginx
skip-test=HTTP-6622

# Bỏ qua test dịch vụ in ấn (CUPS)
skip-test=PRNT-3802

# Ẩn các cảnh báo không có mô tả rõ ràng
silence_warnings_without_description=yes

Thiết lập Cronjob audit hàng tuần

Tạo một shell script để chạy Lynis ở chế độ cronjob (không màu mè ANSI, không cần terminal) và ghi log khi xuất hiện cảnh báo:

sudo nano /usr/local/bin/run-lynis-audit.sh

Nội dung script:

#!/bin/bash
LOG_FILE="/var/log/lynis-cron.log"
DATE=$(date +'%Y-%m-%d')

# Chạy audit ngầm với profile riêng
/usr/sbin/lynis audit system --cronjob --profile /etc/lynis/custom.prf > "$LOG_FILE"

# Đếm số cảnh báo mới trong log
WARNINGS=$(grep -c "^Warning:" /var/log/lynis.log)
if [ "$WARNINGS" -gt 0 ]; then
    echo "[!] $DATE: Phat hien $WARNINGS canh bao an ninh Lynis!" >> /var/log/security-alerts.log
fi

Cấp quyền chạy script và đặt lịch kích hoạt lúc 3 giờ sáng thứ Hai hàng tuần:

sudo chmod +x /usr/local/bin/run-lynis-audit.sh
echo "0 3 * * 1 root /usr/local/bin/run-lynis-audit.sh" | sudo tee /etc/cron.d/lynis-weekly

Kinh nghiệm thực chiến từ hệ thống production

Sau hơn nửa năm áp dụng Lynis cho cả dàn server staging lẫn production, đây là những bài học xương máu bạn nên lưu ý:

  • Đừng cố cày điểm 100/100: Mức điểm lý tưởng nằm trong khoảng 75 đến 85. Ép điểm lên trên 90 đòi hỏi khóa kernel rất gắt và siết quyền cực đoan, rất dễ bóp chết Docker daemon, tiến trình Node.js hoặc GitLab runner.
  • Thận trọng khi tinh chỉnh sysctl: Tham số chống giả mạo gói tin net.ipv4.conf.all.rp_filter = 1 rất dễ xung đột với network bridge của Docker hoặc VPN WireGuard. Hãy test kỹ trên dev trước khi áp dụng lên production.
  • Giám sát toàn vẹn file với AIDE: Lynis chỉ chỉ ra điểm yếu cấu hình tại thời điểm quét. Muốn biết file hệ thống trong /etc hay /bin có bị can thiệp trái phép hay không, bạn nên kết hợp thêm AIDE hoặc Tripwire.
  • Gom log về một mối: Nếu quản lý từ 3 node trở lên, đừng kiểm tra file lynis-report.dat thủ công trên từng máy. Hãy đẩy thẳng chỉ số về Grafana Loki hoặc rsyslog tập trung để tiện vẽ biểu đồ theo dõi.
Share: