web-dev-qa-db-ja.com

SSHサーバーを強化する方法は?

SSHサーバー周辺のセキュリティが完全に不浸透であることを確認するために、どのような対策を講じることができますか?

これは最初からコミュニティWikiになるので、サーバーを保護するために人々が何をするかを見てみましょう。

128
LassePoulsen

正しいログイン情報の提供に失敗したクライアントIPをsshdがブロックするようにします。「 DenyHØsts 」は、このジョブを非常に効果的に実行できます。私はこれをすべてのLinuxボックスにインストールしており、何らかの外部からのアクセスが可能です。

これにより、SSHDに対する強制攻撃が有効にならないようになりますが、パスワードを忘れた場合にロックアウトされる可能性があることを覚えておいてください(!)。これは、アクセスできないリモートサーバーで問題になる可能性があります。

21
LassePoulsen

パスワードではなく公開/秘密キーのペアを認証に使用します。

  1. サーバーにアクセスする必要があるすべてのコンピューターに対して、パスフレーズで保護されたSSHキーを生成します。

    ssh-keygen

  2. 許可されたコンピューターからの公開鍵SSHアクセスを許可します。

    ~/.ssh/id_rsa.pubの内容を各コンピューターからサーバー上の~/.ssh/authorized_keysの個々の行にコピーするか、アクセスを許可するすべてのコンピューターでssh-copy-id [server IP address]を実行します(サーバーを入力する必要があります)プロンプトでのパスワード)。

  3. パスワードSSHアクセスを無効にします。

    /etc/ssh/sshd_configを開き、#PasswordAuthentication yesという行を見つけて、PasswordAuthentication noに変更します。 SSHサーバーデーモンを再起動して、変更を適用します(Sudo service ssh restart)。

現在、サーバーにSSHで接続する唯一の方法は、~/.ssh/authorized_keysの行に一致するキーを使用することです。この方法を使用すると、Iはブルートフォース攻撃を気にしません。パスワードを推測しても拒否されるためです。 公開鍵/秘密鍵のペアを強引に強制することは不可能です 今日の技術では。

108
Asa Ayers

私はお勧めします:

  • fail2ban を使用して、ブルートフォースログイン試行を防ぎます。

  • SSH経由でのルートとしてのログインを無効にします。これは、攻撃者がユーザー名とパスワードの両方を把握して、攻撃をより困難にする必要があることを意味します。

    PermitRootLogin no/etc/ssh/sshd_configに追加します。

  • サーバーにSSH接続できるユーザーを制限します。グループごとまたは特定のユーザーごと。

    AllowGroups group1 group2またはAllowUsers user1 user2を追加して、サーバーにSSHできるユーザーを制限します。

72
Mark Davidson

他の回答はセキュリティを提供しますが、ログをより静かにし、アカウントからロックアウトされる可能性を低くするためにできることが1つあります。

サーバーをポート22から別のポートに移動します。ゲートウェイまたはサーバーのいずれかで。

セキュリティは向上しませんが、すべてのランダムなインターネットスキャナーがログファイルを乱雑にしないことを意味します。

24
Douglas Leeder

HOTP または TOTP で2要素認証を有効にします。これは、13.10以降で利用できます。

これには、ここでの別の回答のように、パスワード認証よりも公開キー認証を使用することも含まれますが、ユーザーは自分の秘密キーに加えて2番目のデバイスを持っていることを証明する必要があります。

概要:

  1. Sudo apt-get install libpam-google-authenticator

  2. 各ユーザーにgoogle-authenticatorコマンドを実行させて、~/.google-authenticatorを生成し、2要素デバイス(たとえば、Google認証システムAndroidアプリ)の構成を支援します。

  3. /etc/ssh/sshd_configを編集して設定:

    ChallengeResponseAuthentication yes
    PasswordAuthentication no
    AuthenticationMethods publickey,keyboard-interactive
    
  4. Sudo service ssh reloadを実行して、/etc/ssh/sshd_configへの変更を取得します。

  5. /etc/pam.d/sshdを編集して、次の行を置き換えます。

    @include common-auth
    

    で:

    auth required pam_google_authenticator.so
    

さまざまな構成オプションの詳細については、昨年の私のブログ投稿: buntuでの2要素ssh認証の改善

23
Robie Basak

簡単な方法が1つあります。インストールfw(「複雑でないファイアウォール」)をインストールし、着信接続のレート制限に使用します。

コマンドプロンプトから次のように入力します。

$ Sudo ufw limit OpenSSH 

fwがインストールされていない場合は、これを実行して再試行してください。

$ Sudo aptitude install ufw 

多くの攻撃者は、パスワードをブルートフォースするためにSSHサーバーを使用しようとします。これにより、同じIPアドレスから30秒ごとに6つの接続のみが許可されます。

20
mpontillo

セキュリティを強化したい場合、または企業ネットワークの奥深くにあるSSHサーバーにアクセスする必要がある場合は、匿名化ソフトウェア Tor を使用して hidden service を設定します。

  1. Torをインストールし、SSHサーバー自体をセットアップします。
  2. Sshdがlocalhostでのみリッスンするようにしてください。
  3. /etc/tor/torrcを開きます。 HiddenServiceDir /var/lib/tor/sshおよびHiddenServicePort 22 127.0.0.1:22を設定します。
  4. var/lib/tor/ssh/hostnameを見てください。 d6frsudqtx123vxf.onionのような名前があります。これは、非表示のサービスのアドレスです。
  5. $HOME/.ssh/configを開き、いくつかの行を追加します。

    Host myhost
    HostName d6frsudqtx123vxf.onion
    ProxyCommand socat STDIO SOCKS4A:127.0.0.1:%h:%p,socksport=9050
    

