Bash pam

Posted by Adam on August 24, 2022
我們可以利用 Linux 的 **PAM (Pluggable Authentication Modules)** 模組,在每次使用者登入成功時觸發腳本。 ### 第一步:準備 Telegram Bot 1. 在 Telegram 搜尋 `@BotFather` 並建立一個機器人,取得 **API Token**。 2. 傳訊息給你的機器人,然後訪問 `https://api.telegram.org/bot<你的Token>/getUpdates` 取得你的 **Chat ID**。 --- ### 第二步:建立通知腳本 請在 Debian 上建立一個腳本(例如 `/usr/local/bin/login_notify.sh`): ```bash sudo vim /usr/local/bin/login_notify.sh ``` 貼入以下內容(請替換 Token 和 Chat ID): ```bash #!/bin/bash # Telegram 設定 TOKEN="你的_BOT_TOKEN" CHAT_ID="你的_CHAT_ID" ACTION="登入" # 取得登入資訊 USER_NAME=$PAM_USER SERVICE=$PAM_SERVICE TTY=$PAM_TTY REMOTE_HOST=$PAM_RHOST TIME=$(date '+%Y-%m-%d %H:%M:%S') # 如果是登出,可以根據需求調整(PAM 也會觸發登出) if [ "$PAM_TYPE" = "close_session" ]; then ACTION="登出" fi # 只有在登入成功時才發送 (open_session) if [ "$PAM_TYPE" = "open_session" ]; then MESSAGE="🔔 *系統登入通知* 🔔%0A━━━━━━━━━━━━━%0A👤 使用者: $USER_NAME%0A🖥 服務: $SERVICE%0A🌐 來源: $REMOTE_HOST%0A⏰ 時間: $TIME" curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \ -d "chat_id=$CHAT_ID" \ -d "text=$MESSAGE" \ -d "parse_mode=Markdown" > /dev/null fi ``` **賦予執行權限:** ```bash sudo chmod +x /usr/local/bin/login_notify.sh ``` --- ### 第三步:設定 PAM 觸發器 我們要把這個腳本掛載到系統的會話管理中。 1. 編輯 PAM 的共通會話設定: ```bash sudo vim /etc/pam.d/common-session ``` 2. 在檔案最後面加入這行: ```text session optional pam_exec.so /usr/local/bin/login_notify.sh ``` --- ### 💡 為什麼要這樣設定? (架構優點) 1. **全面監控**:不論是透過 **SSH**、**本地 TTY** 還是 **sudo su** 登入,只要觸發了 `session` 開啟,PAM 都會執行該腳本。 2. **不影響登入效能**:腳本中使用 `> /dev/null` 和 `curl` 的非阻塞性設計,確保即使 Telegram API 暫時連不上,也不會讓你卡住無法進入系統。 3. **環境變數傳遞**:PAM 會自動提供 `$PAM_USER` (使用者) 和 `$PAM_RHOST` (來源 IP) 等變數,讓你的通知訊息非常精準。 --- ### 4. 進階測試 現在你可以開啟一個新的終端機視窗,嘗試用 SSH 登入你的 Debian: * **如果成功**:你的手機 Telegram 會立刻跳出通知,顯示誰從哪個 IP 進來了。 * **如果沒反應**:請檢查 `/var/log/auth.log`,看看有沒有 `pam_exec` 執行的錯誤訊息。