Bruteforce ssh攻撃からubuntuサーバーを保護する方法は?


21

パスワードは安全に保護されていますが、ブルートフォース攻撃が行われているときにサーバーのパフォーマンスが大幅に低下することについて不満を言う人がいるのを聞きました。ubuntu 10.10サーバーをこのような攻撃から保護するにはどうすればよいですか?このための装甲プロファイルはありますか?またはそれに対処する他の方法はありますか?

回答:


19

さまざまな解決策があります。最良の方法は、公開鍵/秘密鍵を使用してユーザーを認証するRSA認証を使用することです。

さまざまなアプローチについては、この素晴らしいマニュアルを参照してください(RSA認証が含まれています):http : //www.la-samhna.de/library/brutessh.html

技術に詳しくないユーザーを複雑にしたくないため、サーバーで3番目のソリューションを使用していますiptables。1分あたりの接続数を制限して、ブルートフォース攻撃を非効率的および非効率的にしています。

私が使用しているソリューションは次のとおりです。

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j LOG --log-prefix "SSH_brute_force "
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP

ここで述べように、これにより、60秒以内に任意のIPアドレスからの3つのポート22接続が許可され、接続の許可を再開するまで60秒の接続試行は必要ありません。--rttlオプションは、パケットの照合時にデータグラムのTTLも考慮に入れて、スプーフィングされたソースアドレスに対する緩和に努めます。

前述のガイドで述べたように、ホワイトリストを使用して、信頼できるユーザーをこれらのルールから分離することをお勧めします。

iptables -N SSH_WHITELIST

次に、信頼できるホストを追加します。

iptables -A SSH_WHITELIST -s $TRUSTED_HOST -m recent --remove --name SSH -j ACCEPT

その後、ルールを作成します。

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j SSH_WHITELIST
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j ULOG --ulog-prefix SSH_brute_force
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP

パスワード認証をオフにすることに関して、その公開鍵を失った場合、どうすればサーバーにログインできますか?(私はサーバーへの物理的アクセスを持っていません、それはVPSです)
-Dziamid

公開鍵はどこにでも公開できますので、心配する必要はありません。公共の場所であっても忘れないように、どこかに置くことができます。
ペドラム


求められたときに公開鍵を公開するようにサーバーを設定する方法はありますか?
ジアミッド

1
sshを使用すると、そうは思いません。apacheなどのWebサーバーがインストールされている場合、webを使用してキーを共有できます。
ペドラム

8

サーバーでブルートフォースのssh攻撃が1日に1〜2回発生します。denyhosts(ubuntuパッケージ:denyhosts)をインストールしました。この目的のための非常にシンプルで効果的なツールです。基本的には、定期的にログをスキャンしてブルートフォース攻撃を検出し、これらの攻撃の発信元のIPを/etc/hosts.denyファイルに入れます。あなたは彼らから二度と聞くことはないでしょう、そしてあなたの負荷はかなり減らされるべきです。構成ファイル/etc/denyhosts.confを介して非常に構成可能であるため、攻撃を何回試行するかなどの問題を調整できます。

透過的な機能により、何が起こっているかを簡単に確認でき(電子メール通知:「あぁ、もう1つの卑劣な攻撃が阻止されました!」)、ユーザーが繰り返しパスワードを誤って入力したことによるミスを元に戻します。

もちろん、他の認証方法への切り替えについて前述したことはすべて有効ですが、ユーザーの要件と要件が一致しない場合もあります。

また、iptablesでの新しい接続レート制限は、hosts.denyを介したアクセスを拒否するよりも適切な選択です。したがって、fail2banもご覧ください。ただし、ssh brute-forceが主な関心事であることがわかっている場合(手動で/var/log/auth.logを調べて確認してください)、この非常に簡単で影響の少ないツールを使用してください。


1
私の/var/log/auth.logは最近かなり大きくなっています。このようなエントリMar 27 10:28:43 smartfood sshd[17017]: Failed password for root from 218.15.136.38 port 33119 ssh2 Mar 27 10:28:47 smartfood sshd[17019]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=218.15.136.38 user=rootは攻撃を示していますか?
ジアミッド

