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:232017-05-23 00:00:00になる)
  • LEFT2017-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でちゃんと運用していきたい…。