web-dev-qa-db-ja.com

単一のVPSに対するSSHブルートフォース攻撃に応答するにはどうすればよいですか?

今朝、VPSにログオンして、rootユーザーおよび存在しない他のユーザーの何百万ものログイン試行の失敗を見つけました。私は以下の対策を講じて、攻撃者の努力(数か月間続いている)を難読化しようとしました。

質問

  1. これは適切な対応ですか?
  2. これ以上何ができますか?
  3. これらのIPのリストで私ができる貴重なことはありますか?

Centos7 vpsのシステム情報

uname -a
inux vm01 3.10.0-327.22.2.el7.x86_64 #1 SMP Thu Jun 23 17:05:11 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

ステップ1

安全なログからログインに失敗したすべてのIPアドレスを取得するスクリプトを作成しました。 (/var/log/secure

# get_ips.sh
grep "Failed password for" /var/log/secure \
| grep -Po "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" \
| sort \
| uniq -c

ステップ2

手順1のスクリプトから見つかったIPアドレスをブロックするファイアウォールルールを作成するスクリプトを記述します。このスクリプトはip_list_to_rules.sh

#!/bin/bash
# ip_list_to_rules.sh
# script to parse output of get_ips.sh and create firewall rules
# to block ssh requests

if [ -z $1 ]; then
  echo "arg1 must be path to a list of the form <COUNT> <IP>\n"
  exit
fi

LIST=$(readlink -f $1)
SSH_IP=$(echo $SSH_CLIENT | head -n1 | awk '{print $1;}')

echo "Reading IPs from ${LIST}"
echo "SSH Client IP will be ignored (${SSH_IP})"

while read COUNT IP; do

  echo "Creating rule for ${IP}"
  firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -m tcp --source $IP -p tcp --dport 22 -j REJECT
  firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -m tcp --source $IP/24 -p tcp --dport 22 -j REJECT

done<<<"$(cat ${LIST} | grep -v ${SSH_IP})"

ステップ3

すべて実行してルールを保存します。

./get_ips.sh > attack_ips.list
./ip_list_to_rules.sh attack_ips.list
firewall-cmd --reload

更新

以下は、私が回答から取った措置です。

  1. 無効なrootログイン
  2. 変更されたSSHポート
  3. インストールして設定したfail2ban
  4. パスワード認証を無効にし、公開鍵認証を有効にする

普段は chrome secure Shell client を介して接続しているため、実際には4を実行しませんでした。また、公開鍵のサポートはありません。

25
Aage Torleif

はい、これは完全に合理的で一般的なアプローチです。しかし、あなたは fail2ban を再発明しました。スクリプトの問題をデバッグする必要がなく、ssh、Apache、およびその他の一般的なサービスの既存のフィルターを利用できるように、代わりにそれを使用するように切り替えたいと思うでしょう。

残念ながら、これらのIPでできることはそれほど多くありません。あなたは彼らのIPブロックのためにリストされた虐待の連絡先に活動を報告することを試みることができますが、彼らがより深刻な何かをしない限り、それはあなたの時間の価値はありません。

また、絶対に必要でない限り、パスワードベースのログインとrootログインを無効にするなど、標準のssh強化を行う必要があります。

SSHシステムを保護する最も効果的な方法は、ssh秘密鍵のみを使用してログインすることです。パスワード認証を無効にし、直接rootログインを禁止する必要があります。その後、認証に何度も失敗しますが、ブルートフォース攻撃が成功する可能性はありません。

この後もログをクリーンに保つには、SSHポートを別のポート番号に移動する必要があります。

23
Lie Ryan

100万回失敗したログイン試行を見るのは怖いかもしれませんが、これらの試行が使用している帯域幅と処理能力は正直なところ簡単です。

したがって、本当の問題は、システムが安全かどうかです。

  • Rootログインを無効にしましたか?
  • パスワード認証を無効にしてpubキーを優先しましたか?
  • VPSのsshdサービスのデフォルトポートを変更しましたか?

これらの変更はすべて、/ etc/ssh/sshd_configファイルで行うことができます(変更を加えた後は、必ずsshdを再起動してください)。

Fail2banまたはいくつかのカスタムスクリプトを使用してファイアウォールでこれらのIPをブロックできますが、sshd認証自体はそれ自体で十分に安全です。 vpsのうち。

6

サーバー全体をロックダウンしないIPテーブルを設定できますが、ブルートフォース攻撃が遅くなり、効果がなくなります

IPアドレスでSSHアクセスを制限するのが最も安全な方法です。 SSHポートを変更すると、ボットスキャンが無効になる可能性がありますが、標的型攻撃に対してはほとんど効果がありません。

ターミナルで、

/usr/sbin/iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --set
/usr/sbin/iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP

これにより、新しいIPアドレスがブロックされます1分あたり3回以上接続する場合。接続が確立されると、認証が成功します。ログルールを設定して、ここで行われていることをログに記録することもできます

/sbin/iptables -N LOGDROP
/sbin/iptables -A LOGDROP -j LOG
/sbin/iptables -A LOGDROP -j DROP
iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j LOGDROP
3
Tomáš Pánik

他の人が述べたように。かなり厳しいルール(例:3つの間違ったパスワード、または存在しないユーザーでログインを試みる)を使用したFail2banは、非常に効果的です。

また、SSHを非標準ポートに移動することをお勧めします。もちろん、これはあらゆる種類のインテリジェントな攻撃に対してまったく役立ちませんが、かなりの数の最も基本的な自動化スキャナーを排除します。

これをポートスキャンを検出するものと組み合わせてfail2banに接続すると、スキャナー、ボットネット、その他のがらくたのかなりの部分を回避することもできます。

3
Zeta Two
  1. パスワード認証を無効にし、公開鍵認証を有効にする

普段はchrome Secure Shell clientとAFAIKを介して接続しているため、実際には4を実行しませんでした。公開鍵のサポートはありません。

ChromebookでChrome Secure Shell Clientを使用しており、公開鍵認証をサポートしています。すべてのシステムでパスワード認証を無効にしており、Chromebookや私の電話はジュースを使用しています。

1
danofsatx

Fail2banのインストールを試すか、直接のrootログインを無効にするか、デフォルトのsshポートを変更することなどができます

1
Slim-Jay1