公開鍵認証を許可しながら、24時間ごとにユーザーパスワードを入力するように要求するにはどうすればよいですか?デフォルトのホストオペレーティングシステムはDebianです。
答え1
マニュアルページを見るsshd_config(5)
何らかの方法でこれを達成するために使用できるいくつかの構成キーワードが見つかりました。
- 修正されたものを使用してください
AuthenticationMethods
とMatch
詰まった - 使用
AuthorizedKeysCommand
ログインするたびにスクリプトを呼び出して、パスワードが必要かどうかを判断します。 - 使用
ForceCommand
ログインが成功したら、カスタムコマンドを実行して必要なパスワードを確認してください。
詳細:
- 修正されたものを使用してください
AuthenticationMethods
とMatch
ブロック:これにより公開鍵認証を無効にするか、また特定のユーザーにはパスワードの確認が必要です。
Match User john
AuthenticationMethods publickey,password publickey,keyboard-interactive
これにより、ユーザーはjohn
公開鍵認証に成功した後にパスワードを入力する必要があります。しかし、定期的に変わります。どのユーザーは少しトリッキーなパスワードを入力する必要があります。 1つの方法は、カスタムスクリプトを変更してsshd_config
ユーザーを追加/削除し、設定を再ロードするためのシグナルをエクスポートすることですsshd
。これは非常に不快なハッキングです。
私が動的に見る唯一の方法は次Match
のとおりですGroup
。
Match Group need-passwd
AuthenticationMethods publickey,password publickey,keyboard-interactive
これにより、変更を加えずにsshd_config
システムグループにユーザーを個別に追加/削除することができますneed-passwd
。sshd
その後、ユーザーがグループにいることを確認し、その場合はパスワードも必要です。
- 使用
AuthorizedKeysCommand
ログインするたびにスクリプトを呼び出して、パスワードが必要かどうかを判断します。
# ignore existing authorized_keys files by default
AuthorizedKeysFile /dev/null
# instead load allowed authorized_keys using external command
AuthorizedKeysCommand /path/to/external_script.sh
# root is required to be able to read users ~/.ssh/authorized_keys files
AuthorizedKeysCommandUser root
sshd
これを直接確認せずにカスタム~/.ssh/authorized_keys
ロジックを実装できる場所に提供されているキーを使用してくださいexternal_script.sh
。例: * ユーザーの最後の成功したリモートログインの検索 * 24 時間以上前の場合、認証キーを返さないため、公開の無効化が機能します。キー認証*過去24時間以内であれば、以下を返します。~/.ssh/authorized_keys
後者は、ユーザーのホームフォルダにあるファイルを読み取るためにアクセスがexternal_script.sh
必要な理由です。root
1.と3.と比較して、このアプローチの欠点は、パスワードのみをログインできるようにするため、実際にセキュリティを低下させる必要があることです。
- 使用
ForceCommand
ログインが成功したら、カスタムコマンドを実行して必要なパスワードを確認してください。
ssh
ユーザーがクライアントに提供したコマンドを実行するのではなく、公開鍵を使用してログインに成功した後に実行されます。ForceCommand
このコマンドでカスタムロジック(上記を参照)を実装し、必要に応じて最初にログインパスワードを要求できます。それ以外の場合は、提供されたコマンドラインを実行してください。
ここでの欠点は、正しく理解するのが難しいことです。 *コマンドが実行されるだけです。後ろにログインに成功すると、ユーザーはすでにシステムにログインしています。これは、パスワードを入力する前に、要求されたポート/ X11 / sshプロキシ転送がすでに有効になっている可能性があることを意味します。*提供されたコマンドライン(存在する場合)を正しく処理する必要があるかもしれません。すべての文字列を慎重にエスケープします。
また、パスワード/ログインはカスタムスクリプトによって照会されるため、クライアントはサポート/処理されませんが、ssh
有効なパスワードが必要ですtty
。
認証キーを返す代わりに、方法2と3を組み合わせて行の前にすべてのアクセスオプションを追加し、restrict
強制カスタマイズのみを実行できますcommand
。AUTHORIZED_KEYS_FILE_FORMAT。
答え2
これは難しい質問です。このアイデアを思い出す前に、2つの異なるアイデアがありました。
私のアプローチは午前3時にルートクローンジョブを実行し、authorized_keys
ユーザーファイル名をauthorized_keys.disabled
。その後、ユーザー内で.bashrc
行の名前をauthorized_keys.disabled
変更して、1authorized_keys
日のログインで SSH キーを使用できるようにします。
cronエントリは次のとおりです。
00 03 * * * mv --force /home/jennifer/.ssh/authorized_keys /home/jennifer/.ssh/authorized_keys.disabled
項目.bashrc
は次のとおりです。
mv --force ~/.ssh/authorized_keys.disabled ~/.ssh/authorized_keys
私の計画に穴があるかもしれません。まだテストしていません。