🚀 ニフティ’s Notion

【サーバー運用入門2025 #3】シェル操作とログ調査

🏁この章の目指すところ🏁
シェルコマンドとその挙動をなんとなく理解する
ログの役割、どこにログがあるのかをなんとなく理解する
ログを調査する方法をなんとなく理解する

シェル操作

シェル操作は、LinuxやmacOSなどのUnix系OSでの作業を効率化するための重要なスキルです。

どの部署に配属されても多分逃げられません。

シェルコマンド

以下に、いくつかの基本的なシェルコマンドを紹介します。

  1. ls : ディレクトリの内容をリストします。オプションを追加することで、詳細な情報を表示したり、特定のパターンに一致するファイルだけを表示したりできます。
ls -l  # 詳細な情報を表示
ls *.txt  # .txtで終わるファイルだけを表示
  1. cd : 現在のディレクトリを変更します。
cd /path/to/directory  # 指定したディレクトリに移動
cd ..  # 一つ上のディレクトリに移動
  1. cat : ファイルの内容を表示します。
cat filename
  1. grep : ファイルの中から特定のパターンに一致する行を検索します。
grep 'pattern' filename
  1. sort : ファイルの行をソートします。
sort filename
  1. uniq : 連続する重複行を削除します。 sort と組み合わせてよく使われます。
sort filename | uniq
  1. awk : ファイルの各行に対して特定の処理を行います。フィールド(列)の抽出や計算などに使われます。
awk '{print $1}' filename  # 各行の1列目を表示
  1. cut : ファイルの各行から特定のフィールドを抽出します。
cut -d':' -f1 filename  # コロンで区切られた各行の1フィールド目を表示
  1. wc : ファイルの行数、単語数、文字数を数えます。
wc -l filename  # ファイルの行数を表示

これらのコマンドは、パイプ ( | ) を使って組み合わせることができます。これにより、一連の処理を一行のコマンドで実行することができます。例えば、ファイルから特定のパターンに一致する行を検索し、その行数を数えるには以下のようにします:

grep 'pattern' filename | wc -l

これらは基本的なコマンドの一部ですが、これらを理解し使いこなせるようになると、シェルでの作業が大幅に効率化します。

ログの調査

ロギングの役割

ロギングはシステム開発において重要な役割を果たし、以下の目的で使用されます。

運用面:

  • システムの動作状況確認・異常検知
    • システムログを監視し、正常な動作や障害の早期検知する
  • セキュリティ監視
    • 不正アクセスやセキュリティ侵害を検出する
  • パフォーマンスの監視と最適化
    • ログデータを分析することにより、システムのボトルネックを特定する
  • 監査
    • 法的な要件を満たすために監査ログを維持する場合もある

開発面:

  • トラブルシューティング
    • アプリケーションの問題やエラーの原因を特定し、バグを修正する
    • デバッグログやスタックトレースにより開発中の問題を特定する
  • 履歴とユーザー行動の分析
    • システムの操作と変更の履歴を記録して、問題発生時に変更の影響を特定する
    • 履歴からユーザー行動を分析して、改善や新規機能開発に利用する

どういう時にログの調査をするの?
  • エラーまたは例外が発生したとき
    • プログラムが予期しない動作をしたり、エラーをスローした場合、ログを調査することで問題の原因を特定しやすくなります。
  • システムのパフォーマンスが低下したとき
    • ログにはシステムの動作に関する詳細な情報が含まれているため、パフォーマンスの問題を特定するのに役立ちます。
  • セキュリティ違反が疑われるとき
    • 不正アクセスやデータ侵害の試みがあった場合、ログを調査することで攻撃の詳細や範囲を理解することができます。
  • システムの動作を監視または分析するとき
    • ログはシステムの動作に関する貴重な情報を提供します。これを利用して、システムの使用状況を理解したり、将来の問題を予測したりすることができます。

調査方法

