#はじめに
自宅の公開sshサーバーに久しぶりにログインしてみて,アクセスログを見ていたところ,不審なIPアドレスから不審なユーザ名でのログイン試行のログを発見してしまった.
当該ログから不審なIPアドレスによるログイン成功がないか,どんなログイン試行があるのか,いくつくらいあるのかを調査してみた.
#前提
自宅sshサーバーは以下の設定の下,運用している.
- 公開鍵認証を有効にしている
- パスワード認証は無効にしている
- rootユーザーでのログインを無効にしている
- ポートはデフォルトのポートから変更している
運用当初は,デフォルトのポートで公開していなかったため,自分のアクセスログしか見当たらなかったが,半年以上運用したことにより,デフォルトのポート以外で公開されている本sshサービスを発見し,ログイン試行を仕掛けてくる通信が出てきた.
パスワード認証をしようとしても,無効になっているので下記のようなメッセージが出力される.
[ユーザー名]@[IPアドレス]: Permission denied (publickey).
上記より,間違いなく不正アクセスを試みた通信である.(おそらくほぼすべて海外のIPアドレスであると推測される)
#ログイン成功ログの調査
sshのログが記録される/var/log/auth.log* のファイルすべてから必要な情報を抽出し,アクセスに成功したIPアドレスを調査した.ここでは,当該ファイルの情報をssh.log という一つのファイルにまとめた前提で進める.
まずは,アクセスに成功した際にログにどのように記録されるか調べた.
以下のようなメッセージがログファイルに記録される.
auth.log:Jan 21 17:55:15 [ホスト名] sshd[26757]: Accepted publickey for [ユーザー名] from [IPアドレス] port 52228 ssh2:...
鍵認証のログインに成功した場合,Accepted という文字列が出力されるため,本文字列をキーにしてログインに成功したIPアドレスを確認した.
IPアドレスの値があるのがスペースをデリミタとして11番目のフィールドにあるので,cut コマンドで当該部分を切り出し,sort およびuniq コマンドで重複排除した.
grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' ssh.log | grep -E 'Accepted' | cut -d ' ' -f 11 | sort | uniq
結果として一つのIPアドレスのみが記録されており,本IPアドレスを調査したところ,見覚えのあるIPアドレスであったため,とりあえず不正アクセスされていないことが確認できた.
#ログイン試行したIPアドレスの調査
とりあえず不正アクセスに成功した形跡はなかったため,一安心した.
次に,どれくらい不正アクセスしたIPアドレスがあるのかを調査した.
grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' ssh.log | cut -d ' ' -f 8 | grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | sort | uniq | wc -l
上記コマンドで,IPアドレスの種類数を集計できる.結果は下記の通り.
146
一つは,自身の使用したIPアドレスである.それ以外はログインに成功した形跡がないため,実に145種類のIPアドレスから不正アクセスを試みられた形跡があった.
各IPアドレスによるアクセス試行回数の上位3種類を調査した.コマンドは下記の通り.
grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' ssh.log | cut -d ' ' -f 8 | grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | sort | uniq -c | sort -nr | head -3
集計結果は下記の通り.1番目のフィールドがアクセス回数,右側のフィールドがIPアドレスである.(IPアドレスの第4オクテッドは伏字)
また,IPアドレス情報から地域を調査した.
1493 64.62.134.*** ← アメリカ
20 92.222.141.*** ← フランス
6 51.91.102.*** ← イギリス
アクセス数に偏りがあるが,海外からのIPアドレスであった.(当たり前だが)
圧倒的にアメリカからの攻撃が多かった.
#使用されたユーザー名
最後に,使用されたユーザー名を調査した.
Invalid user というメッセージが出力されている行が,無効なユーザー名を使用してログインしようとした場合のメッセージなので,本メッセージが出力されている行の8フィールド目にユーザー名が記録されていたため,下記コマンドでユーザー名を抽出した.(ログインに使用されたユーザー名というよりか,無効なユーザー名の抽出である.トップ10をリストアップした.)
grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' ssh.log | grep -E 'Invalid user' | cut -d ' ' -f 8 | sort | uniq -c | sort -nr | head
集計結果は,上記と同様で1番目のフィールドが使用回数,2番目のフィールドがユーザー名である.
796 user
55 test
40 admin
35 oracle
34 postgres
27 ubuntu
22 zabbix
21 nagios
19 ftpuser
12 zimbra
見たところ,サービスの初期ユーザー名が多い印象を受ける.
初期ユーザーをそのまま使用して運用するのもいいけど,その場合は強固なパスワードにするかパスワード認証を廃止して公開鍵認証にすべきと考える.
というのが,今回調査して得た教訓である.
#おわりに
感想をつらつらと書き下す.
- シェルコマンドを駆使すれば,ログ集計をさっと実施できることが分かった
- ポートが違うからといって攻撃が来ないわけでないことが分かった
- とはいえ,公開鍵認証なので不正アクセスされる危険性は低い,と今回の結果から思う
- 初期ユーザー名は狙い撃ちされるので,初期ユーザー名で運用する場合は不正アクセス対策が必須
- 上記に記載しなかったけど,たぶん流れてしまっているログもあるので,ログの確保は運用上必須
以上