傳統 history 僅記錄命令,無時間戳、無登入 IP、用戶可篡改 ~/.bash_history,事後無法追溯「誰在何時從哪裡執行了什麼」。
/etc/profile 注入審計腳本# 追加至 /etc/profile 末尾
cat >> /etc/profile <<'EOF'
# === 審計日誌配置 ===
HISTDIR="/var/log/user_audit"
mkdir -p "$HISTDIR"
chmod 755 "$HISTDIR"
# 取得真實登入 IP(支援 SSH、控制台、su/sudo)
USER_IP=$(who -u am i 2>/dev/null | awk '{print $NF}' | tr -d '()')
[[ -z "$USER_IP" ]] && USER_IP=$(hostname)
# 每用戶每 IP 獨立日誌目錄
USER_DIR="$HISTDIR/${LOGNAME}_${USER_IP//./_}"
mkdir -p "$USER_DIR"
chmod 700 "$USER_DIR"
# 歷史記錄參數
export HISTSIZE=10000
export HISTFILESIZE=10000
export HISTTIMEFORMAT="%F %T "
# 日誌檔名含時間戳,按天輪轉
export HISTFILE="$USER_DIR/$(date +%Y%m%d).audit.log"
# 即時寫入(避免進程崩潰丟失)
shopt -s histappend
PROMPT_COMMAND="history -a; ${PROMPT_COMMAND:-:}"
# 僅 root 可讀取審計目錄
chmod 700 "$HISTDIR"
EOF
| 配置 | 作用 |
|---|---|
HISTTIMEFORMAT | 每條記錄前自動加上 YYYY-MM-DD HH:MM:SS |
HISTFILE 含日期 | 天級輪轉,便於歸檔與 logrotate 管理 |
histappend + PROMPT_COMMAND | 每次提示符前追加寫入,而非 Shell 退出時一次性寫入 |
目錄權限 700 | 防止普通用戶竄改或刪除審計日誌 |
| IP 獲取邏輯 | who -u am i 可識別 SSH 客戶端 IP;控制台回退主機名 |