ログの調査には様々なコマンドや方法がありますが、一般的によく使われるものをいくつか紹介します。

  1. cat : ファイルの内容を表示します。全てのログを一度に見ることができます。
    cat /path/to/your/logfile.log
    サンプル
    06:47:18 PM ❯ cat /path/to/your/logfile.log
    2024-04-10 21:21:50,848:DEBUG:Data updated.
    2024-04-11 02:04:14,362:INFO:User logged in.
    2024-04-11 05:07:31,008:DEBUG:Server started.
    2024-04-11 06:33:54,502:ERROR:User logged in.
    2024-04-11 13:28:24,182:INFO:Error occurred.
    2024-04-11 17:14:55,535:WARNING:Error occurred.
    2024-04-11 18:14:11,176:DEBUG:Data updated.
    2024-04-11 22:35:59,172:WARNING:Data updated.
    2024-04-12 02:29:46,826:INFO:Data updated.
    2024-04-12 16:45:25,465:DEBUG:Data updated.
    2024-04-13 01:24:23,894:CRITICAL:Server started.
    2024-04-13 07:23:47,616:WARNING:Server shut down.
    2024-04-14 00:40:12,622:CRITICAL:Data updated.
    2024-04-14 00:10:00,845:ERROR:User logged in.
    2024-04-14 03:27:53,526:CRITICAL:Server shut down.
    2024-04-14 06:29:58,826:ERROR:Error occurred.
    2024-04-14 10:33:27,149:ERROR:Error occurred.
    2024-04-14 10:21:07,091:DEBUG:Server shut down.
    2024-04-14 12:14:40,898:ERROR:Server started.
    2024-04-14 18:56:47,926:CRITICAL:Server started.
    2024-04-14 20:00:19,939:DEBUG:Data updated.
    (省略)
  2. less または more : ファイルの内容をページ単位で表示します。大きなログファイルを扱う際に便利です。
    1. 次ページへ f
    2. 前ページへ b
    3. 終了 q
    less /path/to/your/logfile.log
    サンプル
    2024-04-10 21:21:50,848:DEBUG:Data updated.
    2024-04-11 02:04:14,362:INFO:User logged in.
    2024-04-11 05:07:31,008:DEBUG:Server started.
    2024-04-11 06:33:54,502:ERROR:User logged in.
    2024-04-11 13:28:24,182:INFO:Error occurred.
    2024-04-11 17:14:55,535:WARNING:Error occurred.
    2024-04-11 18:14:11,176:DEBUG:Data updated.
    2024-04-11 22:35:59,172:WARNING:Data updated.
    2024-04-12 02:29:46,826:INFO:Data updated.
    2024-04-12 16:45:25,465:DEBUG:Data updated.
    2024-04-13 01:24:23,894:CRITICAL:Server started.
    2024-04-13 07:23:47,616:WARNING:Server shut down.
    2024-04-14 00:40:12,622:CRITICAL:Data updated.
    2024-04-14 00:10:00,845:ERROR:User logged in.
    2024-04-14 03:27:53,526:CRITICAL:Server shut down.
    2024-04-14 06:29:58,826:ERROR:Error occurred.
    2024-04-14 10:33:27,149:ERROR:Error occurred.
    2024-04-14 10:21:07,091:DEBUG:Server shut down.
    2024-04-14 12:14:40,898:ERROR:Server started.
    2024-04-14 18:56:47,926:CRITICAL:Server started.
    2024-04-14 20:00:19,939:DEBUG:Data updated.
    2024-04-14 21:06:51,411:CRITICAL:Error occurred.
    2024-04-14 23:40:30,107:CRITICAL:Error occurred.
    2024-04-15 03:08:37,584:INFO:Server shut down.
    2024-04-15 05:49:40,571:DEBUG:Data updated.
    2024-04-15 07:24:21,474:ERROR:Error occurred.
    2024-04-15 10:20:12,164:ERROR:Error occurred.
    2024-04-15 11:16:33,088:ERROR:Error occurred.
    2024-04-15 13:48:14,379:CRITICAL:Data updated.
    2024-04-15 16:01:35,967:WARNING:Server started.
    2024-04-15 19:07:29,784:WARNING:Server shut down.
    2024-04-16 07:42:39,863:DEBUG:Error occurred.
    2024-04-16 13:04:46,559:ERROR:Data updated.
    2024-04-16 19:23:07,352:CRITICAL:Data updated.
    2024-04-16 21:15:48,028:WARNING:Server started.
    2024-04-16 22:17:52,562:CRITICAL:Server shut down.
    2024-04-16 23:56:22,944:DEBUG:Data updated.
    2024-04-17 00:14:32,004:INFO:User logged in.
    2024-04-17 01:03:48,602:INFO:User logged in.
    2024-04-17 07:10:57,395:WARNING:Server shut down.
    2024-04-17 11:51:09,895:INFO:Server shut down.
    2024-04-17 12:43:24,654:ERROR:Data updated.
    2024-04-17 15:27:05,772:WARNING:Server shut down.
    2024-04-17 23:54:46,696:CRITICAL:Data updated.
    2024-04-18 00:20:22,123:DEBUG:User logged in.
    2024-04-18 01:43:21,791:WARNING:Data updated.
    2024-04-18 01:32:41,437:INFO:Server shut down.
    2024-04-18 15:02:43,956:ERROR:Server started.
    2024-04-18 18:39:13,442:WARNING:Data updated.
    2024-04-19 00:15:56,513:DEBUG:Server started.
    2024-04-19 04:34:00,047:INFO:Server shut down.
    2024-04-19 12:47:07,388:INFO:User logged in.
    2024-04-19 17:43:51,512:ERROR:User logged in.
    2024-04-19 22:08:35,703:WARNING:Error occurred.
    2024-04-19 23:47:54,149:INFO:Server started.
    2024-04-20 03:51:22,082:INFO:Server started.
    2024-04-20 09:34:00,985:CRITICAL:Error occurred.
    2024-04-20 12:10:55,888:WARNING:User logged in.
    2024-04-20 19:04:12,443:DEBUG:Server started.
    :
  3. tail : ファイルの末尾部分を表示します。最新のログエントリを見るのに便利です。 f オプションを付けると、ログの更新をリアルタイムで追跡できます。
    tail /path/to/your/logfile.log
    tail -f /path/to/your/logfile.lo
    サンプル
    06:51:41 PM ❯ tail /path/to/your/logfile.log
    2024-05-09 23:35:50,716:INFO:User logged in.
    2024-05-10 01:51:31,144:INFO:Server started.
    2024-05-10 03:54:00,543:CRITICAL:Server started.
    2024-05-10 03:36:55,854:INFO:User logged in.
    2024-05-10 04:46:01,922:DEBUG:Server shut down.
    2024-05-10 04:40:37,198:CRITICAL:User logged in.
    2024-05-10 05:46:55,919:INFO:Server started.
    2024-05-10 09:21:26,962:CRITICAL:Server shut down.
    2024-05-10 13:59:52,250:DEBUG:Error occurred.
    2024-05-10 15:27:01,975:INFO:Error occurred.
  4. grep : ファイルから特定のパターンを含む行を検索します。エラーメッセージや特定のイベントを探すのに便利です。
    grep "Error" /path/to/your/logfile.log
    サンプル
    06:51:48 PM ❯ grep "Error" ./path/to/your/logfile.log
    2024-04-11 13:28:24,182:INFO:Error occurred.
    2024-04-11 17:14:55,535:WARNING:Error occurred.
    2024-04-14 06:29:58,826:ERROR:Error occurred.
    2024-04-14 10:33:27,149:ERROR:Error occurred.
    2024-04-14 21:06:51,411:CRITICAL:Error occurred.
    2024-04-14 23:40:30,107:CRITICAL:Error occurred.
    2024-04-15 07:24:21,474:ERROR:Error occurred.
    2024-04-15 10:20:12,164:ERROR:Error occurred.
    2024-04-15 11:16:33,088:ERROR:Error occurred.
    2024-04-16 07:42:39,863:DEBUG:Error occurred.
    2024-04-19 22:08:35,703:WARNING:Error occurred.
    2024-04-20 09:34:00,985:CRITICAL:Error occurred.
    2024-04-21 18:26:42,907:DEBUG:Error occurred.
    2024-04-22 14:42:17,898:DEBUG:Error occurred.
    2024-04-23 06:15:02,705:INFO:Error occurred.
    2024-04-24 16:06:27,650:INFO:Error occurred.
    2024-04-24 20:02:17,373:INFO:Error occurred.
    2024-04-25 22:50:56,753:CRITICAL:Error occurred.
    2024-04-27 07:13:48,367:INFO:Error occurred.
    2024-04-28 19:27:06,259:INFO:Error occurred.
    2024-04-30 03:35:34,456:ERROR:Error occurred.
    2024-05-01 20:09:32,305:CRITICAL:Error occurred.
    2024-05-02 01:10:53,802:CRITICAL:Error occurred.
    2024-05-02 13:07:20,425:DEBUG:Error occurred.
    2024-05-02 15:10:56,526:INFO:Error occurred.
    2024-05-02 16:33:33,092:INFO:Error occurred.
    2024-05-03 14:37:21,560:CRITICAL:Error occurred.
    2024-05-03 16:36:30,357:DEBUG:Error occurred.
    2024-05-04 18:57:15,489:INFO:Error occurred.
    2024-05-05 12:03:35,334:INFO:Error occurred.
    2024-05-05 21:28:52,408:WARNING:Error occurred.
    2024-05-08 00:03:29,525:DEBUG:Error occurred.
    2024-05-09 19:50:31,399:WARNING:Error occurred.
    2024-05-10 13:59:52,250:DEBUG:Error occurred.
    2024-05-10 15:27:01,975:INFO:Error occurred.
    
  5. awk , sed : テキストの処理や変換を行います。ログの特定の部分を抽出したり、フォーマットを変更したりするのに使います。
    awk '/Error/ {print $1, $2}' /path/to/your/logfile.log
    sed 's/Error/ERROR/g' /path/to/your/logfile.log
    サンプル
    06:53:08 PM ❯ awk '/Error/ {print $1, $2}' /path/to/your/logfile.log
    2024-04-11 13:28:24,182:INFO:Error
    2024-04-11 17:14:55,535:WARNING:Error
    2024-04-14 06:29:58,826:ERROR:Error
    2024-04-14 10:33:27,149:ERROR:Error
    2024-04-14 21:06:51,411:CRITICAL:Error
    2024-04-14 23:40:30,107:CRITICAL:Error
    2024-04-15 07:24:21,474:ERROR:Error
    2024-04-15 10:20:12,164:ERROR:Error
    2024-04-15 11:16:33,088:ERROR:Error
    2024-04-16 07:42:39,863:DEBUG:Error
    2024-04-19 22:08:35,703:WARNING:Error
    2024-04-20 09:34:00,985:CRITICAL:Error
    2024-04-21 18:26:42,907:DEBUG:Error
    2024-04-22 14:42:17,898:DEBUG:Error
    2024-04-23 06:15:02,705:INFO:Error
    2024-04-24 16:06:27,650:INFO:Error
    2024-04-24 20:02:17,373:INFO:Error
    2024-04-25 22:50:56,753:CRITICAL:Error
    2024-04-27 07:13:48,367:INFO:Error
    2024-04-28 19:27:06,259:INFO:Error
    2024-04-30 03:35:34,456:ERROR:Error
    2024-05-01 20:09:32,305:CRITICAL:Error
    2024-05-02 01:10:53,802:CRITICAL:Error
    2024-05-02 13:07:20,425:DEBUG:Error
    2024-05-02 15:10:56,526:INFO:Error
    2024-05-02 16:33:33,092:INFO:Error
    2024-05-03 14:37:21,560:CRITICAL:Error
    2024-05-03 16:36:30,357:DEBUG:Error
    2024-05-04 18:57:15,489:INFO:Error
    2024-05-05 12:03:35,334:INFO:Error
    2024-05-05 21:28:52,408:WARNING:Error
    2024-05-08 00:03:29,525:DEBUG:Error
    2024-05-09 19:50:31,399:WARNING:Error
    2024-05-10 13:59:52,250:DEBUG:Error
    2024-05-10 15:27:01,975:INFO:Error

