sshdログファイルから報告書を作成

ログファイルをそのまま使うのは、結構面倒だ。最終的には問題を発見したらメールで担当者に通知したり、HTMLファイルに加工出力してWebブラウザから確認できるようにしたりしておくのがよいだろう。今回は、前回作成したシェルスクリプトを加工して、出力をHTML形式にしてみよう。

解説の前に、答えを掲載しておく。と言っても、絶対的な正解があるわけではない。自分の好きなように組めばよいものなので、参考程度にしてもらえれば幸いだ。出力をHTMLにしたバージョンのssh-checkは次のようになる。

#!/bin/sh

#=====================================================================
# 利用する変数を定義
#=====================================================================
logfile=/var/log/auth.log

#=====================================================================
# 作業用ディレクトリの作成と削除トラップの設定
#=====================================================================
readonly tmpd=/tmp/_$$; mkdir $tmpd
trap "[ -d $tmpd ] && chmod -R u+w $tmpd && rm -r $tmpd" EXIT

#=====================================================================
# 利用するデータを用意
#=====================================================================
# ログデータを取得
cat $logfile                    |
#
# sshdに関するログを選択
grep    -E 'sshd\[[0-9]*\]: error: maximum'     |
#
# 処理しやすいようにフォーマットを整える
sed 's/invalid user //'             |
#
# 必要なデータのみを抽出
#   1列目:    月
#   2列目:    日
#   3列目:    時:分:秒
#   12列目:   ユーザ名
#   14列目:   アクセス元IPアドレス
awk '{print $1,$2,$3,$12,$14}'          |
#
# 日付データの正規化(年月日)
while read mon day time user ip
do
    date=$(date --date="$mon $day $time" +%Y%m%d)
    echo "$date $ip"
done                            |
# 1:年月日 2:アクセス元IPアドレス
#
# 重複するIPアドレスを排除
sort                            |
uniq                            |
#
# 日付ごとにアクセス元IPアドレスをまとめる
yarr    num=1                       > $tmpd/IPアド
# 1:年月日 2:アクセス元IPアドレス 3:アクセス元IPアドレス
# 4:...

#=====================================================================
# HTMLデータを用意
#=====================================================================
cat<<EOF                        > $tmpd/テーブル
<table border="1">
 <thead>
  <tr>
   <th>日付</th>
   <th>アクセス元IP</th>
  </tr>
 </thead>
 <tbody>
EOF

cat<<EOF                        > $tmpd/テーブル行
  <tr>
   <td>DATE</td>
   <td>IPS</td>
  </tr>
EOF

cat $tmpd/IPアド                  |
while   read date ips
do
    cat $tmpd/テーブル行           |
    sed "s/DATE/$date/"             |
    sed "s/IPS/$ips/"
done                            |
cat                         >>$tmpd/テーブル

cat<<EOF                        >>$tmpd/テーブル
 </tbody>
</table>
EOF

#=====================================================================
# HTMLデータ出力
#=====================================================================
# ヘッダ出力
cat<<EOF
<!DOCTYPE html>
<html lang="ja">
<head>
 <meta charset="utf-8">
 <meta http-equiv="X-UA-Compatible" content="IE=edge">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <title>sshd不正アクセス元IPアドレス一覧</title>
</head>
<body>
EOF

cat $tmpd/テーブル

# フッタ出力
cat<<EOF
</body>
</html>
EOF

このシェルスクリプトを実行すると、結果がHTML形式で出力される。ファイルに書き出しておけば、Webブラウザからチェックできるようになる。

便利なTIPS紹介

今回のシェルスクリプトで、前回とは異なる部分や新しい部分を簡単に説明しておこう。次に示すのは、作業用の一時ディレクトリを作成する処理なのだが、筆者もよく使う結構便利なTIPSだ。

readonly tmpd=/tmp/_$$; mkdir $tmpd
trap "[ -d $tmpd ] && chmod -R u+w $tmpd && rm -r $tmpd" EXIT

上記の方法で「/tmp/_プロセスID/」というディレクトリが作成される。このディレクトリは「trap “[ -d $tmpd ] && chmod -R u+w $tmpd && rm -r $tmpd” EXIT」というトラップを設定してあるので、シェルスクリプトが終了するときに削除される仕組みになっている。

このようにしておくと、シェルスクリプトの中で生成する一時ファイルのパスを「$tmpd/ファイル名」のようにしておくだけで、シェルスクリプト終了時に自動的に削除されるようになるので便利だ。ただし、tmpd変数を途中で書き換えたりすると冗談では済まない大惨事を引き起こしかねないので、tmpdはリードオンリーに設定しておいたほうがよいだろう。

次の処理は「日付 IP」というデータを「日付 IP IP IP…」といったように日付ごとにまとめるために使っている。yarrというコマンドを使うとこういったことができる。

日付ごとにデータをまとめるコマンド

# 日付ごとにアクセス元IPアドレスをまとめる
yarr    num=1                       > $tmpd/IPアド

次の処理は、データをHTMLに加工している処理だ。行データのテンプレートを一旦ファイルに出力しておき、そこにsedコマンドでデータをはめ込んでいる。

