何百もの失敗したsshログイン


81

毎晩、RedHat 4サーバーで数百、時には数千の失敗したsshログインが発生します。リモートサイトからのファイアウォールの理由から、標準ポートで実行する必要があります。これをブロックするためにすべきことはありますか。多くの人が同じIPアドレスから来ていることに気付きます。しばらくしてそれらを止めるべきではないでしょうか?

回答:


67

iptablesを使用して、SSHポートへの新しい着信接続をレート制限できます。ターンキーソリューションを提供するために、iptablesの構成全体を確認する必要がありますが、基本的には次のようなルールの追加について話していることになります。

iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 5 --name SSH --rsource -j DROP 
iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH --rsource -j ACCEPT 

これらのルールは、テーブルの前の方でESTABLISHED接続を受け入れていることを前提としています(したがって、新しい接続のみがこれらのルールにヒットします)。新しいSSH接続はこれらのルールにヒットし、マークされます。60秒以内に、単一のIPアドレスから5回試行すると、そのIPからの新しい着信接続がドロップされます。

これは私にとってはうまくいきました。

編集:追加のソフトウェアはインストールされず、カーネルモードで完全に行われるため、この方法は「fail2ban」よりも好みます。"fail2ban"のようにログファイルの解析は処理しませんが、問題がSSHのみである場合、ソフトウェアのインストールが必要で、より複雑なユーザーモードは使用しません。


1
私はこのソリューションが気に入っており、今日の火災が発生したら、今夜それを適切な場所に配置することを計画しています。
MattMcKnight 2009年

2
それは攻撃を遅くし、私はそれをお勧めしますが、そこに分散したスキャンボットネットがあるので、万能薬ではありません。分散スキャンを実行しているボットネットからの無効なログオンは引き続き存在します。、あまりにも多くのあなたがそれについてできることは本当にあなたが取得したいとき、リモートからSSHポートを起動する仕組みを「ポートノック」のいくつかの種類の短いありません。
エヴァンアンダーソン

1
+1 @Evanの「ポートノッキング」の提案。いくつかの情報:linux.die.net/man/1/knockd。しかし、manページの方法(つまり、iptablesルールの追加/削除)ではなく、代わりに-m conditioniptablesマッチを使用してください。
ペポルアン

2
sshトラフィックにのみ適用されるように、これらのルールに--dport 22は必要ありませんか?
クライム

2
@clime-はい。これが2年半前にここに来たとは信じ難く、誰も気づきませんでした!良いキャッチ。
エヴァンアンダーソン


25

可能であれば、SSHに標準以外のポート(ポート10222)を使用することをお勧めしますが、そうは言っていないので、DenyHostsなどを使用することをお勧めします。

http://denyhosts.sourceforge.net/

素晴らしいパッケージ、インストールと設定が簡単。


6
人々がこれを支持する理由はわかりません。SSHは標準ポート22上にあります。これは、外部ネットワーク上にいる場合、送信ファイアウォールを介して非標準ポートを開いていることに依存していないことを意味します。この問題の実際の解決策は上記に文書化されており、インバウンドファイアウォールを介した繰り返し接続の数を制限するか、パスワードログインをオフにします。
アンドリューテイラー

1
OpenSSH 6.7 は、denyhostsが使用するtcpwrappersサポートを削除します。
ゾレダチェ14年

15

インターネット上の任意の場所からシステムにsshできるのは良いことですが、開いているsshポートにロックして、システムに対してさまざまなjoeアカウントおよび辞書攻撃を適用する自動パスワード攻撃システムがあります。これは、毎晩のログサマリーを読むことを意味する場合があり、帯域幅の無駄です。

同じシステム上にWebサーバーがある場合、phpおよびtcpラッパーを使用して、sshインバウンドトラフィックを既知のシステムに制限し、さらにインターネット上の任意のシステムからのアクセスを許可するバックドアキーを与えることができます。

方法は次のとおりです。

/etc/hosts.deny内のすべてのssh接続を拒否します。

# /etc/hosts.deny fragment
sshd:  all

/etc/hosts.allowでIPによる既知のシステムを許可し、さらに一時アクセス用のファイルを追加します。

# /etc/hosts.allow fragment
sshd:  10.0.10.2     # some system
sshd:  172.99.99.99  # some other system
sshd:  /etc/hosts.allow.temporary-sshd-access

Webサーバーでphpファイルを作成し、my-sshd-access.phpのようなわかりにくい名前を付けます。

<?php
function get_ip()
{
    return getenv("REMOTE_ADDR"); 
}

?>

<?php
$out='/etc/hosts.allow.temporary-sshd-access';
$log='/var/log/sshd-access-addition-log';

print "Was:";
readfile($out);
print "<br>";
$ip=get_ip();
$fp=fopen($out,"w");
fputs($fp,$ip);
fclose($fp);

$lfp=fopen($log,"a");
fputs($lfp,$ip);
fputs($lfp,"n");
fclose($lfp);

print "Wrote: ";
readfile($out);
?>

PHPコードを許してください-私はどこかからそれをスワイプしたので、たぶん全体をきれいにすることができるでしょう。アクセスするシステムのIPアドレスを/etc/hosts.allow.temporary-sshd-accessファイルに追加するだけです。このファイルは、接続時にsshd(/etc/hosts.allowに含まれているため)によって読み取られます。 。

Web上の任意のシステムにいて、このシステムにSSH接続したい場合は、まずWebブラウザーを使用してこのファイルにアクセスします(またはwgetまたはequivilentを使用します)。