これらのコマンドはパイプ( | )を使って組み合わせることができ、より複雑な検索やフィルタリングを行うことができます。

例えば、 grep でエラーメッセージを検索し、 tail で最新のものだけを表示する、といったことが可能です。

grep "Error" /path/to/your/logfile.log | tail
サンプル
06:52:25 PM ❯ grep "Error" /path/to/your/logfile.log | tail
2024-05-02 16:33:33,092:INFO:Error occurred.
2024-05-03 14:37:21,560:CRITICAL:Error occurred.
2024-05-03 16:36:30,357:DEBUG:Error occurred.
2024-05-04 18:57:15,489:INFO:Error occurred.
2024-05-05 12:03:35,334:INFO:Error occurred.
2024-05-05 21:28:52,408:WARNING:Error occurred.
2024-05-08 00:03:29,525:DEBUG:Error occurred.
2024-05-09 19:50:31,399:WARNING:Error occurred.
2024-05-10 13:59:52,250:DEBUG:Error occurred.
2024-05-10 15:27:01,975:INFO:Error occurred.

これらのコマンドは基本的なもので、具体的な使用方法はログの内容や調査の目的によります。

また、これらのコマンドはローカルのシステムでログファイルに直接アクセスできる場合に使用します。

リモートのシステムやクラウドサービスのログを調査する場合は、そのサービスが提供するログ閲覧ツールやAPIを使用することが多いです。

