公開鍵(RSA)認証が構成されていて、クライアントが有効な鍵を提示している場合、OpenSSHはPAMをまったく呼び出しません。したがって、キーベースの認証を使用する場合、2FAを簡単に適用することはできません。
この制限の1つの回避策は、Yubikey OTPを要求するヘルパープログラムを作成することです。このヘルパープログラムは、ユーザーがForceCommandディレクティブを使用して認証に成功した後にsshdによって実行されるようになっています。例: https://www.berrange.com/posts/2011/12/18/multi-factor-ssh-authentication-using-yubikey-and-ssh-public-keys-together/
私はシェルプログラミング(シグナルの処理、tty割り当てなど)の知識を信頼してヘルパープログラムをレビューすることを信頼していないため、別の何かを探し続けました。
次の代替アプローチの穴は何ですか?
SSHベースの認証に2FAを実行するようにyubikeyを設定します。
すべてのログイン「X」には、「pre-X」と呼ばれる「要塞」ログインがあります。
両方のログインが同じマシンに存在します
1つのsshdインスタンス
Match sshd構成ディレクティブを使用して、パターン「pre- *」に一致するすべてのログインに対して公開鍵認証を許可しないようにsshサーバーを構成します。
「要塞」ログインは、ホームディレクトリなしで作成され、ログインシェルは/ bin/falseに設定され、gidは「nogroup」に設定されます。それ以外のことを行うと、できる限り弱くすることができます。適切な対策として、これらのログインにForceCommand sshディレクティブを使用して常に/ bin/falseを実行し、ChrootDirectoryを使用してサンドボックス化します。
要塞以外のログインがlocalhost以外のIPからログインすることを禁止するには、AllowUsersディレクティブを使用します。
Sshクライアント側でProxyCommandを使用して、踏み台ログインを介してトンネリングをスクリプト化します。
私はこれを実行しましたが、うまくいきますが、何かを逃したのではないでしょうか。
要塞ユーザーは次のように作成されます。
# password will never be typed in, so need to record it
Sudo useradd -M -N -g nogroup -s /bin/false pre-user001 -p $(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64 -w0)
sshd_configは次のようになります。
# Nobody can login from anywhere except localhost
AllowUsers *@localhost
# ... except for logins starting with 0
AllowUsers pre-*@*
# force password auth for bastion logins
Match User pre-*
PasswordAuthentication yes
RSAAuthentication no
PubkeyAuthentication no
ForceCommand /bin/false
2015(OpenSSH> = 6.2)の時点で、sshdが公開鍵認証と組み合わせてPAMを呼び出さないという仮定はもはや成り立ちません。
OpenSSH 6.2では、公開鍵認証に加えて、2番目の要素または 認証の複数の要素 を強制することもできます。
AuthenticationMethods
ディレクティブを使用して、sshd_config
でグローバルレベルまたはユーザー固有のレベルの複数の要素を指定できます 例 :
AuthenticationMethods publickey、keyboard-interactive
keyboard-interactive
は、PAMチェーンをトリガーします。 a [〜#〜] otp [〜#〜] sshd用にpamモジュールを構成できます。
私は過去に DuoSecurity を使用して大きな成功を収めましたが、Yubikeyと同様の方法に従いますが、複数の認証方法。
最小限のユーザー学習曲線で非常に簡単にセットアップできます。