はじめに
ZOZOには福利厚生の一環としてクラウドトレーニング費用補助制度があります。この制度を利用することで、毎月100ドルまでAWSのサービスを利用できます。今回は、その制度を活用してAWSの勉強をしていたところ、GuardDutyのDGADomainRequest.Bに引っかかった時の話をまとめます。
検知内容
GuardDutyによって以下が検知されました。
Trojan:EC2/DGADomainRequest.B
EC2 instance i-02ac327aa638d30d1 is querying algorithmically generated domains. Such domains are commonly used by malware and could be an indication of a compromised EC2 instance.
DGADomainRequest.Bは、ドメイン生成アルゴリズム (DGA) で生成された思われるドメインにアクセスしようとしているのを検知する仕組みだそうです。
前提
- 対象のEC2インスタンスはDBアクセス用の踏み台サーバです。したがって、外部ドメインへのアクセスをすることは意図的なものではありません。
- EC2インスタンスにSSHログインするには秘密鍵が必要です。
- EC2インスタンスのセキュリティグループは22番ポートでIP制限はしていませんでした。
- 制度利用者ごとにAWSアカウントが個別に用意されており、当然ながらZOZOTOWNなどのサービスへの影響はありません。
被害状況の確認
鍵認証が突破され、EC2インスタンスに不正ログインされていないかを最初に確認しました。これを最初に実施した理由は、EC2インスタンスが乗っ取られていた場合の被害が大きいからです。
まず、SSH成功回数を確認します。
# grep -c Accepted /var/log/secure
1
こちらの実行結果により、SSH成功は一回であることがわかりました。この成功は自分の操作によるものだと断定しました。理由は、自分が一度だけSSHしたという記憶に合致するのと、ログに含まれる送信元IPアドレスが自分のものであると確認できたからです。
次に、SSH失敗回数を確認します。
# grep -c invalid /var/log/secure
1187
こちらの実行結果により、SSHブルートフォース攻撃により、SSHが失敗しまくっていることがわかりました。
とりあえず、鍵認証が突破されていないことがわかり、一安心です。
原因
SSHでは、「SSHサーバが接続元IPアドレスを逆引きしてホスト名を取得し、そのホスト名を名前解決して接続元IPアドレスと同じものが得られるか」といった確認処理を行う場合があるそうです。(AWSのテクニカルサポートで教えていただきました)
この処理が実行されるかは設定次第です。今回使用したAMI(ami-0c3fd0f5d33134a76)では、EC2インスタンス内の /etc/ssh/sshd_config
で以下のように該当の動作に関する設定がコメントアウトされています。デフォルトは"yes"なので、逆引きが行われることになります。これにより、対象のドメインにアクセスしようとして検知された可能性が高いと考えました。
#UseDNS yes
なお、試しに「GuardDutyにより検知したドメイン名」と「sshdログから確認したIPアドレス」を使って、正引きと逆引きを試してみましたが、成功しませんでした。おそらく、既にドメインの登録が既に削除されてしまったと考えられます。
まとめると、「DGAで生成されたことが疑われるドメインに紐づくIPからSSHされ、送信元IPアドレスの逆引き名前解決をEC2インスタンスが行ったことにより、GuardDutyに検知された」と推察されます。
今回のケースでの対策
UseDNS no
に設定する方法も考えられますが、そもそもSSHでIP制限していない状況を改善したいと考えました。
今回のEC2インスタンスの用途として、 EC2 Instance Connect
ができれば十分です。その場合、例えばregionがap-northeast-1であれば、許可する送信元IPアドレスを 3.112.23.0/29
のみに絞ることができます。ただし、このIPは変動しうるので注意が必要です。以下が対象のIPレンジです。
https://ip-ranges.amazonaws.com/ip-ranges.json