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でちゃんと運用していきたい…。