1つを無効にするともう1つが得られるため、相互に排他的であるようです。私のsshサーバーの2要素認証は本当に素晴らしいように聞こえるので、これを達成する方法はありますか?
最近のFedoraおよびRHEL 6リリースでは、RequiredAuthentications2 pubkey,password
は、pubkeyとの両方のパスワード認証を要求します。通常、これは、ユーザーのパスワードではなく、公開鍵と2要素認証トークンを要求するために行われます。
更新:RHEL/CentOS 7、およびOpenSSHの最新バージョンを搭載したすべてのシステムで、以下を使用できます。
AuthenticationMethods "publickey,password" "publickey,keyboard-interactive"
Matchディレクティブを使用してIPを除外する またはユーザーも可能です。
同じサーバー上で公開鍵認証とパスワード認証の両方を持つことができます。公開鍵認証が失敗すると、パスワード認証が行われます。
両方を必要とすることに関しては、それはばかげて非生産的であるように見え、man sshd_config
これを行うオプションはありません。
Ssh秘密鍵には安全なパスフレーズが必要です。そのため、攻撃者があなたの秘密鍵を入手した場合でも、最初にパスフレーズを入手しないと攻撃者は何もできません。彼らがそのパスフレーズを侵害した場合(おそらくキーロガーを使用したり、非常に弱いパスフレーズを強引に強制したりした場合)、記憶されているパスワードを簡単に取得/ブルートフォースすることもできます。
本当に必要な場合は、たとえばForceCommandを使用して何かを設定できます(たとえば、公開鍵認証のみを許可してから、パスワードを要求するシェルにユーザーを誘導します)。これはお勧めしません。
公開を制限したい場合のより良い代替策は、sshポートに到達できるIPを制限するようにファイアウォールを設定することです。ある時点で別のコンピューターからトンネルする必要がある場合、サーバーのどこかで追加のVPNが実行されている可能性があります。 knockd のようなものを使用して、特定のポートノッキングパターンの後にファイアウォールに穴を開けることもできますが、トラフィックを盗聴した誰もがノッキングパターンを再生してポートを開く可能性があることを認識してください。
(クロスポスティング SO回答 最近のソリューションの更新あり)
sshd_config(5)
のマニュアルページを読んだ場合、オプションAuthenticationMethods
があり、アクセスを許可される前に渡す必要があるメソッドのリストを取得します。必要な設定は次のとおりです。
AuthenticationMethods publickey,password
この方法は、最近のopenssh(openssh-6、openssh-7)を使用する現在のすべてのLinuxシステムで機能します。
私が知っている唯一の例外はRHEL 6(openssh-5.3)で、同じ値で別のオプションを設定する必要があります(他の回答で説明)。
RequiredAuthentications2 publickey,password
私はこれをもう少し調べて、次のことを思いつきました。
2要素認証にPAMを使用できますが、そうすることでSSH鍵を使用せず、異なる2要素を使用することになります。
たとえば、2要素認証でgoogleを使用し、pamを使用して認証することができます。
私にとってうまくいった唯一の解決策は、/ etc/ssh/sshd_config(CentOS7でテスト済み)に以下を含めることです:
PubkeyAuthentication yes
AuthenticationMethods publickey password
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes
PermitEmptyPasswords no
ChallengeResponseAuthentication no
UsePAM yes
つまり、PAMを有効にし、publikキーに関連するすべての行を有効にし、最後に、AuthenticationMethodsで両方のメソッドを適切にリストすることを意味します。 Jakujeによって作成 であったにもかかわらず、AuthenticationMethodsの後にpublickeyとpasswordの間にコンマを追加しないでください。