Ubuntu 16.04を使用して、特別な方法でSSH認証を強化しようとしています。
最小限のUbuntuサーバーを使用するマシンがあります。主にファイルの転送先ローカル経由OpenSSHサーバー。現在、いくつかの理由からそのマシンにファイアウォールがありません。また、キーペアの使用も避けているため、パスワードのみを使用しています。ブルートフォース攻撃から防御するために私が残した唯一の方法の1つであり、現時点で最も望ましい方法は、Yの接続が試行された後、X時間にわたってユーザーをブロックするメカニズムを使用することです。
総当たり攻撃から防御する方法としてYの接続が試行された後、Xの時間にわたってユーザーをブロックするスタンドアロンメカニズム(つまり、ファイアウォールの一部としてではない)が必要です。
希望する状況を実現できるユーティリティ(および特定の構成)を知っていますか?
Sudo apt-get install fail2ban
次に:
Sudo vim /etc/fail2ban/jail.conf
bantime
を編集して、希望する禁止時間を設定します
maxretry
を編集して最大失敗試行回数を設定します
他のコメントで述べたように、fail2banにはiptablesが必要です。
これにはiptables、実質的に0メモリのみが必要で、ポートスキャンからサービスを効果的に隠します
直接質問に答えるわけではありませんが、繰り返し試行を禁止する代わりに、ポートのノッキングを実装してサービスの可用性を隠すことができます。
簡単なグーグル検索でこれが明らかになります: https://www.digitalocean.com/community/tutorials/how-to-configure-port-knocking-using-only-iptables-on-an-ubuntu-vps =
ただし、iptablesは必要です。
追伸:あいまいさによるセキュリティはまったくセキュリティではないことは知っていますが、他のプラクティスと併せて、より困難なターゲットにするのに役立ちます。
この回答は、主な質問を満足させるための可能な方法を提供することを意図しています:ブルートフォース攻撃からUbuntu OpenSSHサーバーを保護しますが、ファイアウォールまたはSSHキーペアはありませんか?
実際には、ファイアウォールとSSHキーのペアを使用することを好み、実際に役立つためにDoug Smythiesから 回答 が提供されています。
二要素認証(2FA)は 多要素認証 の一種です。この例では、2FAは次の2つの異なるコンポーネントの組み合わせを使用して、ユーザーが主張するIDを確認します。
時間ベースの6桁のトークンコード-認証コード。デフォルトでは、これらのトークンは30秒間有効であり、タイムスキューの可能性を補うために60秒が追加されます。
ユーザーのパスワード、それ自体は 十分に安全 でなければなりません。
実際、PermitRootLogin no
を設定し、ユーザー名が適切に選択されている場合、この方法は3FAと呼ぶことができます。
さらに、ログインしているコンピューターが総当たりログイン試行に対して強化されていない場合は、認証モジュールのレート制限を有効にできます。
さぁ、始めよう:
Sudo apt-get install libpam-google-authenticator
/etc/pam.d/sshd
を編集して、このディレクティブを追加します。
# Google Authenticator
auth required pam_google_authenticator.so
ファイルの先頭に追加します。このようにして、システムは最初の認証コードを要求し、その後だけパスワードを要求します。ファイルの最後に追加します-システムは最初のパスワードを要求します。
/etc/ssh/sshd_config
を編集し、これらのディレクティブを変更または追加します。
ChallengeResponseAuthentication yes
UsePAM yes
PasswordAuthentication no # You can leave this 'yes' it doesn't matter.
2要素認証を使用するユーザーに切り替えて、ターミナルに入力します。
$ google-authenticator Enter 認証トークンを時間ベース(y/n)にしたいですか yEnterhttps://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/user@Host%3Fsecret%3DE3CY3TNSNBXXXXXX 新しい秘密鍵は次のとおりです。 E3CY3TNSNBXXXXXX 確認コードは229999 緊急スクラッチコードは次のとおりです。 19999711 ... 「/home/user/.google_authenticator」ファイルを更新します(y/n) yEnter 同じ認証トークンの複数の使用を禁止しますか?これにより、30秒ごとに1回のログインに制限されますが、man-in-the-middle攻撃 (y/n) yEnter デフォルトでは、トークンは30秒間有効です。クライアントとサーバー間のタイムスキューを補正するために、現在時刻の前後に追加のトークンを許可します。時間の同期に問題がある場合は、ウィンドウをデフォルトのサイズである1:30分から約4分に増やすことができます。そうしますか (y/n) yEnter ログインしているコンピューターが強化されていない場合 ブルートフォースログイン試行に対して、レート制限を有効にできます 認証モジュール用。デフォルトでは、これにより、攻撃者は30秒ごとに3回までのログイン試行に制限されます。レート制限を有効にしますか (y/n) yEnter
このダイアログは、ユーザーのホームディレクトリに配置される.google_authenticator
という認証ファイルを生成します。すべてのユーザーが同じトークンを使用する場合、このファイルは他のユーザーのアカウントにも使用できます。さらに、このファイルはカスタマイズでき、 Apache2内の2FA にも使用できますが、これは別の話です。
上記の手順で生成された秘密キー-E3CY3TNSNBXXXXXX
-は、一部のアプリケーション内での認証コードの生成に使用されます。
この例では、Chromium/ChromeのAuthenticator拡張機能が使用されています。
編集:
場合によっては、Googleの時計とサーバーの時計との間に差がある可能性があります。この問題に関するいくつかのヒントを次に示します。
残念ながら :VPSの場合、これを行う権限がない可能性があります... VPSを使用している場合は、プロバイダーに連絡して処理してください。
プロバイダーが要件に対応したくない場合、上記のセットアップは機能しますが、タイムシフトが必要です。サーバーのコンソールでdate
と入力し、このタイムシフトを測定します。次に、認証コード生成の瞬間とその使用の瞬間の間のこのタイムシフトを使用します。
そのような保護のために何かをインストールする必要はありません-あなたの iptables system に関連するルールを追加するだけです。
ルールセットの初期段階で、関連するトラフィックがサーバーに戻ることを許可します。
Sudo iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
動的なBadguyリストを設定します。 SSHでパスワード攻撃を行う不正なIPを検出して削除します。 BADGUYリストに追加されると、システムはすべてのパケットをドロップします。
Sudo iptables -A INPUT -i eth0 -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j LOG --log-prefix "SSH BAD:" --log-level info
Sudo iptables -A INPUT -i eth0 -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j DROP
Sudo iptables -A INPUT -i eth0 -p tcp -m tcp --dport 22 -m recent --set --name BADGUY_SSH -j ACCEPT
上記のコードでは、90000秒(25時間)がブロック時間です。
ブロックされたIPアドレスからのすべての試行は、SSHに関連していない場合でも(他のルールがある場合とない場合、および順序によって)、ブロック時間タイマーをリセットします。
接続ごとの不正なパスワードの数を2に制限します。デフォルトは6です。
Sudoとして/etc/ssh/sshd_config
を編集すると、次のように設定されます:
MaxAuthTries 2