ログを読む
前提:5-3が完了し、crontabが空の状態でホームディレクトリ(~)にいる状態から始めます。サーバーで何か不具合が起きたとき、管理者が真っ先に開くのがログ※1、つまりサーバーが日々つけている「日記帳」です。いつ誰が何をしたか、どんなエラーが起きたかが、すべて時系列で記録されています。このページでは/var/log以下のログファイルと、systemdが管理するjournalctlという2系統のログの読み方を練習します。最後には、世界中から絶えず届いているSSHへの不正アクセスの試行を、自分のサーバーの記録で実際に確認します。
このページではSET 1〜3、合計30行のコマンドを上から順に叩きます。手打ち推奨(コピーは確認用)です。
SET 1 ― /var/logをのぞく
- $ls /var/log
- auth.log dpkg.log syslog ufw.log ...
- $ls -lh /var/log
- $ls -lh /var/log/syslog
- $file /var/log/syslog
- $sudo tail /var/log/syslog
- $sudo tail -n 20 /var/log/syslog
- $sudo wc -l /var/log/syslog
- $sudo tail -f /var/log/syslog
- $Ctrl+C
- $cd ~
1行目のls /var/logで、Ubuntuの伝統的なログ保管場所を覗きます。出力例のように、システム全体の動きを記録するsyslog、ログイン試行を記録するauth.log、パッケージ操作を記録するdpkg.logなど、目的別にファイルが分かれています。1-1の終盤で一度素通りした場所ですが、ここが第5章の主役です。
2〜3行目のls -lhでサイズを確認すると、常に稼働しているサーバーではこれらのファイルがどんどん大きくなっていくことがわかります。4行目のfile(1-4で登場済み)で、syslogがプレーンテキストのファイルであることを確認できます。
5行目のsudo tail /var/log/syslogで末尾(デフォルトで10行)を確認します。sudoが必要なのは、ログファイルには他のユーザーの操作記録なども含まれるため、一般ユーザーには読み取り権限が与えられていないファイルがあるからです。6行目のように-n 20を付ければ表示件数を増やせます(1-4のtailの復習です)。7行目のwc -lで、ファイル全体が何行あるかを数えると、その量の多さに驚くはずです。
8行目のsudo tail -f /var/log/syslogで、5-3でも使った追記監視モードに入ります。裏で動くあらゆるサービスの活動が、ほぼリアルタイムで画面に流れてくるのが確認できるはずです。何行か流れるのを眺めたら、9行目のCtrl+Cで監視を終了します。
syslogは「とりあえずここを見ればサーバー全体の様子がわかる」総合日記帳です。特定のサービスで何かおかしいと感じたら、まずはsudo tail -n 50 /var/log/syslogのように広めに末尾を眺める、というのが調査の第一歩になります。