$ wget http://your.system.name/my-sshd-access.php

これで、システムにSSH接続できるようになります。これが頻繁にsshされる可能性のある場所であれば、/ etc / hosts.allow.temporary-sshd-accessファイルの内容を読み取り、IPアドレスを/ etc / hostsに永続的に追加するのは簡単です。許可します。


これをより安全にするには、httpsでこのページを実行します。
ロバートムンテアヌ

「許可された一時IPアドレス」ファイルの内容を出力しないようにスクリプトを変更した場合、スニッファーがスニッフィングすることはありません。その後、httpsの代わりにhttpで実行できます。
バリーブラウン

「許可された一時IPアドレス」は常にリクエスター(つまり、あなたのもの)のものです。私はそれが何らかの方法で重要だとは思わない。Httpsは、要求されたURLが暗号化されていることを意味します。つまり、ネットワークから盗聴するのは簡単ではありません。
デビッドマッキントッシュ

HTTP接続をプロキシするネットワーク上にあるが、インターネットへの直接ルートが別の出口を経由している場合、これは機能しません。
アンドリューテイラー

OpenSSH 6.7はtcpwrappers supportをドロップします。これはあなたの答えで使用されているものです。
ゾレダチェ14年


8

あなた自身を助けて、パスワードログインを無効にしてください。排他的に認証キーを使用します(たとえば、Google ssh-keygen-例:http : //www.puddingonline.com/~dave/publications/SSH-with-Keys-HOWTO/document/html/SSH-with-Keys-HOWTO-4 .html)サーバーはより安全になり、より快適に接続できるようになり(ssh-agent、ssh-add、keychainを確認してください)、sshブルートフォース攻撃の被害者ではなくなります。


2

別の解決策は、sshを別のポートに移動することです。これらのワームはかなり愚かです。


3
元のポスターは、彼が標準ポートで走る必要があると言った。
kbyrd 2009年

1
申し訳ありませんが、私は:)もっと慎重に質問を読まなければならない
disserman

1
同意する必要があります...「代替」ポートでSSHを実行していると、ログに世界的な違いが生じます。ワームはレンガと同じくらいスマートなので、ダムの自動化スクリプトに対してうまく機能します。人間の攻撃者に対してはあまり良くありません。それでも、ログはの祝福の音持って沈黙をそれらに...
エイブリー・ペイン

..それは、ボットが「愚か」であるということではなく、それは彼らが低垂れ下がった果物を探すように設計されているということです。したがって、SSHポートを移動するのは、果物を地面から遠ざけるスタイルです。
elrobis

2

別のオプションとして、すべてのssh接続が証明書によって検証され、パスワードを完全に廃止することが必要な場合があります。

私はDenyhostsを使用していますが、少数の場所から定期的にリモートで接続しているだけであるため、他の場所を除くすべてのポート22接続をブロックし、ポートノッキングを使用してラップトップでどこからでも接続できるようにします。


1

複数の障害の後にIPを自動的にブロックすることを含むソリューションは、サービス拒否攻撃のリスクをもたらします。総当たり攻撃や辞書攻撃の有効性を低下させるための適切なパスワードポリシーがある限り、それらについてあまり心配する必要はありません。

ユーザー/グループを最初にsshを許可するユーザーのみに制限し、rootとしてのログインを無効にする場合、十分に安全である必要があります。そして、それで十分でない場合は、常にキーベースの認証があります。


1

正直なところ、SSH(およびポート22)を実行する必要がある場合、これらを避けることはできません。パスワードを受け入れる必要がある場合は、さらに悪い状態です。

最善の策は、SSHログを除外するようにログ分析ソフトウェアを構成することです。次に、別のインスタンスを実行してSSHログのみを調べ、procmailを使用して失敗した試行を除外します。複数の失敗したIPアドレスからのログインの成功を監視するスクリプトを作成することもできます。

人々があなたのSSHサーバーを調べるのを止める方法はありません。Denyhosts、fail2ban、およびiptablesの例はある程度まで機能しますが、正当なユーザーを誤ってブロックするという追加の危険性があります。最善の方法は、それを吸い込んでログ分析プロセスを自動化して、考えなければならない時間を減らすことです。


0

Red Hatサーバーでshhログインに失敗したと言うとき、どのようなファイアウォールが背後にあり、何人がshhにログインする必要がありますか。可能であれば、実際のサーバーに近づく前にファイアウォールでの試行を制限することをお勧めします。

正当にアクセスする必要があるIPアドレスの範囲を制限できる場合は、ファイアウォールでアクセスリストを設定できるはずです。ファイアウォールでトラフィックを制限できる場合、サーバーが何かの標的にされているように聞こえるので、ネットワーク侵入システムを調べることをお勧めします。


0

ほとんどのWebホストは、APF + BFDを使用して、失敗したSSHログインをIPブロックします。現在、CSF(Configserver firewall)には、同じことを行うLFDと呼ばれるツールが含まれています。さらに、サーバーにアクセスしたくない特定の国(韓国、中国など、私のSSHプローブの99%に由来するようです)。



0

複数のホストでこの問題に対処する必要がある場合は、OSSECをチェックしてください:http ://www.ossec.net/main/ossec-architecture

これにより、一元化された場所から複数のエージェントを構成して、ブルートフォース攻撃に自動的に対応することができます(ログから抽出できる他のパターンと一緒に)。

ソフトウェアの非常に素晴らしい作品:)


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