1
これは、IP 218.15.136.38の誰かがrootとしてログインしようとしたことを意味します。あなただったかもしれませんが、おそらくtools.whois.net/whoisbyipを使用しているため、このIPは中国で登録されていることがわかります。これはミンスクからの方法です;-) 。道徳:ssh(/ etc / ssh / sshd_configのPermitRootLogin no)を介したルートログインを無効にします。これを有効にする正当な理由がないためです。そして、denyhostsまたはfail2banを検討してください。また、ポート22およびその他の必要なもの(ただしそれ以上ではない)を介した重要なアクセスのみを許可するファイアウォールがあることを確認してください
-DrSAR

6
  1. sshdポートを非標準のものに変更します
  2. ポートノッキングシステムのknockd実装に使用
  3. iptables recenthashlimit一致を使用して、連続したSSH試行を制限する
  4. パスワードを使用しないで、代わりにSSHキーを使用します

3
-1最初のアドバイスでは、実際のセキュリティの増加がないため、事態を複雑にします
-steabert

sshキーを使用し、sshを介したパスワード認証をオフにする場合、本当に1,2,3が必要ですか?
ジアミッド

4
@steabertは、ポート22を介してブルートフォースしようとするスクリプトキディに対して役立ちます。それは私の経験です。私が設定しているときに誰かがインターネットに面したサーバーをブルートフォースし続け、システムに警告の後に警告を送信させます。私は港を移動し、警告はおさまりました。
ペポルアン

@Dziamid sshキーは、誰かがシステムに侵入するのを防ぎます。しかし、ポート22に接続しようとするのを止めません
。-ペポルアン

