web-dev-qa-db-ja.com

Docker用のSSHユーザーのリダイレクト:GitlabおよびDocker:Bitbucket

すでにタイトルを読んでいるように、私は現在gitサーバーとして使用される複数のDockerコンテナーを実行しており、通常はポート22で実行する必要があります。これは明らかに機能していませんが、私の要求は次のようになります。

ポート22で次のものを利用できるようにします。

  • git @ Host-gitlabdockerコンテナにリダイレクトされます
  • bitbucket @ Host-bitbucketコンテナにリダイレクトされます
  • root @ Host私はrootとしてはまったく機能していませんが、理由を理解するために)Dockerメインホストへの通常のSSHアクセス。

コンテナとアカウント間でsshキーを同期する必要があることはわかっていますが、これは大きな問題ではありませんが、リダイレクトシステムを構築できるかどうかはわかりません。

私のアプローチの1つは、---(ForceCommandを使用することですが、使用したSSHキーをリダイレクトすることはできません...

別のアイデアは、すべてのSSHデーモン間で完全な要求をルーティングするだけの小さなツールをポート22で実行することですが、そのようなツールは(まだ?)見つかりませんでした。そのようなツールを構築できるかどうかわかりません。セキュリティ上の理由から。

5

「使用されている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

このようなもの...

1
Jiri B