すでにタイトルを読んでいるように、私は現在gitサーバーとして使用される複数のDockerコンテナーを実行しており、通常はポート22で実行する必要があります。これは明らかに機能していませんが、私の要求は次のようになります。
ポート22で次のものを利用できるようにします。
コンテナとアカウント間でsshキーを同期する必要があることはわかっていますが、これは大きな問題ではありませんが、リダイレクトシステムを構築できるかどうかはわかりません。
私のアプローチの1つは、---(ForceCommandを使用することですが、使用したSSHキーをリダイレクトすることはできません...
別のアイデアは、すべてのSSHデーモン間で完全な要求をルーティングするだけの小さなツールをポート22で実行することですが、そのようなツールは(まだ?)見つかりませんでした。そのようなツールを構築できるかどうかわかりません。セキュリティ上の理由から。
「使用されているsshキーをリダイレクトする」必要はないと思います。authorized_keysとしてキーを持つユーザーごとにキー/証明書を作成し、ForceCommandを介してssh -i $key $final_destination
を使用できます。
AuthorizedKeysCommand
を使用する場合、公開鍵の中央リポジトリにクエリを実行できます。これにより、2行が返される可能性があります。1つは実際のユーザーの公開sshキー用で、もう1つは「内部公開sshキー」用です。これら2つを区別できます。コメント付きの行を作成し、クエリを実行するホストの情報に基づいて、このリポジトリにキーをクエリします。例えば。ジャンプホストでは、たとえばこのコメント「foouser @」を持つ公開鍵をフィルタリングできます。最終的な宛先では、逆にコメント「@internal」でfoouserの公開鍵を照会できます。最近のOpenSSHでは、ジャンプホストでExposeAuthInfo
sshdオプションを使用して、ジャンプホストへのログインに使用されたパブリックsshキーを確認し、中央リポジトリでキーを再クエリして、 $ SSH_USER_AUTH。この方法では、公開sshキーを含む返された行に基づいて、最終的な宛先にsshを実行するために使用する秘密キーをコメントします。
ユーザーは、特にインタラクティブシェルでない場合、最終的なホストにどのようにログインしたかを気にしません。
ジャンプホストと最終宛先のAuthorizedKeysCommand:
#!/bin/sh
user=$1 # git !
filter=$2 # @$
cat /home/git/.ssh/authorized_keys 2>/dev/null | grep "${filter:-@$}"
exit 0
ジャンプホストのsshd_config:
ExposeAuthInfo yes
Match User git
AuthorizedKeysCommand /path/to/authorizedkeyscommand git # @$ as default
ForceCommand /path/to/forcecommand git
AuthorizedKeysCommandは以下を返すことができます:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILleQxrxxxxxxxxxxxxxxxxxxx foouser@
ジャンプホストのForceCommand:
#!/bin/ksh
set -x
user=$1 # git
if [[ -r ${SSH_USER_AUTH} ]]; then
pubkey="$(cat ${SSH_USER_AUTH} | cut -d' ' -f2-)"
realuser=$(/path/to/authorizedkeyscommand git | grep "${pubkey}" | sed 's/^.* \([^@]*\)@$/\1/' )
[[ -n ${realuser} ]] && exec ssh -i $HOME/${realuser}_key <final_destination> "${SSH_ORIGINAL_COMMAND:-}"
else
exit 1
fi
このようなもの...