那天早晨,我握著剛領到的識別證,掌心還殘留微微汗意。穿過圖資大樓長長的走廊,我跟在學長後頭,走進了神秘的電算中心的門口,印入眼簾的是伺服器機架低沈風扇聲,讓我的心臟跟著噗通噗通。這是我第一次正式踏進學校的電算中心,也是我夢想成為系統管理員的起點。
帳號到底有多少?
學長(轉頭,語氣平穩卻藏著期待):
如果你是系統,會把「所有帳號」存在哪?檔案?資料庫?還是雲端?
我:應該是文字檔?
學長:很好,來驗證
Bash
cat /etc/passwd | cut -d: -f1
# 或
getent passwd | cut -d: -f1
看見那一長串帳號時,我突然有種「闖入祕密名冊」的暢快,卻也擔心自己讀不懂裡面每一個陌生名字。
忽然的提問
- 真正能登入的帳號有哪幾個?
- 試找找看哪些使用
/usr/sbin/nologin
作為 shell。
歷史足跡的挖掘,他們上次什麼時候登入?
突然,值班螢幕顯示「帳密嘗試失敗」的警告燈號。我心中一緊,學長眼神也銳利起來,示意我別慌。
學長:想找出誰剛剛嘗試登入?試試看last 。
Bash
last -F | head
last -F james
我照做,螢幕上浮現一連串時間戳;那一刻我體會到日誌不只冷冰冰,它們其實在說故事──登入的故事。
再追
- 若想挖出「從未登入」的帳號?
Bash
sudo lastlog | grep 'Never logged in'
見到好些帳號竟從來沒用過,我心底有股說不出的不安,像是走進空教室卻看見亮著的投影機。
即時監控的刺激
who
w
users
學長反問
這三個指令都讀 /var/run/utmp
,為何輸出長得不一樣?
我邊回答邊感覺自己像在偵探小說裡 抽絲剝繭,每一行紀錄都可能是一條證據。
Linux 帳號安全的小道具
目的 | 指令 | 用法重點 |
---|---|---|
查看群組/UID | id james ・ groups james | 確認權限範圍 |
檢查密碼過期 | chage -l james | 察看密碼輪替 |
登入失敗統計 | faillog -u james | 配合 /var/log/faillog |
SSH 連線紀錄 | journalctl -u ssh.service -S today | systemd 系統 |
當
faillog
跳出多次嘗試失敗的數字,我背脊微涼。學長拍拍我肩:「別怕,數據先讓我們看到危險,剩下的就是行動。」
打造每日警報腳本
主任突然要求「明天起寄送每日登入報表」。時限只剩半天,整個機房氣氛緊繃。我深吸一口氣,決定動手。
腳本
Bash
#!/usr/bin/env bash
set -eu # 非必要,但能提早發現錯誤
TODAY=$(date +'%F') # 2025-05-10
HOST=$(hostname -s) # 短主機名
REPORT="/tmp/${HOST}-login-report-${TODAY}.txt"
# 確保備份目錄存在
install -d -o root -g root -m 0755 /var/backups
{
echo "=== ${TODAY} ${HOST} 登入紀錄 ==="
last -F -w | head -n 50 || echo "(last 指令執行失敗)"
echo
echo "=== 失敗登入嘗試 ==="
sudo faillog -a || echo "(faillog 未取得輸出,可能不是 root)"
echo
echo "=== 新增 / 刪除帳號差異 ==="
if [[ -f /var/backups/passwd.prev ]]; then
diff -u /var/backups/passwd.prev /etc/passwd || true
else
echo "(首次執行,無 baseline)"
fi
} > "$REPORT"
cp /etc/passwd /var/backups/passwd.prev
# 郵件發送
if command -v mail >/dev/null 2>&1; then
mail -s "[Daily] Login & Account Report (${HOST})" sysadmin@example.edu < "$REPORT"
else
echo "⚠️ 系統未安裝 mailx,無法寄送報表" >> "$REPORT"
fi
並在 cron
內排程:
Bash
0 7 * * * /usr/local/sbin/daily_login_report.sh
當測試郵件成功寄出,我胸口一陣暖流!那是「解決問題」的實感。
那一天的收穫
- 帳號名冊:
/etc/passwd
+getent passwd
- 歷史行蹤:
last
、lastlog
- 即時上線:
who
、w
、users
- 安全檢查:
chage
、faillog
、journalctl
- 自動通知:Shell 腳本 +
cron
+mailx
學長臨別提問
- 萬一學校改用 LDAP,這份腳本該怎麼適應?
- 如果資安政策要求「90 天強制改密碼」,你會在腳本裡加什麼檢查邏輯?
我在心裡回答:等下一班值勤時,我就要動手升級它。
走出機房,晚風掠過,我忽然恍悟,原來管理帳號,就像守護入口的觀者者:看得見過往、掌握現在,還得預防未來。