Linuxサーバー

サーバーに誰がログインした?SSHとaaPanelのログインを監査し、ログインごとにTelegramで通知する方法

6 ステップ 10 分で読めます 32 回閲覧 0
目次

不正侵入の多くは、誰がログインしているかを誰も確認していないために発見が遅れます。盗まれたパスワードを使う攻撃者は、あなたと同じ方法でログインします。どのIPと鍵が自分のものかを把握していなければ、ログの行は正常に見えてしまいます。本ガイドでは、LinuxサーバーのSSHログインを監査し、各ログインを鍵と照合し、aaPanel(宝塔パネル)のログインを確認し、さらにログインのたびにTelegramへ通知を送る方法を解説します。これにより、見知らぬ相手のログインを数秒で察知できます。

ステップ1:現在ログインしているユーザーを確認する

who                 # interactive sessions
ss -tnp | grep sshd # every SSH connection, including tunnels without a terminal
ポートフォワーディングのみに使われるSSHセッション(ssh -N)はターミナルを開かないため、whoやwには表示されません。必ずss -tnpまたはps -ef | grep "sshd:"もあわせて確認してください。見覚えのないIPからの接続が何日も開いたままになっている場合は、深刻な警告サインです。

ステップ2:ログイン履歴を確認する

last -a | head -30          # successful logins (from /var/log/wtmp)
lastb -a | head -30         # failed logins (from /var/log/btmp)

# Successful SSH logins with the method used (password or key)
grep "Accepted" /var/log/auth.log | tail -50        # Debian / Ubuntu
grep "Accepted" /var/log/secure | tail -50          # Rocky / AlmaLinux / CentOS
journalctl -u ssh -u sshd --since "7 days ago" | grep Accepted

各行には、認証方式、ユーザー、接続元IP、鍵認証の場合は鍵のフィンガープリントが表示されます。

Accepted password for root from 198.51.100.7 port 51234 ssh2
Accepted publickey for root from 203.0.113.20 port 60122 ssh2: ED25519 SHA256:Xq3vR8...

集計すると、すべての接続元IPと認証方式をひと目で確認できます。

grep -h "Accepted" /var/log/auth.log* 2>/dev/null | awk '{for(i=1;i<=NF;i++){if($i=="Accepted")m=$(i+1); if($i=="from")ip=$(i+1)}; print m, ip}' | sort | uniq -c | sort -rn

鍵認証でしかログインしていないのであれば、Accepted passwordの行はすべて疑わしいものです。

ステップ3:鍵のフィンガープリントを照合する

ログインが許可されているすべての鍵のフィンガープリントを一覧表示し、ログに記録されたフィンガープリントと比較します。

ssh-keygen -lf /root/.ssh/authorized_keys
for h in /home/*; do [ -f "$h/.ssh/authorized_keys" ] && ssh-keygen -lf "$h/.ssh/authorized_keys"; done

すべての鍵に、見覚えのあるコメント(alice@laptopなど)が付いているはずです。説明のつかない鍵は削除し、/etc/ssh/sshd_configのAuthorizedKeysFileで鍵ファイルが追加されていないかも確認してください。

ステップ4:aaPanel(宝塔パネル)のログインを確認する

aaPanelではホーム画面に最近のパネルログインが表示され、Logs → Panel logs(パネルログ)ですべてのログインとそのIPを確認できます。コマンドラインからも読み取れます。

sqlite3 /www/server/panel/data/default.db \
  "select addtime, log from logs where type in ('Login','用户登录') order by id desc limit 30"

ログインがあった場合は、同じログでそのセッションが何をしたか(ファイルのアップロード・ダウンロード、cronジョブ、新規サイトなど)を確認します。そのうえで、Settings(設定)でGoogle Authenticator (two-step verification)(二段階認証)を有効にし、セキュリティエントランスを設定し、可能であればパネルへのアクセスをIPで制限してください。詳しくはaaPanelセキュリティ強化ガイドをご覧ください。

ステップ5:SSHログインのたびにTelegramへ通知する

@BotFatherでTelegramボットを作成してメッセージを送り、AIによるサーバー日次レポートガイドの手順でチャットIDを取得します。続いて通知スクリプトを作成します。

cat > /usr/local/bin/ssh-login-alert.sh <<'EOF'
#!/bin/bash
# Called by PAM when an SSH session opens: send user, source IP and host to Telegram
[ "$PAM_TYPE" = "open_session" ] || exit 0
TG_TOKEN="123456789:replace-with-your-bot-token"
TG_CHAT="123456789"
TEXT="SSH login on $(hostname): user=${PAM_USER} from=${PAM_RHOST} at $(date '+%F %T %Z')"
curl -s -m 5 "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
  --data-urlencode "chat_id=${TG_CHAT}" --data-urlencode "text=${TEXT}" >/dev/null 2>&1 &
exit 0
EOF
chmod 700 /usr/local/bin/ssh-login-alert.sh

すべてのSSHセッション(鍵ログインやトンネルを含む)で実行されるよう、PAMに組み込みます。

echo "session optional pam_exec.so /usr/local/bin/ssh-login-alert.sh" >> /etc/pam.d/sshd
grep -i "^UsePAM" /etc/ssh/sshd_config   # must be "UsePAM yes" (the default on most systems)

現在のSSHウィンドウは開いたままにして、別のウィンドウからログインし、Telegramにメッセージが届くことを確認してください。optionalキーワードと5秒のタイムアウトにより、Telegramに障害が起きてもログインが妨げられることはありません。

通知に鍵のフィンガープリントを含めたい場合は、スクリプト内でjournalctl -u ssh -n 20から該当ユーザーの最新のAccepted行を読み取ってください。スクリプトはログインのたびに実行されるため、短く保ってください。

ステップ6:ログイン情報を盗まれにくくする

  • 鍵ログインのみを使用し、パスワード認証を無効にします:LinuxでのSSH鍵ログイン。
  • 同じrootパスワードを複数のサーバーで使い回さないでください。1つのパスワードが盗まれただけで、踏み台サーバーや管理サーバーを含むすべてのマシンに侵入されてしまいます。
  • Fail2banでブルートフォース攻撃をブロックし、可能な限りパネルのポートをインターネットに公開しないでください。
  • 説明のつかないログインを見つけた場合は、他の変更を加える前にLinuxサーバーが侵害されていないか確認する方法に従い、そのサーバーから参照可能だったすべてのパスワードと鍵を変更してください。

よくある質問

lastには何も表示されないが、auth.logにはログインがある

非対話型のセッション(scp、sftp、トンネル)は、wtmpに記録されないことがよくあります。SSHログと上記のPAM通知であれば検知できます。

ログファイルはローテーションされます。どこまで遡れますか?

/var/log/auth.log.1や圧縮された.gzファイルを確認してください(zgrep Accepted /var/log/auth.log*)。より長期の履歴が必要な場合は、ログを別のサーバーに転送するか、Telegram通知を保管しておいてください。

上記の手順で解決しない場合は、サポートチケットを作成してください。IMIDCの24時間365日対応の技術チームがサポートします。サーバーIPと疑わしいログの行を添えていただくと、より迅速に原因を特定できます。

この回答はお役に立ちましたか?

関連チュートリアル