一套給金融業資訊處 Linux SP 使用的 bash 維運選單工具。單一主選單派遣 17 個模組, 涵蓋日常巡檢、客訴急救、DB 健康檢查、工具盤點、baseline 管理、T0 合規稽核(無 SIEM 也能過關)。
- 合規優先:每個動作寫審計 log(誰、何時、執行什麼、結果)
- 三色風險分級:紅=高風險、黃=變更、白=查詢
- 分層確認:查詢不問、變更按 Enter、高風險輸入
CONFIRM - 交易期間友善:秒級 triage (主選單 15) 與開盤前 baseline diff (主選單 16)
- 跨 distro:自動偵測 RHEL/Rocky/CentOS 與 Ubuntu/Debian
# 1. Clone
git clone https://github.com/alienid4/smit_menu.git
cd smit_menu
# 2. 安裝(需 root)
sudo bash install.sh
# 3. 啟動
bash /CASLog/AI/sos/scripts/LinuxMenu.sh自訂安裝根目錄:
BASE=/opt/smit sudo bash install.shinstall.sh 會建立:
${BASE}/
├── scripts/ 所有 *.sh
├── logs/ 審計 log (LinuxMenu_main_YYYYMMDD.log)
├── reports/ 巡檢 / 客訴報告
│ └── baselines/
└── conf/ db.conf, app.conf, baseline.conf (chmod 600)
| 分類 | 選項 | 名稱 | 主要功能 |
|---|---|---|---|
| 查詢 | 1 | 系統資訊 | uptime / kernel / NTP / 硬體 (BIOS) / 加密熵值 / 開機關機紀錄 |
| 2 | 網路診斷 | ip / route / port / ping / bonding / DNS / ARP / 防火牆 CRUD | |
| 3 | 檔案 & 目錄 | 大檔搜尋 / SUID-SGID 稽核 / world-writable / 敏感檔 sha256 | |
| 4 | 程序監控 | Top CPU / Top MEM / Zombie / FD 耗用排名 / 可疑進程 / pstree | |
| 5 | 帳號 & 權限 | last / lastb / UID=0 全清單 / 空密碼 / sudo / authorized_keys 稽核 | |
| 6 | 日誌 & 稽核 | syslog / authlog / dmesg / auditd / root 登入統計 / sudo 錯誤 | |
| 7 | 套件 / Repo | Repo / CVE 安全更新 / 套件歷史 / GPG key | |
| 8 | 儲存 & 備份 | 磁碟 / inode / LVM / snapshot / fstab 驗證 / iostat / NFS | |
| 變更 | 5 | (同上) | 解鎖帳號、重設失敗計數(黃) |
| 9 | Java & 憑證 | 批次掃所有 keystore / GC 設定 / 重啟服務(紅) | |
| 10 | 安全稽核 | sshd_config / SELinux / fail2ban / auditctl / PAM / 重啟 sshd(紅) | |
| 報表/急救 | 11 | 快速自辯 (Troubleshoot) | 9 面向 + Appendix A,非尖峰用,七段式報告 |
| 15 | 快速 Triage (<1 秒) | 交易期間 / freeze 時專用,秒級檢查 | |
| 12 | 每日巡檢報表 | 18 區塊(含 CVE / 憑證到期 / 帳號變動) | |
| 13 | DB 健康檢查 | Oracle / MSSQL / MySQL / DB2 / PostgreSQL / MongoDB 自動偵測 | |
| 輔助 | 14 | 工具盤點 | 列缺哪些套件、匯 CSV 給變更申請 |
| 16 | Baseline 管理 | 開盤前快照 + diff「今天 vs 平日」 | |
| 17 | 審計封存與驗證 | T0 合規:append-only + HMAC,無 SIEM 也過稽核 |
ssh -t root@<主機> 'bash /CASLog/AI/sos/scripts/LinuxMenu.sh'
# 非尖峰 / 客訴「慢」 → 選 11 (完整 9 面向,~30-60 秒)
# 交易期間 / freeze → 選 15 (秒級,<1 秒,不加重負擔)
# 對比平日差異 → 選 16 → 4 (diff 今天 vs 最近 baseline)| # | 面向 | 檢查 |
|---|---|---|
| 1 | 效能 | Load / CPU idle / Swap / Mem |
| 2 | 頻寬 | NIC err/drop、TCP retrans、Ping、conntrack、TIME_WAIT 佔比、SYN drops |
| 3 | AP | 指定 port 是否有 listener、程序資源、近 1h journal |
| 4 | Session | EST / CLOSE_WAIT / TIME_WAIT、Top 10 來源 IP |
| 5 | Storage | df / inode / /tmp |
| 6 | 時間 / 憑證 | NTP 同步、憑證 30 天內到期 |
| 7 | DB | 呼叫 mod_db auto-check,6 種 DB |
| 8 | Infra 穩定 | OOM kill / MCE / systemd failed / kernel tainted |
| 9 | 運維軌跡 | 近 1h 誰登入 / 改 /etc / restart service(主管問「剛動過什麼」的答案) |
| +A | Appendix A | AP log ERROR / Java GC / jstack(需 conf/app.conf) |
每塊報告七段式:檢查範圍 / 指令 / 正常基準 / 實測值 / 判定依據 / 對客訴影響 / 建議動作。
# 每天開盤前 07:30 自動產生 baseline
sudo tee /etc/cron.d/linuxmenu-baseline >/dev/null <<'EOF'
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
30 7 * * 1-5 root bash /CASLog/AI/sos/scripts/mod_baseline.sh --snapshot >> /CASLog/AI/sos/logs/baseline.log 2>&1
EOF交易中出事,秒級 diff:
- Load(1/5/15m) = 0.30 / 0.25 / 0.20 [PASS] ← 昨天
+ Load(1/5/15m) = 1.49 / 1.40 / 1.35 [PASS] ← 今天
- NIC 錯誤網卡 = 0 張 (err=0 drop=0) [WARN] ← 昨天
+ NIC 錯誤網卡 = 1 張 (err=0 drop=66) [WARN] ← 今天
30 秒看出「今天什麼變了」,比從頭分析快 10 倍。
| 檔 | 用途 | 必要 |
|---|---|---|
db.conf |
DB 連線 (6 種 DB 分段) | 選配 — 沒設就只做偵測 |
app.conf |
AP log 路徑、Java 程序名 (Appendix A 用) | 選配 |
baseline.conf |
Baseline cron 參數 | 選配 |
密碼一律不寫 conf/*.conf,指向各 DB 原生認證檔:
| DB | 認證檔 |
|---|---|
| Oracle | Wallet / TNS alias sqlplus /@APPDB |
| MySQL / MariaDB | ~/.my.cnf [client] section |
| PostgreSQL | ~/.pgpass |
| MSSQL | 自訂檔 (USER= / PASSWORD=) |
| DB2 | 自訂檔 |
| MongoDB | /root/.mongo_uri 單行連線字串 |
所有動作寫入 ${BASE}/logs/LinuxMenu_main_YYYYMMDD.log:
2026-04-20 14:32:05 | Unlock svc_ap02 | OK | passwd -u svc_ap02
2026-04-20 14:35:12 | Restart tomcat | CANCEL | user declined
2026-04-20 14:40:08 | Troubleshoot report | OK | PASS=6 WARN=2 FAIL=1 ...
2026-04-20 14:41:23 | Triage tomcat:8080 | OK | Pass=6 Warn=0 Fail=0 (0.17s)
可 grep FAIL / grep CANCEL / 送 SIEM。
金管會 / FISC 稽核要的是三要素(而非商業 SIEM 本身):
- ✅ 可追溯 —
audit_log已提供(人、時間、項目、結果、指令) - ✅ 不可竄改 — 透過 append-only + HMAC 封存 達成
⚠️ 保留期足夠 — 由 logrotate / 中央備份配合
啟動選單 → 17,或 CLI:
bash ${BASE}/scripts/mod_audit_seal.sh --verify-all # 驗證所有 log 未被動過
bash ${BASE}/scripts/mod_audit_seal.sh --verify LinuxMenu_main_20260420.log
bash ${BASE}/scripts/mod_audit_seal.sh --daily # 手動 seal (平時 cron 自動跑)
bash ${BASE}/scripts/mod_audit_seal.sh --status # 看 key / manifest / cron 狀態| 機制 | 實作 | 效果 |
|---|---|---|
| append-only | chattr +a (主檔啟動時自動) |
連 root 都不能 rm / > 覆寫 log (要先 -a,該動作會被偵測到) |
| HMAC-SHA256 封存 | 每日 23:59 cron 自動 | sha256 + HMAC 存入 manifest;任何竄改都會讓 verify 失敗 |
| 離線 key 備份 | install 時產生 ${BASE}/conf/hmac.key |
把 key 備份到離線安全處,沒 key 無法偽造簽章 |
# 稽核員想確認 2026-04-20 的 log 從當天到現在沒被改:
bash mod_audit_seal.sh --verify LinuxMenu_main_20260420.log
── Verify: LinuxMenu_main_20260420.log ──
manifest sha256 : 7a3b... ← 當天 23:59 封存的
目前 sha256 : 7a3b... ← 現在重算的
manifest hmac : a91f...
目前 hmac : a91f...
結果 : PASS — log 未被竄改 ✓若任何人動過,會 FAIL:
結果 : FAIL — log 已被動過!
| 階層 | 成本 | 技術 | 適用組織 |
|---|---|---|---|
| T0 (本版本內建) | $0 | chattr +a / HMAC / cron | 小型金融、單機應用 |
| T1 中央化 | 1 VM | rsyslog central | 中型機構 |
| T2 自建 SIEM | 3-5 VM | Wazuh / Graylog / Elastic | 大型機構 |
| T3 商業 SIEM | 授權費 | Splunk / ArcSight | 金控集團 |
T0 先過基本稽核,之後有預算再一步步升級,不需重寫本工具。
| Wrapper | 標籤 | 確認 | 場景 |
|---|---|---|---|
run_cmd |
[QUERY] 白 |
無 | ps/df/ss/cat |
run_change_cmd |
[CHANGE] 黃 |
按 Enter | passwd -u, yum makecache |
run_impact_cmd |
[IMPACT] 紅 |
雙重確認:CONFIRM + 打主機名 (10 秒 timeout) |
systemctl restart, kill -9 |
[IMPACT] Restart tomcat
$ systemctl restart tomcat
── 第 1 次確認 ──
此操作具有高度影響,請輸入 CONFIRM 以繼續:
> CONFIRM
── 第 2 次確認 (10 秒內)
主機 : secclient1
使用者 : root
時間 : 2026-04-22 15:30:05
指令 : systemctl restart tomcat
請輸入主機名稱 [secclient1] 以完成二次確認:
> secclient1 ← 必須打對才會執行
雙重確認通過,執行中...
為什麼要打主機名:防止「登錯機敲錯命令」 — 金融業變更事故前三名之一。強制你看清 prompt 顯示的主機。
10 秒 timeout:防止按 CONFIRM 後去接電話回來直接 Enter 誤觸。
失敗類型都進 audit log:
CANCEL 1st-confirm fail: <打錯的值>CANCEL 2nd-confirm timeoutCANCEL 2nd-confirm mismatch: '<打錯>' vs '<正確>'
主檔用 /etc/os-release 偵測,依版本自動切工具:
| distro | 主版 | PKG | FAILLOCK | FW |
|---|---|---|---|---|
| RHEL / Rocky / Alma / CentOS Stream | ≥ 8 | dnf |
faillock |
firewall-cmd |
| RHEL / CentOS 7 | 7 | yum |
pam_tally2 |
firewall-cmd |
| Ubuntu / Debian / LinuxMint | 所有 | apt |
pam_tally2 |
ufw |
其他對應(不分版本):
| 能力 | RHEL family | Debian family |
|---|---|---|
| 認證 log | /var/log/secure |
/var/log/auth.log |
| 系統 log | /var/log/messages |
/var/log/syslog |
| SSH 服務 | sshd |
ssh |
| MAC | sestatus (SELinux) |
aa-status (AppArmor) |
| distro | 版本 | 狀態 |
|---|---|---|
| Rocky Linux | 9.x | ✅ 實機驗證 |
| RHEL / AlmaLinux | 8.x / 9.x | 🟡 code 相容 |
| CentOS | 7.x | 🟡 PKG=yum / FAILLOCK=pam_tally2 分支已處理 |
| Ubuntu | 20.04 / 22.04 / 24.04 | 🟡 code 相容 |
| Debian | 11 / 12 | 🟡 code 相容 |
| Fedora / Oracle Linux / Amazon Linux | — | 🟡 透過 ID_LIKE fallback |
DISTRO_FAMILY # rhel / debian / unknown
DISTRO_ID # rhel / centos / rocky / almalinux / debian / ubuntu / ...
DISTRO_VERSION # 9.7 / 22.04 / 12
DISTRO_VERSION_MAJOR # 9 / 22 / 12
DISTRO_PRETTY # "Rocky Linux 9.7 (Blue Onyx)"| 變數 | 預設 |
|---|---|
CASLOG_BASE |
/CASLog/AI/sos (v1.8 起) |
CASLOG_SCRIPT |
${CASLOG_BASE}/scripts |
CASLOG_LOG |
${CASLOG_BASE}/logs |
CASLOG_REPORT |
${CASLOG_BASE}/reports |
CASLOG_CONF |
${CASLOG_BASE}/conf |
零依賴可跑(只用 bash / ss / ip / systemctl / journalctl 等 OS 內建)。
建議裝(讓 troubleshoot 功能完整):
# RHEL / Rocky / CentOS
sudo dnf install -y sysstat lsof ethtool nmap-ncat chrony iputils \
psmisc fail2ban audit dmidecode java-17-openjdk
# Ubuntu / Debian
sudo apt-get install -y sysstat lsof ethtool netcat-openbsd chrony iputils-arping \
psmisc fail2ban auditd dmidecode openjdk-17-jre或進主選單 14 → 2 讓工具告訴你這台缺哪些。
- ✅ 一般 AP / DB / Jump Host / MIS / 監控主機 (RHEL 7-9, Ubuntu 20.04+)
⚠️ DMZ 資安敏感機(只裝 core)、高頻交易主機(用選項 15 而非 11)- ❌ 容器內 sidecar、K8s 業務 Pod、AIX/Solaris/Mainframe、Alpine/BusyBox
- Oracle wallet / TNS alias 需預先設好
- Java GC 分析(Appendix A A2/A3)需要 JDK 不是 JRE
- SIEM / syslog forwarding 未內建
- 報告簽章 / HMAC 未實作(可外層 rsyslog 接)
| 版本 | 日期 | 內容 |
|---|---|---|
| v1.0 | 2026-04-20 | 首版;16 模組;troubleshoot 9 面向 + DB 6 種 + triage + baseline + tooling |
| v1.1 | 2026-04-20 | 新增選項 17 審計封存與驗證(T0 合規:append-only + HMAC + 每日 cron seal) |
| v1.2 | 2026-04-22 | 預設根路徑 /TWLog/AI → /CASLog/AI;環境變數 TWLOG_* → CASLOG_*(breaking change,需遷移舊部署) |
| v1.3 | 2026-04-22 | run_impact_cmd 升級雙重確認(CONFIRM + 打主機名 + 10 秒 timeout);distro 偵測改用 /etc/os-release,依版本自動切 PKG/FAILLOCK;主選單顯示 distro 資訊 |
| v1.4 | 2026-04-22 | prompt 簡化:能自動判斷就不問 (mod_troubleshoot 自動抓 gateway;mod_file 3 秒 timeout);檔頭內嵌 Build/Deploy 時刻 (head -6 LinuxMenu.sh 可見版本) |
| v1.5 | 2026-04-22 | mod_troubleshoot.sh 輸出重構 — 先印總結字卡 (主機狀態/統計/FAIL+WARN 逐項+動作) 再印細項,5 秒內可判讀客訴 |
| v1.6 | 2026-04-22 | mod_troubleshoot.sh 預設簡潔模式 (只印總結 + 報告路徑),加 -m / -v / --full 才印完整細項;報告檔永遠全版 |
| v1.7 | 2026-04-23 | AP port 智慧偵測 — 無 hardcoded 8080 fallback;白名單擴大 (80/443/3000/5000/7001/8000/8001/8080/8081/8443/9080/9090);偵測不到走 N/A (不 FAIL) |
| v1.8 | 2026-04-23 | 預設根路徑 /CASLog/AI → /CASLog/AI/sos(CASLOG_BASE 可覆蓋);install.sh 偵測舊路徑會提示遷移步驟不自動動手(保護 HMAC key 與 append-only log) |