cat<<EOF                        > $tmpd/テーブル行
  <tr>
   <td>DATE</td>
   <td>IPS</td>
  </tr>
EOF

cat $tmpd/IPアド                  |
while   read date ips
do
    cat $tmpd/テーブル行           |
    sed "s/DATE/$date/"             |
    sed "s/IPS/$ips/"
done                            |
cat                         >>$tmpd/テーブル

もしこの手の処理をよく使うのであれば、上記のようにsedコマンドを使うのではなく、専用のコマンドを作ったほうがよいだろう。この点については次回、詳しく紹介する。

実行してみる

このシェルスクリプトを実行すると、次のような出力が得られる。

% ./ssh-check
<!DOCTYPE html>
<html lang="ja">
<head>
 <meta charset="utf-8">
 <meta http-equiv="X-UA-Compatible" content="IE=edge">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <title>sshd不正アクセス元IPアドレス一覧</title>
</head>
<body>
<table border="1">
 <thead>
  <tr>
   <th>日付</th>
   <th>アクセス元IP</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>20190731</td>
   <td>170.80.226.29 27.41.190.25</td>
  </tr>
  <tr>
   <td>20190802</td>
   <td>113.109.110.51 223.199.221.178 59.125.69.40</td>
  </tr>
  <tr>
   <td>20190803</td>
   <td>113.17.31.61 14.118.206.120 168.205.194.9 183.128.224.219</td>
  </tr>
  <tr>
   <td>20190804</td>
   <td>115.213.143.250 170.80.227.99 188.92.77.12 217.92.127.208 27.222.223.201 58.35.16.9 71.202.241.115</td>
  </tr>
  <tr>
   <td>20190805</td>
   <td>113.215.220.89 114.248.104.41 121.237.224.22 180.126.53.22 193.201.224.236 31.181.215.22 88.68.208.193</td>
  </tr>
  <tr>
   <td>20190806</td>
   <td>101.235.114.131 106.87.47.0 113.215.193.142 121.25.24.86 123.8.118.218 177.184.189.209 183.159.195.55 188.114.138.213 188.92.75.248 27.195.42.226 67.191.194.94 76.20.69.183 91.250.22.133</td>
  </tr>
  <tr>
   <td>20190807</td>
   <td>115.213.128.113 115.59.120.27 124.91.188.127 125.42.179.246 178.47.160.47 188.92.75.248 49.130.34.61 49.69.83.42 port</td>
  </tr>
  <tr>
   <td>20190808</td>
   <td>114.236.111.192 121.234.62.143 124.91.188.127 180.69.95.125 182.117.177.182 182.86.99.103 60.184.179.222 73.153.145.9</td>
  </tr>
  <tr>
   <td>20190809</td>
   <td>14.145.21.169 60.184.127.149</td>
  </tr>
  <tr>
   <td>20190810</td>
   <td>112.86.0.159 113.122.54.85 114.236.205.156 118.112.91.138 125.108.243.114 183.191.223.60 27.10.230.41 27.44.240.37 27.8.137.72 36.26.115.174</td>
  </tr>
  <tr>
   <td>20190811</td>
   <td>1.28.3.152 106.110.58.106 112.84.138.48 118.112.91.138 180.126.239.208 202.104.174.163 218.102.92.182 222.140.18.37 39.187.73.53 61.168.136.74 79.105.214.148</td>
  </tr>
  <tr>
   <td>20190812</td>
   <td>168.205.194.23 39.187.73.53 39.65.87.155 61.147.42.240</td>
  </tr>
  <tr>
   <td>20190813</td>
   <td>112.86.0.159 115.209.80.158 178.248.87.113 182.243.121.39 220.141.144.17 221.223.95.29 76.20.69.183</td>
  </tr>
  <tr>
   <td>20190814</td>
   <td>112.123.68.214 114.248.106.156 122.189.222.238 171.123.196.194 178.69.74.35 27.211.110.13</td>
  </tr>
  <tr>
   <td>20190815</td>
   <td>106.111.72.217 114.217.214.92 114.91.131.79 118.168.131.152 190.142.211.194 193.189.87.216 36.251.149.219 36.33.141.169 60.187.248.241 67.182.89.30 95.238.21.47</td>
  </tr>
  <tr>
   <td>20190816</td>
   <td>1.170.18.101 112.84.32.38 115.216.39.37 182.117.186.43 211.212.29.61 36.248.182.119 50.98.130.158</td>
  </tr>
  <tr>
   <td>20190817</td>
   <td>103.119.82.220 199.195.62.84 221.239.217.250 36.230.99.91 39.82.165.124 42.239.176.213 46.150.230.54 95.81.121.121</td>
  </tr>
  <tr>
   <td>20190818</td>
   <td>182.119.156.35 49.70.151.179</td>
  </tr>
  <tr>
   <td>20190819</td>
   <td>113.91.169.110 114.228.199.130 125.114.22.221 209.89.212.173 218.23.29.41</td>
  </tr>
  <tr>
   <td>20190820</td>
   <td>106.118.29.177 112.246.50.25 136.233.13.222 175.43.163.84 182.119.154.243 27.129.238.107 92.116.25.111</td>
  </tr>
  <tr>
   <td>20190821</td>
   <td>114.253.120.188 125.109.141.104 153.34.196.52 175.166.225.213 222.78.76.80 37.255.15.124 45.7.108.95 58.55.40.180</td>
  </tr>
  <tr>
   <td>20190822</td>
   <td>103.249.239.215 112.81.113.184 113.229.70.29 114.236.6.120 115.229.246.122 115.59.161.203 125.105.153.162 59.58.209.196</td>
  </tr>
  <tr>
   <td>20190823</td>
   <td>111.59.184.154 117.163.196.140 121.234.44.183 124.230.246.25 14.117.245.25 140.237.244.222</td>
  </tr>
  <tr>
   <td>20190824</td>
   <td>1.252.42.102 110.88.116.49 112.242.187.85 183.184.1.44 201.178.44.39 221.231.49.178 46.159.26.118 86.57.211.69</td>
  </tr>
  <tr>
   <td>20190825</td>
   <td>113.215.223.108 171.117.148.213 180.126.217.189 223.241.254.22 36.106.167.197</td>
  </tr>
  <tr>
   <td>20190826</td>
   <td>119.165.192.72 149.147.186.20 168.90.143.166 180.126.183.184 27.184.64.119</td>
  </tr>
  <tr>
   <td>20190827</td>
   <td>120.69.3.70 139.209.241.162 178.75.82.23 182.119.158.109 190.227.47.16 58.255.135.35 59.148.43.97 91.197.169.132</td>
  </tr>
  <tr>
   <td>20190828</td>
   <td>1.159.73.131 114.236.226.85 114.236.6.213 121.46.93.230 125.129.185.100 178.187.179.142 180.126.233.194 190.83.221.86 49.83.182.58 88.234.245.64</td>
  </tr>
  <tr>
   <td>20190829</td>
   <td>117.28.159.92 117.82.41.79 123.13.62.240 150.255.47.118 180.126.237.192 222.220.84.5 42.54.163.14 59.58.209.196 91.139.212.42</td>
  </tr>
  <tr>
   <td>20190830</td>
   <td>112.225.208.200 114.228.75.210 153.124.173.79 182.119.153.179 220.176.118.235 37.130.154.105 39.87.180.98</td>
  </tr>
  <tr>
   <td>20190831</td>
   <td>112.93.138.80 115.200.120.56 123.145.79.20 123.157.113.170 218.57.96.113 39.65.132.59 39.87.180.98 69.115.101.133</td>
  </tr>
  <tr>
   <td>20190901</td>
   <td>121.27.223.88 125.106.74.14 182.116.212.37 182.156.186.3 49.69.241.231 72.49.136.21 82.60.134.213 86.57.211.69</td>
  </tr>
  <tr>
   <td>20190902</td>
   <td>106.111.165.111 117.93.16.253 122.191.198.17</td>
  </tr>
  <tr>
   <td>20190903</td>
   <td>119.114.91.86 125.79.104.184 180.165.221.55 49.83.139.19</td>
  </tr>
  <tr>
   <td>20190904</td>
   <td>112.123.132.125 115.199.123.86 49.83.57.239</td>
  </tr>
  <tr>
   <td>20190905</td>
   <td>1.189.23.15 101.30.120.155 106.87.49.207 115.220.174.36 118.39.154.131 119.192.144.217 121.224.199.85 140.224.103.250 170.80.224.63 203.218.2.110 49.1.14.104</td>
  </tr>
  <tr>
   <td>20190906</td>
   <td>103.110.12.239 115.229.199.136 27.210.210.218 5.200.162.222 59.148.43.97 61.174.234.54 95.81.126.128</td>
  </tr>
  <tr>
   <td>20190907</td>
   <td>111.162.224.181 116.252.152.98 151.233.240.164 222.76.187.88</td>
  </tr>
  <tr>
   <td>20190908</td>
   <td>118.118.156.58 14.33.133.188 180.119.42.166 182.245.73.219 220.171.203.15 221.231.57.8 60.185.110.140</td>
  </tr>
  <tr>
   <td>20190909</td>
   <td>105.209.141.4 112.81.82.36 114.216.7.230 116.54.99.191 117.60.134.37 180.126.235.8 222.188.55.78 49.67.106.140 49.70.253.94</td>
  </tr>
  <tr>
   <td>20190910</td>
   <td>1.30.141.60 106.87.51.165 114.236.8.117 119.191.151.29 123.110.38.81 14.32.16.71 180.114.241.82 27.155.11.111 49.83.95.83</td>
  </tr>
 </tbody>
</table>
</body>
</html>
%

これをWebブラウザでチェックすると次のようになる。

出力結果をWebブラウザでチェック

作成したシェルスクリプトをcron(8)に登録して、毎日または毎時実行するような作りにしておけば、基本的にWebブラウザからアクセスするだけでモニタリング完了、という状態に持っていくことができる。

こんな感じで建設的に手抜きを進めていくには、シェルスクリプトのようなプログラミング言語の使用が便利だ。一度作ってしまえば後は楽ができるので、作成意欲も湧くというものである。