Lynis 是開源、無代理端、基於 Shell 的系統安全稽核工具,支援 Linux、FreeBSD、macOS、Solaris。掃描範圍涵蓋核心參數、檔案系統權限、服務設定、網路服務、使用者帳號、登入記錄、加密政策、軟體漏洞等數百項檢查。適合合規稽核 (PCI-DSS、HIPAA、ISO 27001)、滲透測試前偵察、定期基線檢查。本文說明安裝、掃描模式、結果解讀與自動化整合。
# Debian/Ubuntu
sudo apt-get update && sudo apt-get install lynis
# RHEL/CentOS/Fedora (需 EPEL)
sudo yum install epel-release && sudo yum install lynis
# Arch
sudo pacman -S lynis
# 新增 CISOfy 官方倉庫
wget -O - https://packages.cisofy.com/keys/cisofy-software-public.key | sudo apt-key add -
echo "deb https://packages.cisofy.com/community/lynis/deb/ stable main" | sudo tee /etc/apt/sources.list.d/lynis.list
sudo apt-get update && sudo apt-get install lynis
cd /tmp
wget https://downloads.cisofy.com/lynis/lynis-3.0.9.tar.gz
tar zxvf lynis-3.0.9.tar.gz
cd lynis
./lynis audit system
sudo lynis audit system
# 或快速模式 (僅顯示警告/建議)
sudo lynis audit system --quick
# 查看所有可用類別
sudo lynis show categories
# 掃描特定類別
sudo lynis audit system --categories "kernel,memory,processes"
sudo lynis audit system --categories "firewall,ssh,webserver"
# 列出所有測試項目
sudo lynis show tests
# 執行單一測試
sudo lynis audit system --tests "FILE-6354" --quick
sudo lynis audit system --cronjob --auditor "automated" > /var/log/lynis-report-$(date +%F).log
# --cronjob: 靜默模式、返回碼 0=無發現、1=有警告、2=有錯誤、255=錯誤
# --auditor: 標記稽核者身分
# 掃描宿主機 (含容器視角)
sudo lynis audit system --docker
# 掃描特定容器 (需容器內有 lynis)
docker exec -it container_name lynis audit system
[+]:通過[-]:失敗/不符合[!]:警告 (建議改善)[*]:資訊/建議| 檔案 | 內容 |
|---|---|
/var/log/lynis.log | 完整掃描過程、每項測試結果、詳細說明 |
/var/log/lynis-report.dat | 機器可讀報告 (Key=Value),適合程式解析 |
# 警告項目
grep "Warning" /var/log/lynis.log
# 建議項目
grep "Suggestion" /var/log/lynis.log
# 失敗項目
grep "Error" /var/log/lynis.log
# 解析報告檔
grep "^warning=" /var/log/lynis-report.dat
grep "^suggestion=" /var/log/lynis-report.dat
掃描結束顯示 Lynis security scan details: Hardening index: 68/100。分數參考:
Lynis 支援自訂測試 (Lua 腳本),放置於 /etc/lynis/custom-tests/:
# /etc/lynis/custom-tests/my_ssh_port.lua
-- 檢查 SSH 埠是否非 22
local port = 22
local f = io.open("/etc/ssh/sshd_config", "r")
if f then
for line in f:lines() do
if line:match("^Port%s+(%d+)") then
port = tonumber(line:match("^Port%s+(%d+)"))
break
end
end
f:close()
end
if port ~= 22 then
report_finding("SSH-9001", "INFO", "SSH port changed to " .. port)
else
report_finding("SSH-9001", "WARNING", "SSH using default port 22")
end
# /etc/systemd/system/lynis-scan.service
[Unit]
Description=Lynis Security Audit
[Service]
Type=oneshot
ExecStart=/usr/bin/lynis audit system --cronjob --auditor "systemd-timer"
StandardOutput=append:/var/log/lynis-scan.log
# /etc/systemd/system/lynis-scan.timer
[Unit]
Description=Daily Lynis Scan
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
systemctl enable --now lynis-scan.timer
- name: Run Lynis audit
command: lynis audit system --cronjob
register: lynis_result
changed_when: false
failed_when: lynis_result.rc > 1
- name: Parse warnings
debug:
msg: "{{ item }}"
loop: "{{ lynis_result.stdout_lines }}"
when: "'Warning' in item or 'Suggestion' in item"
#!/bin/bash
# check_lynis.sh
OUTPUT=$(/usr/bin/lynis audit system --cronjob 2>&1)
RC=$?
if [ $RC -eq 0 ]; then
echo "OK: Lynis scan passed | hardening_index=80"
exit 0
elif [ $RC -eq 1 ]; then
echo "WARNING: Lynis found warnings | hardening_index=65"
exit 1
elif [ $RC -eq 2 ]; then
echo "CRITICAL: Lynis found errors | hardening_index=45"
exit 2
else
echo "UNKNOWN: Lynis execution failed"
exit 3
fi
| 優點 | 缺點/限制 |
|---|---|
| 零依賴、單一 Shell 腳本、極易部署 | 檢查項目廣度大但深度有限 (不深入特定應用如 PHP/Apache/MySQL 細節設定) |
| 支援離線/隔離環境掃描 | 無即時防護能力,屬事後稽核工具 |
| 輸出機器可讀格式,易整合 SIEM/CI/CD | 預設規則可能產生誤報,需調整閾值/白名單 |
| 社群活躍、規則定期更新 | 商業版 (Lynis Enterprise) 提供更深度掃描、修復指引、合規報告 |
Lynis 是 Linux 系統管理員「必備工具箱」核心成員。安裝簡單、掃描快速、輸出結構化,適合:每日基線掃描、變更前後對比、合規證據收集、滲透測試偵察。建議建立 systemd timer 每日自動掃描,並將 Hardening Index 趨勢圖納入儀表板,異常下降立即告警。