3
@Dziamidいいえ、正しくありません。他の認証方法(RSAAuthentication、PubkeyAuthentication、#KerberosAuthenticationなど)はすべて、引き続きポート22経由で接続します。
DrSAR

3

まず、パスワードを使用せず、代わりにキーを使用することを検討する必要があります。パスワードを使用する必要はありません。これがうまくいく場合は、パスワードログインに反応しないようにOpenSSHサーバーを構成できます。

https://help.ubuntu.com/10.04/serverguide/C/openssh-server.html

fail2banを使用することもオプションです。

https://help.ubuntu.com/community/Fail2ban


公開鍵を紛失した場合、サーバーに接続するにはどうすればよいですか?
ジアミッド

1
コンソールまたは直接アクセス経由のみ。サーバーを管理できれば、キーを失うことはないと確信しています。
-ddeimeke

0

サーバーはネットワーク上でどれくらい広く公開されていますか?おそらく、ネットワーク管理者と話をして、サーバーへのネットワークアクセスを監視および制限できるかどうかを確認できます。アカウントのログインが安全であっても、サーバーは単純なDoS / DDoS攻撃に苦しむようです。


0

fail2banの代わりに使用できるのは、CSF:ConfigServer Security&Firewallです。

LFDが付属します:さまざまなサービスで複数回失敗したログイン試行を検出でき、問題のIPアドレスを(一時的または永続的に)ブロックするログイン失敗デーモン。

フラッド攻撃を防ぎ、侵入を検出する可能性のある他のオプションがいくつかあります。

短所:

  • LFDが機能するためには、CSFをファイアウォールとして使用する必要があります。したがって、既存のファイアウォールがある場合は、ファイアウォールをCSFに置き換えて、構成を移植する必要があります。
  • Ubuntu用にはパッケージ化されていません。configserver.comからの自動更新を信頼するか、自動更新を無効にする必要があります。
  • 非常に人気があると聞いているので、賢い侵入者は侵入検知を検出する前に無効にする方法をおそらく知っているでしょう!

0

世界中へのSSHサービスを許可するつもりですか?または、特定の場所のチームメンバーにのみ?私の答えはあなたの挑戦の厳しさに少し依存します。

いずれの場合でも、SSHサーバーがrootユーザーのパスワードログインを許可しないようにする必要があります。

  1. / etc / ssh / sshd_configで、SSHキーを使用しない限り、rootログインを許可しないでください。

私のシステムでは、この設定を持っています

PermitRootLogin without-password

しかし、私は彼らが持っている新しいUbuntuで気づきます

PermitRootLogin prohibit-password

「man sshd_config」を読んだ場合、この新しい「禁止パスワード」は同じことを意味し、確かに意味がより明確であることを意味すると思います。これは一部のLinuxシステムではデフォルトではありませんが、おそらくそうであるはずです。

さて、あなたの問題について。システムサーバーは特定の場所の一部のユーザーのみですか?これを行う!

  1. /etc/hosts.denyを編集して挿入

    すべて:すべて

次に/etc/hosts.allowを編集して、SSHの使用を許可するIP番号または範囲をリストします。111.222.65.101から111.222.65.255のようなIP番号を持つすべてのシステムを許可する場合は、hosts.allowにこのようなエントリを入力するため、表記は少しわかりにくいです。

ALL: 127.0.0.1
sshd: 111.222.65.
sshdfwd-X11: 111.222.65.

それはブルートフォースの強力なソリューションです。IP範囲でユーザーを列挙できる場合は、実行してください!

このソリューションは、IPテーブルが作成される前に存在していましたが、管理がはるかに簡単です(と思います)が、IPテーブルルーチンは、hosts.allowおよびhostsによって駆動されるプログラムよりも早く敵を見つけるため、IPテーブルソリューションほど良くありません.deny。しかし、これは確かな火事であり、SSHだけでなく、多くの問題を解決する簡単な方法です。

自分で作成した問題に注意してください。FTPサーバー、Webサーバーなどを開くには、ホストのエントリを許可する必要があります。

iptablesとファイアウォールをいじることで、同じ基本的な目的を達成できます。ある意味では、外側の境界で敵をブロックしているため、これは好ましい解決策です。Ubuntuには「ufw」(複雑でないファイアウォール)があり、「man ufw」には多くの例があります。私はむしろこれを歩き回るのに良いGUIが欲しいです、私はこれをいつもする必要はありません。たぶん他の人が今あるかどうかを教えてくれるかもしれません。

  1. ここの他の投稿では、ユーザーのみにSSH公開キーを使用することを提案しています。それは確かに、ユーザーの複雑さとフラストレーションを犠牲にして役立ちます。このラボには15台のコンピューターがあります。ユーザーはコンピューター間を行き来します。SSHキー認証を要求すると、ユーザーは1台のコンピューターから次のコンピューターに移動するため、大きな手間がかかります。

一部のユーザーがさまざまなサーバーの異なるsshキーを蓄積すると、フラストレーションの別の原因が発生します。約12の異なるプロジェクトのSSHキーがあるため、公開キーが多すぎるためsshが失敗します(「ssh -o PubkeyAuthentication = false」または.ssh / configファイルにエントリを作成する必要があります。これはPITAです)

  1. サーバーを広い世界からSSHに開かれたままにする必要がある場合は、拒否ルーチンを使用して、頻繁にログインしようとする場所をブロックする必要があります。これには、denyhostsとfail2banの2つの素晴らしいプログラムがあります。これらのプログラムには、好きな期間、犯罪者を禁止できる設定があります。

Centos Linuxシステムでは、denyhostsパッケージが削除され、fail2banのみが提供されていることに気付きました。面倒なユーザー/ IP範囲のリストを作成し、hosts.denyでそのリストが記録されたため、denyhostsが好きでした。代わりにfail2banをインストールしましたが、問題ありません。私の理解では、これらの悪いユーザーをサーバーの外側のエッジでブロックしたいので、fail2banのようなIPテーブルベースのブロッカーは実際には優れています。Denyhostsはセカンダリレベルで動作し、敵がiptablesを通過した後、sshdデーモンによって拒否されます。

これらのプログラムの両方で、ユーザーがパスワードを忘れてログインを数回試みた場合、ユーザーを刑務所から退出させるのは少し退屈です。ポイントしてクリックするだけで、人々を元に戻すことができるポイントアンドクリックGUIがあると推測していましたが、そうではありません。私はこれを数ヶ月ごとに行うだけで、時間の経過を忘れるので、自分のWebページhttp://pj.freefaculty.org/blog/?p=301に指示を書きました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.