最初/var/logのファイル名の多さにビビったんだけど、全部読む必要はないよ! まずはsyslogと、あとで出てくるauth.logの2つだけ覚えておけば、初心者のうちは十分戦えるから安心して。
SET 2 ― journalctlでsystemdのログを見る
- $journalctl -n 20
- $q
- $journalctl -u ssh --since today
- Jul 02 09:00:11 ip-172 sshd[512]: Server listening on 0.0.0.0 port 22.
- $q
- $journalctl -u ssh --since today | wc -l
- $journalctl -u cron --since today | tail
- $journalctl -p err --since today
- $journalctl -f
- $Ctrl+C
- $cd ~
5-2で扱ったsystemdは、実は独自の統合ログシステムjournal※2も持っています。/var/logがテキストファイルの集まりなのに対し、journalはバイナリ形式で保存され、専用コマンドjournalctlで検索・閲覧します。1行目のjournalctl -n 20で直近20件のログをまとめて表示し、ページャーが開くので2行目のqで抜けます。
3行目のjournalctl -u ssh --since todayが、このコマンドの真骨頂です。-u(unit)で特定のサービスに絞り込み、--since todayで今日の分だけに絞れます。出力例のように、sshサービスが起動してポート22で待ち受けを開始した記録などが見られます。確認できたら4行目のqで抜け、5行目のようにwc -lとつなげば件数だけも確認できます。
6行目でも同様にcronサービスに絞り、tailと組み合わせて直近の分だけを見ています。/var/log/syslogをgrepで絞り込むより、journalctl -uで最初からサービス単位に絞る方がずっと効率的です。7行目のjournalctl -p err --since todayのように-p(priority)で絞れば、エラーレベル以上のログだけを抽出することもできます。
8行目のjournalctl -fは、5-3のtail -fのjournal版です。あらゆるサービスの新着ログをリアルタイムで流し続けます。少し眺めたら9行目のCtrl+Cで終了します。
「テキストファイルを直接見たいなら/var/log」「特定のサービスに絞って時系列で追いたいならjournalctl -u」と使い分けてください。実務ではsystemdで管理されているサービスの調査はほぼjournalctlが主役になります。
SET 3 ― auth.logで不正アクセスの痕跡を見る
- $sudo tail -n 30 /var/log/auth.log
- Jul 02 03:14:02 sshd[8821]: Failed password for root from 185.220.xx.xx port 51422
- Jul 02 03:14:05 sshd[8821]: Failed password for invalid user admin from 185.220.xx.xx
- $sudo wc -l /var/log/auth.log
- $sudo grep 'Failed password' /var/log/auth.log | wc -l
- $sudo grep 'invalid user' /var/log/auth.log | tail -n 5
- $sudo grep 'Accepted password\|Accepted publickey' /var/log/auth.log
- $sudo grep 'Accepted' /var/log/auth.log | wc -l
- $sudo grep 'Failed password' /var/log/auth.log | tail -n 5
- $sudo grep -c 'Failed password' /var/log/auth.log
- 247
- $last -n 5
- $cd ~
1行目のsudo tail -n 30 /var/log/auth.logで、ログイン認証に関するすべての記録を保管するauth.logを確認します。出力例のようなFailed password for root from 185.220.xx.xxという行を見つけたら、それは実在の攻撃の記録です。あなたのサーバーがインターネットに公開された瞬間から、世界中のボットが「よくあるユーザー名・パスワードの組み合わせ」を延々と試し続けています。これは特別なことではなく、SSHをインターネットに公開しているすべてのサーバーで日常的に起きている現象です。2行目のwc -lで、記録全体の行数を確認しておきます。
3行目のsudo grep 'Failed password' /var/log/auth.log | wc -lで、失敗したログイン試行が何件記録されているかを数えます。サーバーを立てて数日も経てば、数十件〜数百件に達していることも珍しくありません。4行目のgrep 'invalid user'のように絞り込むと、そもそも存在しないユーザー名でログインを試みた記録だけを抜き出すこともできます。
5行目のgrep 'Accepted password\|Accepted publickey'(3-4で学んだ-eを使わない\|によるOR検索)では、逆に成功したログインだけを抽出します。ここに見覚えのない記録が無いかを確認するのは、管理者の基本的な習慣です。6行目のwc -lで、成功したログインの総数も数えておきます。
7行目で直近の失敗試行を確認したら、8行目のgrep -c(3-4で学んだ件数カウント)で失敗試行の総数を数えます。3行目のgrep ... | wc -lと同じ答えが返ってくるはずで、「パイプでwc -lにつなぐ」「-cオプションを使う」という2通りの数え方があることの復習になります。9行目のlastは、auth.logとは別の記録(wtmp)から「誰がいつどこからログインしたか」の履歴を新しい順に表示するコマンドです。見覚えのない記録が無いかを確認したら、10行目のcd ~でホームに戻ってこのページを締めくくります。こうした不正アクセスの試行そのものを止める手立ては次の5-6(ファイアウォール)で扱いますが、まずは「自分のサーバーは常に外部から狙われている」という現実を、実際のログで体感しておくことが何より重要です。

あたしも初めてauth.logで知らない国のIPアドレスからのFailed passwordの山を見たとき、ちょっとゾッとしたんだよね。でも慌てなくて大丈夫、これは「サーバーが攻撃されてる」んじゃなくて「インターネット上のどのサーバーにも起きてる日常」だから。次のページでちゃんと守り方を学ぶから安心して!
Failed passwordの量に驚く必要はありませんが、Accepted(成功したログイン)の方に見覚えのないIPアドレスや時間帯が無いかは必ず確認してください。もし不審な成功ログインがあれば、パスワードの変更やSSH鍵の見直しなど、即座の対応が必要です。
まとめ
5-4では、/var/logのテキストログとjournalctlのsystemdログという2系統の読み方を身につけ、実際のauth.logから不正アクセスの痕跡を確認しました。このページで叩けるようになったコマンドを一覧にまとめます。
| コマンド | 何をするか | 覚え方 |
|---|---|---|
ls /var/log | ログファイルの置き場所を一覧する | 日記帳の棚 |
sudo tail /var/log/syslog | システム全体のログ末尾を見る | 総合日記帳 |
sudo tail -f /var/log/syslog | ログの追記をリアルタイム監視する | 日記が書かれる瞬間を見る |
journalctl -n 20 | 直近20件のsystemdログを見る | journal = systemd版の日記帳 |
journalctl -u <サービス> | 特定サービスのログに絞り込む | unit(そのサービスだけ) |
journalctl -f | systemdログをリアルタイム監視する | followのf |
sudo tail /var/log/auth.log | ログイン認証の記録を見る | authentication(認証) |
last | ログイン履歴を新しい順に表示する | 最近(last)入ってきたのは誰? |
次のページ「5-5. ネットワークを確認する」では、その不正アクセスがどんな経路でやってくるのかを理解するために、IPアドレス・ポート・自分のサーバーのネットワーク状態を確認していきます。