さらに、ローカルホストにTorが必要です。インストールされている場合、ssh myhostと入力でき、SSHはTorを介して接続を開きます。反対側のSSHサーバーは、localhostでのみポートを開きます。だから、だれも「通常のインターネット」経由で接続することはできません。

12
qbi

このトピックに関するDebian管理の記事があります。基本的なSSHサーバー構成とファイアウォールルールについても説明します。これは、SSHサーバーを強化する場合にも興味深い可能性があります。

そこの記事を参照してください: SSHアクセスを安全に保つ

8
Huygens

SSH強化に対する私のアプローチは...複雑です。次の項目は、ネットワークの最も端の境界からサーバー自体まで、その方法に関するものです。

  1. ブロックリスト内の既知のサービススキャナーとシグネチャを使用したIDS/IPSを介したトラフィックの境界レベルフィルタリングボーダーファイアウォールを介してSnortでこれを実現します(これは私のアプローチ、pfSenseアプライアンス)。時々、VPSのように、これを行うことができません。

  2. SSHポートのファイアウォール/ネットワークフィルタリング特定のシステムのみがSSHサーバーにアクセスできるように明示的に許可します。これは、ネットワークの境界にあるpfSenseファイアウォールを介して行われるか、明示的に構成されている各サーバーのファイアウォールを介して行われます。ただし、私がこれを実行できない場合があります(プライベートペンテストまたはファイアウォールが物事のテストに役立たないセキュリティテストラボ環境を除き、ほとんどそうではありません)。

  3. 私のpfSense、または内部ネットワークをNATし、インターネットとシステムから分離する境界ファイアウォールと組み合わせて、サーバーへのVPNのみのアクセス。インターネットに接続するポートがないため、VPNをネットワークに接続してサーバーに接続します。これは私のすべてのVPSで確実に機能するわけではありませんが、#2と組み合わせて、そのサーバーにVPN接続することで1つのVPSを「ゲートウェイ」にして、他のボックスへのIPを許可することができます。そうすれば、SSHを使用できるかできないかを正確に把握できます。これが、VPNという1つのボックスです。 (または、pfSenseの背後にあるホームネットワーク、VPN接続、およびVPNアクセスを使用できるのは私だけです)。

  4. #3が実行できない場合、fail2ban、4回の試行失敗後にブロックし、IPを1時間以上ブロックするように構成されていますは、常に人々に対するまともな保護ですブルートフォーシングによる攻撃-fail2banで自動的にファイアウォールでemをブロックします。ただし、fail2banの設定は苦痛です...

  5. SSHポートを変更することによるポートの難読化ただし、これは追加のセキュリティ対策なしで行うことは得策ではありません-「隠蔽によるセキュリティ」のスローガンは、多くの場合すでに反論され、議論されています。 IDS/IPSおよびネットワークフィルタリングと組み合わせてこれを実行しましたが、それ自体で行うのは非常に悪いことです。

  6. Duo SecurityのTwo-Factor Authenticationソリューションを介した必須の2要素認証その上で、さらに入るために2FAプロンプトが発生し、各アクセスを確認する必要があります。 (これは究極の便利な機能です-誰かが私のパスフレーズを持っているか、侵入したとしても、Duo PAMプラグインを通過できないためです)。これは、SSHサーバーでの不正アクセスからの最大の保護の1つです。各ユーザーログインはDuoの構成済みユーザーに結び付けなければなりません。また、制限セットがあるため、システムに新規ユーザーを登録できません。

SSHを保護するための私の2セント。または、少なくとも、アプローチに関する私の考え。

6
Thomas Ward

Google認証システムを使用する代わりに、RedHatからFreeOTPアプリをチェックアウトすることもできます。アプリを更新すると、ロックアウトされる場合があります! ;-)

YubikeyやeToken PASSまたはNGなどの他のハードウェアトークンを使用する場合、または多数のユーザーまたは多数のサーバーがある場合は、オープンソースの2要素認証バックエンドを使用できます。

最近、私は これについてのハウツー を書きました。

1
cornelinux

多数のユーザー/証明書については、LDAP統合を検討してください。大規模な組織は、認証または電子メールの署名に証明書が使用されているかどうかにかかわらず、バッジまたはフォブに保存されているユーザー資格情報と証明書のリポジトリとしてLDAPを使用します。例には、openLDAP、openDJ、Active Directory、Oracle Universal Directory、IBM Directory Server、snareWorks ...が含まれます。

コンピューターとグループはLDAPで管理することもでき、資格情報を一元管理できます。そうすれば、ヘルプデスクは、大規模な人口に対処するためのワンストップショップを持つことができます。

CentOS統合へのリンクは次のとおりです。 http://itdavid.blogspot.com/2013/11/howto-configure-openssh-to-fetch-public.html

0
weller1

GeoIPデータベースを使用して、原産国に基づいてブロックすることもできます。

基本的に、米国に住んでいる場合、ロシアの誰かがあなたのSSHに接続する理由はないので、自動的にブロックされます。

スクリプトはここにあります: https://www.axllent.org/docs/view/ssh-geoip/

また、iptablesコマンドを追加して(ドロップレットの場合は追加しました)、それらのIPとの間のすべてのトラフィックを自動的にドロップすることもできます。

0
Michael A Mike

最近、これを行うための小さなチュートリアルを書きました。基本的に、PKIを使用する必要があり、私のチュートリアルでは、セキュリティをさらに高めるために2要素認証を使用する方法も示します。これらのどれも使用しなくても、弱い暗号スイートやその他の基本を削除することでサーバーを保護することについてのちょっとしたヒントもあります。 https://joscor.com/blog/hardening-openssh-server-ubuntu-14-04/

0
01000101