【手を動かす道場】実戦ワンライナー&ログ解析10本ノック(情シス・インフラ現場のトラブル調査総合演習)
月曜日の朝9時15分。情シスやサーバー管理者のデスクに、血相を変えた内線電話が鳴り響きます。 「社内ポータルに繋がらない!」「WebサーバーのCPU使用率が100%に張り付いている!」「海外からの不正ログインが多発しているらしい!」
パニックに陥った初心者は、リモートデスクトップでGUIの管理画面を開こうとしてタイムアウトで弾かれ、重たいログファイルをメモ帳やExcelで開こうとしてPCごとフリーズさせます。 しかし、百戦錬磨のインフラエンジニアは、マウスに触れもしません。SSHで黒い画面(CLI)にログインし、キーボードで「たった1行のコマンド(ワンライナー)」を叩き込み、わずか3秒で真犯人を特定します。
「攻撃元のIPアドレスはどこか?」 「どのURLが500番エラーを連発しているのか?」 「どのプロセスがメモリを食い尽くしているのか?」
彼らは超能力者ではありません。 第1話(SQLの思考法)、第2話(UNIXのパイプ工学)、第3話(データ集計の型)で学んだ道具を**「1行のパイプライン(ワンライナー)」として束ねる呼吸法**を知っているだけです。
新企画L『実戦コード・ノック道場』の最終回となる本稿では、環境構築ゼロのブラウザ内仮想ターミナル上で、**Webサーバーのアクセスログやシステム稼働ログを実際に解析する「実戦トラブル調査10本ノック」**に挑んでいただきます。
1. 現場の武器:テキスト処理の三銃士(grep・awk・sed)と集計の型
実務のログ解析において、膨大なテキストの山から砂金(異常値)をすくい上げる道具は決まっています。
それが、grep(行の選別)、awk(列の切り出しと計算)、**sed(文字の置換と加工)**の三銃士です。
現場で毎日叩く「集計の黄金公式」:sort | uniq -c | sort -rn
ログ解析において、SQLの GROUP BY 列, COUNT(*) ORDER BY COUNT(*) DESC と全く同じ集計を、Linuxの標準コマンドだけで瞬時に実行する魔法のパイプラインがあります。
cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -n 5
awk '{print $1}':空白で区切られたログの「1列目(IPアドレス)」だけを抜き出す。sort:同じ文字列を隣り合わせに並べる(uniqは隣り合った重複しかカウントできないという物理制約があるため、事前のsortが絶対必須!)。uniq -c:重複している行を1行にまとめ、左側に「何回出現したか」の回数を付与する。sort -rn:出現回数を「数値として(-n)」「大きい順・降順(-r)」に並び替える。head -n 5:ワースト5件だけを切り出す。
PythonやExcelで何十行もコードを書く必要はありません。
パイプ(|)という土管をカチャカチャと繋ぎ合わせるだけで、数百万行のギガバイト級ログであっても、メモリをほとんど消費せずに数秒で犯人を炙り出すことができるのです。
触って試す:パイプラインの流れ体験
🔧 パイプラインの流れ体験(500エラーの犯人探し)
このあとの道場で使う「集計の黄金公式」を、コマンドを打たずに先に追体験できます。24行のサンプルログ(sample.log)を用意しました。「次の段へ」を押すたびにパイプの各段が実行され、データが絞られていく様子と各段の出力が見えます。狙いは、ステータス500の行から「一番エラーを出しているURL」を特定することです。
2. 【実践】ブラウザ内完結・実戦ワンライナー10本ノック道場
下の黒い画面は、あなたのブラウザ内で動く**「トラブル調査用・仮想Linuxシェル」**です。
現在、Webサーバー(Nginx/Apache)の標準的なアクセスログである access.log と、Linuxシステムの認証ログ auth.log、プロセス一覧 ps.txt が配置されています。
課題を読み、パイプで繋いだワンライナーを入力して Enterキー を押してください。
(※ grep, awk, sed, sort, uniq, wc, cut, tr, head, tail, xargs などが本物同様に動作します)。
3. 全10本ノックの「急所」と模範解答・現場の掟
道場で手を動かしたあとに読むことで、本番トラブルの現場で手が震えなくなる「インフラプロフェッショナルの鉄則」を完全インストールします。
第1問〜第4問:Webアクセスログ(access.log)の緊急外科手術
【Q1】エラー行のカウント(grep ' 500 ' | wc -l)
- プロの知恵:前後に「半角スペース」を入れろ!
単に
grep '500' access.logと叩くと、「転送バイト数が 500 バイトだった正常な行」や「IPアドレス192.168.1.50」までヒットしてしまいます。 HTTPステータスコードを狙うときは、必ず前後に半角スペースを挟んで' 500 'と指定するのが、誤検知を防ぐ現場の絶対のコツです。
【Q2・Q3】アクセス元IPの集計(awk と sort | uniq -c)
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -n 1
- なぜ
awkの列番号は$1なのか?: NginxやApacheの標準ログ(Combined Log Format)は、空白区切りで以下の順番に並んでいます。$1:クライアントIPアドレス$4:アクセス日時$6:HTTPメソッド(GET/POST)$7:リクエストURLパス$9:ステータスコード(200/404/500)$10:レスポンスバイト数 この列番号さえ頭に入っていれば、どんなログが来ても一瞬で解体できます。
【Q4】不正アクセスの標的調査
grep ' 401 ' access.log | awk '{print $7}'
- 401(Unauthorized)の連発=ブルートフォース攻撃:
同一IPから
/api/loginや/wp-login.phpに向けて短時間に401が数百件記録されている場合、それは間違いなくパスワード総当たり(ブルートフォース)またはパスワードスプレー攻撃です。
第5問〜第7問:セキュリティ侵害調査と暴走プロセスの特定
【Q5・Q6】SSH不正侵入の試行回数を暴く(auth.log)
grep 'Failed password' auth.log | awk '{print $11}' | sort | uniq -c | sort -rn
NF(Number of Fields)という必殺技: Linuxのログは、行によって単語数が微妙に変わることがあります。列番号がズレる場合は、awk '{print $(NF-3)}'(末尾から数えて4番目の列)と指定すると、可変長のログでも確実にIPアドレスを吸い出せます。
【Q7】CPU暴走プロセスの特定(sort -k3 -rn)
grep -v 'USER' ps.txt | sort -k3 -rn | head -n 1 | awk '{print $2, $11}'
-k3(Key 3番目)で並び替える:sortコマンドに-k3を渡すと、「3列目(ここでは %CPU)」を基準にして並び替えます。 さらに先頭のヘッダー行(USER PID %CPU...)が邪魔になるため、grep -v 'USER'でヘッダーを事前に弾き飛ばしておくのが実務の綺麗な作法です。
第8問〜第10問:データ加工・集計・自動復旧の連携
【Q8】sed による機密情報の不可逆マスキング
sed 's/192.168.1.[0-9]*/[INTERNAL_IP]/g' access.log
s/置換前/置換後/gの基本文法: 障害調査のために社外のセキュリティベンダーやクラウドベンダーにログを提供する際、社内のプライベートIPや個人情報(メールアドレス)を生のまま渡すことはコンプライアンス上許されません。sedの正規表現置換でサッと匿名化するのが情シスのたしなみです。
【Q9】awk 内部での数値計算(sum += $10)
awk '{sum += $10} END {print sum}' access.log
ENDブロックの物理:awkは1行読み込むごとに{sum += $10}を実行して内部変数を加算し、すべての行を読み終えた最後の瞬間にだけEND {print sum}を1回だけ実行します。わざわざPythonスクリプトを書かなくても、1行で電卓代わりに合計や平均を算出できます。
【Q10】パイプの終着駅:xargs によるコマンド自動生成
echo '198.51.100.99' | xargs -I{} echo iptables -A INPUT -s {} -j DROP
- なぜ
xargsなのか?: 普通のコマンドは「パイプから流れてきた標準入力」を引数として受け取れないものがあります(killやrm、iptablesなど)。xargs -I{}は、**「パイプから渡された文字列を{}の位置に差し込んで、後ろのコマンドを実行する」**というアダプターの役割を果たします。 「特定した攻撃者IPを、その場で即座にファイアウォールの遮断ルールに流し込む」というインシデント初動対応の自動化は、すべてこの構造で成り立っています。
結論:ワンライナーとは「思考の速度で動く筋肉」である
全6回にわたる『実戦コード・ノック道場』を振り返ってみましょう。
- 第1話:SQLで「集合」を削り出す思考法を身につけた。
- 第2話:Linuxの「標準入出力と土管(パイプ)」の物理を学んだ。
- 第3話:Pythonで「データ構造」を電光石火で加工する型を覚えた。
- 第4話:PHPで「Web通信のステートレスとXSS防御」の急所を押さえた。
- 第5話:HTML/CSSで「画面を自律的に伸縮させる箱の物理」を体得した。
- 第6話:そして今、それらを1行に束ね、現場の危機を救う「ワンライナー」を手に入れた。
プロのエンジニアと初心者の違いは、知っているプログラミング言語の数ではありません。 **「問題が起きたとき、余計なGUIや重たいツールを介さず、最小の手数(最小のコード)でコンピュータと直接対話できるかどうか」**です。
環境構築ゼロのブラウザ道場であなたの指先に刻まれた60本のノックの記憶は、明日からの現場の実務、システムトラブル、そしてデータ分析の最前線において、必ずやあなたを支える一生モノの「筋肉」となるはずです。
📝 3行で頭に入る『試験・実務・投資の要点まとめ』
- 【集計の黄金律】
awk '{print $列}' | sort | uniq -c | sort -rnの組み合わせは、SQLのGROUP BY + COUNT + ORDER BY DESCと完全に等価なLinuxの基本兵器である。 - 【誤検知の物理】 ログからステータスコードを抽出する際は、前後に半角スペースを入れて
' 500 'や' 401 'と指定することで、バイト数やIPの数字との誤一致を防止する。 - 【xargsの威力】 パイプで抽出した調査結果(IPやPID)を
xargs -I{}で後続コマンドへ流し込むことで、障害特定からファイアウォール遮断・プロセス強制終了までを1秒で直結できる。