回答:
さまざまな解決策があります。最良の方法は、公開鍵/秘密鍵を使用してユーザーを認証する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
サーバーでブルートフォースの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を調べて確認してください)、この非常に簡単で影響の少ないツールを使用してください。
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
は攻撃を示していますか?
knockd
実装に使用recent
とhashlimit
一致を使用して、連続したSSH試行を制限するまず、パスワードを使用せず、代わりにキーを使用することを検討する必要があります。パスワードを使用する必要はありません。これがうまくいく場合は、パスワードログインに反応しないようにOpenSSHサーバーを構成できます。
https://help.ubuntu.com/10.04/serverguide/C/openssh-server.html
fail2banを使用することもオプションです。
fail2banの代わりに使用できるのは、CSF:ConfigServer Security&Firewallです。
LFDが付属します:さまざまなサービスで複数回失敗したログイン試行を検出でき、問題のIPアドレスを(一時的または永続的に)ブロックするログイン失敗デーモン。
フラッド攻撃を防ぎ、侵入を検出する可能性のある他のオプションがいくつかあります。
短所:
世界中へのSSHサービスを許可するつもりですか?または、特定の場所のチームメンバーにのみ?私の答えはあなたの挑戦の厳しさに少し依存します。
いずれの場合でも、SSHサーバーがrootユーザーのパスワードログインを許可しないようにする必要があります。
私のシステムでは、この設定を持っています
PermitRootLogin without-password
しかし、私は彼らが持っている新しいUbuntuで気づきます
PermitRootLogin prohibit-password
「man sshd_config」を読んだ場合、この新しい「禁止パスワード」は同じことを意味し、確かに意味がより明確であることを意味すると思います。これは一部のLinuxシステムではデフォルトではありませんが、おそらくそうであるはずです。
さて、あなたの問題について。システムサーバーは特定の場所の一部のユーザーのみですか?これを行う!
/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が欲しいです、私はこれをいつもする必要はありません。たぶん他の人が今あるかどうかを教えてくれるかもしれません。
一部のユーザーがさまざまなサーバーの異なるsshキーを蓄積すると、フラストレーションの別の原因が発生します。約12の異なるプロジェクトのSSHキーがあるため、公開キーが多すぎるためsshが失敗します(「ssh -o PubkeyAuthentication = false」または.ssh / configファイルにエントリを作成する必要があります。これはPITAです)
Centos Linuxシステムでは、denyhostsパッケージが削除され、fail2banのみが提供されていることに気付きました。面倒なユーザー/ IP範囲のリストを作成し、hosts.denyでそのリストが記録されたため、denyhostsが好きでした。代わりにfail2banをインストールしましたが、問題ありません。私の理解では、これらの悪いユーザーをサーバーの外側のエッジでブロックしたいので、fail2banのようなIPテーブルベースのブロッカーは実際には優れています。Denyhostsはセカンダリレベルで動作し、敵がiptablesを通過した後、sshdデーモンによって拒否されます。
これらのプログラムの両方で、ユーザーがパスワードを忘れてログインを数回試みた場合、ユーザーを刑務所から退出させるのは少し退屈です。ポイントしてクリックするだけで、人々を元に戻すことができるポイントアンドクリックGUIがあると推測していましたが、そうではありません。私はこれを数ヶ月ごとに行うだけで、時間の経過を忘れるので、自分のWebページhttp://pj.freefaculty.org/blog/?p=301に指示を書きました。