ハンズオン

システムログを調査しよう

Linuxのログの場所

  • 主なログファイルは/var/log配下にあるので管理者権限が必要
自分のサーバーでの作業
# ルートユーザーになる
sudo su -
cd ..
cd /var/log
ls -l

Linuxの主なシステムログファイルの種類

  • /var/log/boot.log システム起動時のログ(システムの起動プロセス)
  • /var/log/maillog メールシステムのログ
  • /var/log/cron cronのログ
  • /var/log/secure 認証関連のログ
  • /var/log/dmesg システム起動時のdmesgの内容(カーネルからのメッセージ)
  • /var/log/lastlog 最終ログイン情報の記録
  • /var/log/wtmp ログイン情報の記録
  • /var/log/messages 上記に含まれないログ
  • /var/log/audit : システムの監査ログ(システムのセキュリティ関連のイベント)
  • /var/log/btmp : 失敗したログイン試行に関するログ
  • /var/log/journal : システムのログ
  • /var/log/tallylog : ログイン失敗の回数を記録するログ
  • /var/log/yum.log : パッケージマネージャーyumによるインストールやアップデートのログ


自分のサーバにログインしておいてください。

課題1 ログイン情報を調べてみる
  • 自分がサーバに初めてログインした日時はいつ?
ヒント
# rootユーザーになっておく
$ sudo su -

