前回のスクリプトを、セキュリティ対策としてSSHのログの記録を記載していたが、結局痕跡を消されては意味が無いためログイン成功or失敗時にDiscordへ通知させるように、改良してみた。
本来はLINE Keepにしたかったが Discordのwebhookがあまりにも簡単だったので採用した
# ログファイルのパス
LOGFILE="$HOME/.ssh/.log/all_sshauthlog.log"
# ログディレクトリが存在しない場合は作成
if [ ! -d "$HOME/.ssh/.log" ]; then
mkdir -p "$HOME/.ssh/.log"
fi
# ログファイルにSSH認証の成功・失敗の履歴を記録
sudo journalctl -u ssh | grep -E "Accepted|Failed password" >> "$LOGFILE"
# カラーコードの設定
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # 色リセット
# ログイン履歴の最後の3回をフォーマットして表示
echo -e "最後の3回のログイン履歴:\n"
tail -n 3 "$LOGFILE" | while read line; do
# 日付を抽出
DATE=$(echo "$line" | awk '{print $1, $2, $3}')
# 成功か失敗かを判定
if echo "$line" | grep -q "Accepted"; then
STATUS="Accepted"
else
STATUS="Failed"
fi
# IPアドレスを抽出
IP=$(echo "$line" | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}')
# 結果を表示
echo -e "${YELLOW}$DATE${NC}"
echo -e " Status: $STATUS"
echo -e " IP Address: ${YELLOW}$IP${NC}\n"
# メッセージを作成
msg="Date: $DATE\nStatus: $STATUS\nIP Address: $IP"
# senddiscord.sh Discord送信用スクリプトにメッセージを送信
.ssh/senddiscord.sh "$msg"
done
senddiscord.sh
#!/bin/bash
# DiscordのウェブフックURL
WEBHOOK_URL="https://discord.com/api/...."
# 送信したいメッセージ(引数1で指定)
MESSAGE="$1"
# メッセージが指定されていない場合のエラーメッセージ
if [ -z "$MESSAGE" ]; then
echo "Usage: $0 <message>"
exit 1
fi
# 特殊文字をエスケープ
ESCAPED_MESSAGE=$(echo "$MESSAGE" | sed 's/"/\\"/g' | sed "s/'/\\'/g")
# curlを使ってメッセージを送信
curl -H "Content-Type: application/json" \
-d "{\"content\": \"$ESCAPED_MESSAGE\"}" \
$WEBHOOK_URL
結果 Discord
Date: Sep 17 19:12:21
Status: Accepted
IP Address: xx.xxx.xx.xx