SSHサーバー周辺のセキュリティが完全に不浸透であることを確認するために、どのような対策を講じることができますか?
これは最初からコミュニティWikiになるので、サーバーを保護するために人々が何をするかを見てみましょう。
正しいログイン情報の提供に失敗したクライアントIPをsshdがブロックするようにします。「 DenyHØsts 」は、このジョブを非常に効果的に実行できます。私はこれをすべてのLinuxボックスにインストールしており、何らかの外部からのアクセスが可能です。
これにより、SSHDに対する強制攻撃が有効にならないようになりますが、パスワードを忘れた場合にロックアウトされる可能性があることを覚えておいてください(!)。これは、アクセスできないリモートサーバーで問題になる可能性があります。
パスワードではなく公開/秘密キーのペアを認証に使用します。
サーバーにアクセスする必要があるすべてのコンピューターに対して、パスフレーズで保護されたSSHキーを生成します。
ssh-keygen
許可されたコンピューターからの公開鍵SSHアクセスを許可します。
~/.ssh/id_rsa.pub
の内容を各コンピューターからサーバー上の~/.ssh/authorized_keys
の個々の行にコピーするか、アクセスを許可するすべてのコンピューターでssh-copy-id [server IP address]
を実行します(サーバーを入力する必要があります)プロンプトでのパスワード)。
パスワードSSHアクセスを無効にします。
/etc/ssh/sshd_config
を開き、#PasswordAuthentication yes
という行を見つけて、PasswordAuthentication no
に変更します。 SSHサーバーデーモンを再起動して、変更を適用します(Sudo service ssh restart
)。
現在、サーバーにSSHで接続する唯一の方法は、~/.ssh/authorized_keys
の行に一致するキーを使用することです。この方法を使用すると、Iはブルートフォース攻撃を気にしません。パスワードを推測しても拒否されるためです。 公開鍵/秘密鍵のペアを強引に強制することは不可能です 今日の技術では。
私はお勧めします:
fail2ban を使用して、ブルートフォースログイン試行を防ぎます。
SSH経由でのルートとしてのログインを無効にします。これは、攻撃者がユーザー名とパスワードの両方を把握して、攻撃をより困難にする必要があることを意味します。
PermitRootLogin no
を/etc/ssh/sshd_config
に追加します。
サーバーにSSH接続できるユーザーを制限します。グループごとまたは特定のユーザーごと。
AllowGroups group1 group2
またはAllowUsers user1 user2
を追加して、サーバーにSSHできるユーザーを制限します。
他の回答はセキュリティを提供しますが、ログをより静かにし、アカウントからロックアウトされる可能性を低くするためにできることが1つあります。
サーバーをポート22から別のポートに移動します。ゲートウェイまたはサーバーのいずれかで。
セキュリティは向上しませんが、すべてのランダムなインターネットスキャナーがログファイルを乱雑にしないことを意味します。
HOTP または TOTP で2要素認証を有効にします。これは、13.10以降で利用できます。
これには、ここでの別の回答のように、パスワード認証よりも公開キー認証を使用することも含まれますが、ユーザーは自分の秘密キーに加えて2番目のデバイスを持っていることを証明する必要があります。
概要:
Sudo apt-get install libpam-google-authenticator
各ユーザーにgoogle-authenticator
コマンドを実行させて、~/.google-authenticator
を生成し、2要素デバイス(たとえば、Google認証システムAndroidアプリ)の構成を支援します。
/etc/ssh/sshd_config
を編集して設定:
ChallengeResponseAuthentication yes
PasswordAuthentication no
AuthenticationMethods publickey,keyboard-interactive
Sudo service ssh reload
を実行して、/etc/ssh/sshd_config
への変更を取得します。
/etc/pam.d/sshd
を編集して、次の行を置き換えます。
@include common-auth
で:
auth required pam_google_authenticator.so
さまざまな構成オプションの詳細については、昨年の私のブログ投稿: buntuでの2要素ssh認証の改善 。
簡単な方法が1つあります。インストールfw(「複雑でないファイアウォール」)をインストールし、着信接続のレート制限に使用します。
コマンドプロンプトから次のように入力します。
$ Sudo ufw limit OpenSSH
fwがインストールされていない場合は、これを実行して再試行してください。
$ Sudo aptitude install ufw
多くの攻撃者は、パスワードをブルートフォースするためにSSHサーバーを使用しようとします。これにより、同じIPアドレスから30秒ごとに6つの接続のみが許可されます。
セキュリティを強化したい場合、または企業ネットワークの奥深くにあるSSHサーバーにアクセスする必要がある場合は、匿名化ソフトウェア Tor を使用して hidden service を設定します。
localhost
でのみリッスンするようにしてください。/etc/tor/torrc
を開きます。 HiddenServiceDir /var/lib/tor/ssh
およびHiddenServicePort 22 127.0.0.1:22
を設定します。var/lib/tor/ssh/hostname
を見てください。 d6frsudqtx123vxf.onion
のような名前があります。これは、非表示のサービスのアドレスです。$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でのみポートを開きます。だから、だれも「通常のインターネット」経由で接続することはできません。
このトピックに関するDebian管理の記事があります。基本的なSSHサーバー構成とファイアウォールルールについても説明します。これは、SSHサーバーを強化する場合にも興味深い可能性があります。
そこの記事を参照してください: SSHアクセスを安全に保つ 。
SSH強化に対する私のアプローチは...複雑です。次の項目は、ネットワークの最も端の境界からサーバー自体まで、その方法に関するものです。
ブロックリスト内の既知のサービススキャナーとシグネチャを使用したIDS/IPSを介したトラフィックの境界レベルフィルタリングボーダーファイアウォールを介してSnortでこれを実現します(これは私のアプローチ、pfSenseアプライアンス)。時々、VPSのように、これを行うことができません。
SSHポートのファイアウォール/ネットワークフィルタリング特定のシステムのみがSSHサーバーにアクセスできるように明示的に許可します。これは、ネットワークの境界にあるpfSenseファイアウォールを介して行われるか、明示的に構成されている各サーバーのファイアウォールを介して行われます。ただし、私がこれを実行できない場合があります(プライベートペンテストまたはファイアウォールが物事のテストに役立たないセキュリティテストラボ環境を除き、ほとんどそうではありません)。
私のpfSense、または内部ネットワークをNATし、インターネットとシステムから分離する境界ファイアウォールと組み合わせて、サーバーへのVPNのみのアクセス。インターネットに接続するポートがないため、VPNをネットワークに接続してサーバーに接続します。これは私のすべてのVPSで確実に機能するわけではありませんが、#2と組み合わせて、そのサーバーにVPN接続することで1つのVPSを「ゲートウェイ」にして、他のボックスへのIPを許可することができます。そうすれば、SSHを使用できるかできないかを正確に把握できます。これが、VPNという1つのボックスです。 (または、pfSenseの背後にあるホームネットワーク、VPN接続、およびVPNアクセスを使用できるのは私だけです)。
#3が実行できない場合、fail2ban、4回の試行失敗後にブロックし、IPを1時間以上ブロックするように構成されていますは、常に人々に対するまともな保護ですブルートフォーシングによる攻撃-fail2banで自動的にファイアウォールでemをブロックします。ただし、fail2banの設定は苦痛です...
SSHポートを変更することによるポートの難読化ただし、これは追加のセキュリティ対策なしで行うことは得策ではありません-「隠蔽によるセキュリティ」のスローガンは、多くの場合すでに反論され、議論されています。 IDS/IPSおよびネットワークフィルタリングと組み合わせてこれを実行しましたが、それ自体で行うのは非常に悪いことです。
Duo SecurityのTwo-Factor Authenticationソリューション 。を介した必須の2要素認証その上で、さらに入るために2FAプロンプトが発生し、各アクセスを確認する必要があります。 (これは究極の便利な機能です-誰かが私のパスフレーズを持っているか、侵入したとしても、Duo PAMプラグインを通過できないためです)。これは、SSHサーバーでの不正アクセスからの最大の保護の1つです。各ユーザーログインはDuoの構成済みユーザーに結び付けなければなりません。また、制限セットがあるため、システムに新規ユーザーを登録できません。
SSHを保護するための私の2セント。または、少なくとも、アプローチに関する私の考え。
Google認証システムを使用する代わりに、RedHatからFreeOTPアプリをチェックアウトすることもできます。アプリを更新すると、ロックアウトされる場合があります! ;-)
YubikeyやeToken PASSまたはNGなどの他のハードウェアトークンを使用する場合、または多数のユーザーまたは多数のサーバーがある場合は、オープンソースの2要素認証バックエンドを使用できます。
最近、私は これについてのハウツー を書きました。
多数のユーザー/証明書については、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
GeoIPデータベースを使用して、原産国に基づいてブロックすることもできます。
基本的に、米国に住んでいる場合、ロシアの誰かがあなたのSSHに接続する理由はないので、自動的にブロックされます。
スクリプトはここにあります: https://www.axllent.org/docs/view/ssh-geoip/
また、iptablesコマンドを追加して(ドロップレットの場合は追加しました)、それらのIPとの間のすべてのトラフィックを自動的にドロップすることもできます。
最近、これを行うための小さなチュートリアルを書きました。基本的に、PKIを使用する必要があり、私のチュートリアルでは、セキュリティをさらに高めるために2要素認証を使用する方法も示します。これらのどれも使用しなくても、弱い暗号スイートやその他の基本を削除することでサーバーを保護することについてのちょっとしたヒントもあります。 https://joscor.com/blog/hardening-openssh-server-ubuntu-14-04/