前提条件
- Linuxが稼働するサーバー。
- サーバー上でroot権限またはそれに準ずるsudo権限を持っていること。
重要: ネットワーク系コマンド(netstat/ss)はroot権限が無いとプロセス所有者や詳細が表示されないことがあります。
概要 — どのコマンドをいつ使うか
- who / w: ログインユーザーや端末情報を簡潔に見たいとき。whoは最小限、wは稼働中のコマンドやアイドル時間も表示。
- ps: sshdプロセスやPIDを確認してプロセス単位で対処したいとき。
- netstat / ss: TCP接続レベルで確立済みの接続を確認する、IP/ポート視点の調査に便利。
- last: /var/log/wtmpに基づくログ履歴から現在ログイン中(still logged in)を抽出する際に有用。
who コマンドでアクティブSSH接続を確認
whoは現在ログイン中のユーザー一覧を表示します。ターミナルで次を実行します。
who
期待される出力例:
root pts/0 2020-05-01 02:37 (27.61.161.61)
root pts/1 2020-05-01 02:39 (45.58.38.21)
解説: 各行はユーザー名、端末、ログイン時刻、接続元IPを示します。短く素早く確認したいときに便利です。
w コマンドでより詳細に確認
wはwhoより詳細を出力します。稼働中のプロセスや負荷情報も同時に見られます。
w
期待される出力例:
02:40:07 up 1 day, 18:35, 2 users, load average: 0.02, 0.02, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 27.61.161.61 02:37 1.00s 0.04s 0.01s ssh [email protected]
root pts/1 45.58.38.21 02:39 1.00s 0.02s 0.00s w
解説: WHAT列に現在実行中のコマンドが表示されます。負荷やアイドル時間を同時に把握できます。
ps コマンドでsshdプロセスを確認
sshdのプロセスとPIDを見て、特定の接続に対してプロセス操作(killなど)を行うときに使います。
ps auxwww | grep sshd: | grep -v grep
期待される出力例:
root 609 0.0 0.1 12160 7268 ? Ss Apr29 0:01 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root 35532 0.0 0.2 13864 8796 ? Ss 02:37 0:00 sshd: root@pts/0
root 35669 0.0 0.2 13860 8916 ? Ss 02:38 0:00 sshd: root@pts/1
解説: 各行にPIDがあるため、不要なセッションを個別に終了させる際に役立ちます。
注意: grepでプロセスを絞るときは表記ゆれに注意し、sshdの表示形式が環境により異なる場合があります。
netstat で確立済みのSSH接続を表示
netstatはネットワーク接続を表示します。確立済み(ESTABLISHED)のSSH接続を抽出するコマンド例:
netstat -tnpa | grep 'ESTABLISHED.*sshd'
期待される出力例:
tcp 0 88 45.58.38.21:22 27.61.161.61:8363 ESTABLISHED 35532/sshd: root@pt
tcp 0 0 45.58.38.21:22 45.58.38.21:51166 ESTABLISHED 35669/sshd: root@pt
解説: ローカルIP:ポート と リモートIP:ポート の組み合わせで表示されます。プロセス情報も同時に出力できます。
互換性メモ: recentなディストリでは netstat が非推奨で ss を使う場合が増えています。
last で現在ログイン中の履歴を確認
lastは /var/log/wtmp を参照してログイン/ログアウト履歴を表示します。現在「まだログイン中(still logged in)」なセッションを抽出する例:
last -a | grep -i still
期待される出力例:
root pts/1 Fri May 1 02:39 still logged in 45.58.38.21
root pts/0 Fri May 1 02:37 still logged in 27.61.161.61
reboot system boot Wed Apr 29 08:04 still running 5.4.0-26-generic
解説: 過去の接続履歴や再起動履歴を確認したいときに便利です。ログローテートやファイル破損で情報が欠落する場合があります。
ss コマンドで詳細なソケット情報を得る
ssはnetstatに似ていますが、より高速で詳細な情報を表示できます。
ss | grep -i ssh
期待される出力例:
tcp ESTAB 0 0 45.58.38.21:51166 45.58.38.21:ssh
tcp ESTAB 0 56 45.58.38.21:ssh 27.61.161.61:8363
tcp ESTAB 0 0 45.58.38.21:ssh 45.58.38.21:51166
解説: 各接続の状態やローカル/リモートのポート情報を得られます。netstatよりも詳細なオプションが豊富です。
代替アプローチと応用例
- journalctlでsshdログを追う: 接続エラーや鍵認証の失敗を調査する場合は systemd のログを参照します。
- 例: sudo journalctl -u sshd -f
- ファイアウォールログ確認: iptables/ufwのログに不審接続が記録されている場合があります。
- IDS/ログ集約: 大規模環境ではfail2ban、SIEM、ログコレクタ(Fluentd/Elastic)で接続パターンを集計・可視化します。
いつこれらの方法が失敗するか(注意点)
- /var/log/wtmp が壊れているかローテート後だと last の情報は不完全になります。
- コンテナ化された環境やネットワーク名前空間では netstat/ss の出力がホストと異なることがあります。
- 一部コマンドはroot権限がないとPID/プロセス所有者を表示しないため、表示が欠落します。
運用担当者向けチェックリスト
システム管理者:
- who/w で現在ログイン中のユーザーを一覧化する
- psで該当のsshdプロセスPIDを確認する
- 必要なら該当PIDを安全に終了する(kill -15 → kill -9の順)
セキュリティ担当者:
- netstat/ssで接続元IPとポートを抽出する
- 不審IPはfail2banへ登録、またはファイアウォールで遮断する
- 接続頻度や異常な成功/失敗ログはSIEMにアラート設定する
受け入れ基準
- 実行者がwho/w/ss/psいずれかで現在のSSHログインを一覧できる。
- 必要な情報(ユーザー名、端末、接続元IP、PID)が取得できる。
- root権限が必要な情報については実行時に明示的にsudoを利用している。
テストケース/受け入れテスト例
- ユーザーAがSSHで接続している状態で who を実行し、ユーザーAのエントリが存在すること。
- 該当接続に対応するPIDが ps で見つかること。
- ss または netstat で該当接続が ESTABLISHED と表示されること。
簡易フローチャート(コマンド選択)
flowchart TD
A[調査開始: 接続を一覧したい?] --> B{目的は何か}
B --> |ユーザー一覧| C[who または w]
B --> |プロセスPID| D[ps で sshd を確認]
B --> |ネットワーク接続| E[ss または netstat]
B --> |ログ履歴| F[last -a | grep -i still]
C --> G[結果に応じて掘り下げ]
D --> G
E --> G
F --> G
用語集(1行定義)
- SSH: 安全にリモートログインするためのプロトコル。
- sshd: SSHサーバープロセスの実装。
- wtmp: ログイン/ログアウト履歴を保存するシステムファイル。
まとめ
本記事では、LinuxでアクティブなSSH接続を確認する主要なコマンド(who、w、ps、netstat、ss、last)と、それぞれの使い分けを解説しました。運用上はまず簡易的にwho/wで確認し、必要に応じてpsやssで詳細を掘り下げるフローが実用的です。ログやコンテナ環境では注意点があるため、実行権限や環境特性を考慮して使い分けてください。
重要: 直接プロセスを終了する前に影響範囲を必ず確認し、業務への影響がないことを確かめてください。