# wtmpはバイナリ形式で保存されており、普通に開くと文字化けするのでlastコマンドで開く
$ last -f /var/log/wtmp
ec2-user pts/0        ip-10-0-6-54.ap- Tue May 14 09:11   still logged in
ec2-user pts/0        ip-10-0-6-54.ap- Tue May 14 08:42 - 09:11  (00:29)
ec2-user pts/0        ip-10-0-6-54.ap- Tue May 14 07:34 - 07:34  (00:00)
ec2-user pts/0        ip-10-0-6-54.ap- Tue May 14 07:17 - 07:18  (00:00)
ec2-user pts/0        ip-10-0-6-54.ap- Tue May 14 07:15 - 07:17  (00:02)
ec2-user pts/0        ip-10-0-6-54.ap- Tue May 14 07:10 - 07:14  (00:03)
ec2-user pts/0        219.122.0.104    Tue May 14 06:56 - 06:56  (00:00)

課題2 自分の認証ログを調べてみる
  • 自分のサーバのipアドレスで認証ログを眺めてみる
ヒント
[root@ip-10-0-0-177 ~]# cat /var/log/secure | grep 10.0.6.54 <- 自分のサーバのipが当てはまるものを表示
May 14 06:23:33 ip-10-0-0-177 sshd[3169]: Connection closed by 10.0.6.54 port 39728 [preauth]
May 14 07:10:37 ip-10-0-0-177 sshd[3404]: Accepted publickey for ec2-user from 10.0.6.54 port 54002 ssh2: RSA SHA256:jkVw2axul0D1S1gJdv4jcy/KzGY5XKuvdKw2N6XPzLw
May 14 07:14:31 ip-10-0-0-177 sshd[3454]: Received disconnect from 10.0.6.54 port 54002:11: disconnected by user
May 14 07:14:31 ip-10-0-0-177 sshd[3454]: Disconnected from 10.0.6.54 port 54002
May 14 07:14:58 ip-10-0-0-177 sshd[3482]: Invalid user sci02173 from 10.0.6.54 port 38366
May 14 07:14:58 ip-10-0-0-177 sshd[3482]: Connection closed by 10.0.6.54 port 38366 [preauth]
May 14 07:15:13 ip-10-0-0-177 sshd[3484]: Accepted publickey for ec2-user from 10.0.6.54 port 44860 ssh2: RSA SHA256:jkVw2axul0D1S1gJdv4jcy/KzGY5XKuvdKw2N6XPzLw
May 14 07:17:27 ip-10-0-0-177 sshd[3534]: Received disconnect from 10.0.6.54 port 44860:11: disconnected by user
May 14 07:17:27 ip-10-0-0-177 sshd[3534]: Disconnected from 10.0.6.54 port 44860
May 14 07:17:41 ip-10-0-0-177 sshd[32337]: Connection closed by 10.0.6.54 port 41170 [preauth]
May 14 07:17:55 ip-10-0-0-177 sshd[32387]: Accepted publickey for ec2-user from 10.0.6.54 port 44038 ssh2: RSA SHA256:jkVw2axul0D1S1gJdv4jcy/KzGY5XKuvdKw2N6XPzLw
May 14 07:18:09 ip-10-0-0-177 sshd[32437]: Received disconnect from 10.0.6.54 port 44038:11: disconnected by user
May 14 07:18:09 ip-10-0-0-177 sshd[32437]: Disconnected from 10.0.6.54 port 44038
May 14 07:34:17 ip-10-0-0-177 sshd[32475]: Accepted publickey for ec2-user from 10.0.6.54 port 39898 ssh2: RSA SHA256:jkVw2axul0D1S1gJdv4jcy/KzGY5XKuvdKw2N6XPzLw
May 14 07:34:19 ip-10-0-0-177 sshd[32525]: Received disconnect from 10.0.6.54 port 39898:11: disconnected by user
May 14 07:34:19 ip-10-0-0-177 sshd[32525]: Disconnected from 10.0.6.54 port 39898
May 14 08:42:37 ip-10-0-0-177 sshd[311]: Accepted publickey for ec2-user from 10.0.6.54 port 48290 ssh2: RSA SHA256:jkVw2axul0D1S1gJdv4jcy/KzGY5XKuvdKw2N6XPzLw
May 14 09:11:45 ip-10-0-0-177 sshd[361]: Received disconnect from 10.0.6.54 port 48290:11: disconnected by user
May 14 09:11:45 ip-10-0-0-177 sshd[361]: Disconnected from 10.0.6.54 port 48290
May 14 09:11:47 ip-10-0-0-177 sshd[532]: Accepted publickey for ec2-user from 10.0.6.54 port 33022 ssh2: RSA SHA256:jkVw2axul0D1S1gJdv4jcy/KzGY5XKuvdKw2N6XPzLw

  • これまでにサーバにログインしたサーバのipアドレスは?
ヒント
grep 'Accepted publickey' /var/log/secure | awk '{print $11}' | sort | uniq
grep 'Accepted password' /var/log/secure | awk '{print $11}' | sort | uniq
  • 不正アクセスの疑いがあるものは?
    • 頻繁な認証失敗はありますか?
ヒント
grep 'Invalid user\|Failed password' /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr

次へ  📄 【サーバー運用入門2025 #4】エディタ操作とシェルスクリプト