Hướng dẫn sử dụng Lynis quét và đánh giá bảo mật Linux Server thực chiến

Security tutorial - IT technology blog
Security tutorial - IT technology blog

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:

  1. 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 3

    Khở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.

  2. 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.conf và 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 = 0

    Nạp lại cấu hình ngay mà không cần reboot:

    sudo sysctl --system
  3. 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ền 777. 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.

Share: