Visualize illegal ssh access attempts and access source
 
            /var/log/secureをBigQueryに送り始め、sshdへのアクセスがあるIPアドレスを多い順に集計してみたりしています。
今回は日毎にssh接続の試行失敗回数を集計して、それに対するIPアドレスの内訳も出してみます。
こんなクエリを作成してみます。
SELECT
  LEFT(FORMAT_UTC_USEC(UTC_USEC_TO_DAY(time * 1000000)), 10) AS day,
  COUNT(ident) AS count_ident,
  REGEXP_EXTRACT(message, r'(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})') AS ip_address
FROM
  TABLE_DATE_RANGE(prod.syslog_secure_, DATE_ADD(CURRENT_TIMESTAMP(), -1, 'MONTH'), CURRENT_TIMESTAMP())
WHERE
  message CONTAINS 'error: PAM: System error for'
  AND ident = 'sshd'
GROUP BY
  day,
  ip_address
ORDER BY
  day
- 秒単位のunix時間に1000000を掛けてマイクロ秒に変換
- UTC_USEC_TO_DAY関数でその日の0時0分0秒に変換(- 2017-05-23 13:18:23が- 2017-05-23 00:00:00になる)
- LEFTで- 2017-05-23のみ表示
- identの行をカウント
- messageからIPアドレスのみ抽出
- TABLE_DATE_RANGEで1ヶ月を対象期間にする
- messageにerror: PAM: System error forが含まれているかつidentがsshdの行のみを対象にする(= sshアクセスの試行失敗を抽出している)
- 日付とIPアドレスでグルーピングして日付順にソート
するとこのようなグラフが取得できました。

カラフルできれいなグラフですねえ… 全員攻撃者ですけどね!
あとRe:dashの設定で毎日グラフを更新するように設定しておきます。
さらにSlackにレポートとして出してみます。毎日午前11時にレポートするには以下のようなスラッシュコマンドを実行します。
/remind #チャンネル名 "http://Re:dashのドメイン/queries/クエリの番号" at 11AM every day
Re:dashとSlackの連携周りについての詳細は以下を参照。
感想
日々どのくらい自分のサーバに対してsshアクセスが試みられているのか可視化された。多い日は1日8万回以上も試行されている…。
firewalldの設定の見直しやsshdの設定の見直しを行う良い機会になりました。 SELinuxもpermissiveじゃなくてenforceでちゃんと運用していきたい…。