.ssh / authorized_keysでgit-shellを指定して、ssh経由でgitコマンドのみへのアクセスを制限できますか?


37

認証にsshキーを使用できるようにしたいのですが、sshトンネルを介して実行できるコマンドを制限します。

Subversionでは、次のような.ssh / authorized_keysファイルを使用してこれを実現しました。

command="/usr/local/bin/svnserve -t --tunnel-user matt -r /path/to/repository",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAABIetc...

コマンドで「/ usr / bin / git-shell」を使用してこれを試しましたが、ファンキーで古いfatal: What do you think I am? A shell?エラーメッセージが表示されます。

回答:


30

次は私のために働く。

~/.ssh/authorized_keys

command="./gitserve",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-dss AAAAB…

では~/gitserveスクリプト:

#!/bin/sh
exec git-shell -c "$SSH_ORIGINAL_COMMAND"

gitserveホームディレクトリ以外の場所に配置する場合は、のcommand="./gitserve"パラメータを調整する必要があることに注意してくださいauthorized_keys


ビンゴ!これは私が達成したいと思っていたことと同じように機能します!ありがとう。
マットコノリー

SO上でこの関連の記事でstackoverflow.com/questions/5871652/...彼らはここで別の解決策を指す:joey.kitenet.net/blog/entry/locking_down_ssh_authorized_keys
ティム・

1
@Timこれは基本的に同じソリューションですが、perlを使用して〜/ gitserveスクリプトのコンテンツを承認済みのキーに絞り込みます。個人的には、別のスクリプトに保存することを好みます。
ニールメイヒュー

1
わかりました。単に参考として追加しただけです。
ティム

この構成でユーザーに設定するシェルは何ですか?/bin/bash
M-ピクセル

33

追加のスクリプトを使用せずに、authorizedKeysファイルでgit-shellを直接正常に使用できました。

重要なのは\"、env変数を追加することです。

rhel6 openssh-server-5.3p1-70.el6.x86_64でテスト:

no-port-forwarding,no-agent-forwarding,command="git-shell -c \"$SSH_ORIGINAL_COMMAND\"" ssh-dss AAAA...


2
個人的には、に完全なパスを与えますがgit-shell、それは単なる妄想かもしれません。
ウルリッヒ・シュワルツ

誰もがアクセスできるディレクトリを制限する方法を見つけましたか?git-shellを実行する前にディレクトリにcdできることを発見しましたが、git-shellでは「..」と絶対パスを許可しています。
ヨクト

5

Grawityのソリューションは、行を置き換えることで動作するように簡単に変更できます

        exec $SSH_ORIGINAL_COMMAND

線で

        git-shell -c "$SSH_ORIGINAL_COMMAND"

引用符は上記で報告された問題を処理し、execをgit-shellに置き換える方が少し安全だと思われます。


4

git-shell-c "originalcommand"引数として受け取るように、ログインシェルとして使用されるように設計されています。これは、OpenSSHの「強制コマンド」では発生しません。代わりに、強制コマンドが構成済みのシェルに渡されます。

できることは、それをチェック$SSH_ORIGINAL_COMMANDして実行するスクリプトを書くことです。bashの例:

#!/bin/bash

SSH_ORIGINAL_COMMAND=${SSH_ORIGINAL_COMMAND/#git /git-}

case $SSH_ORIGINAL_COMMAND in
    "git-receive-pack"*|"git-upload-pack"*|"git-upload-archive"*)
        eval exec $SSH_ORIGINAL_COMMAND
        ;;
    *)
        echo "Go away." >&2
        exit 1
        ;;
esac

@Matt:git-shell(1)によると、コマンドは?git <cmd>ではなくgit-<cmd>
grawity

うーん...私はそれを実行したときに見たものに応じてその変更を加えました。bashスクリプトとrubyスクリプトの両方を使用して、コマンドとして「git-receive-pack」を見ました。私からの引用man git-shell(git 1.7.3.4):現在、4つのコマンド、git-receive-pack、git-upload-pack、git-upload-archive、単一の必須引数、またはcvsサーバー(gitを呼び出すため)の呼び出しのみが許可されています-cvsserver)。
マットコノリー

コメントでフォーマットが機能しない:(
マットコノリー

1
私のgitクライアント(1.7.5.4)は、シェルによってコマンドライン全体が解釈されると予想されるため、単一引用符でリポジトリ名を送信するため、これは機能しません。次に、exec $ SSH_ORIGINAL_COMMANDは、単一引用符をgit-receive-packなどに渡します。したがって、リポジトリが見つかりません。
ニールメイヒュー

ソリューション、grawityに感謝しますが、Neil Mayhewによって報告されたのと同じ理由で...私の1.7.xバージョンのgitも単一引用符でレポ名を送信し、最終的$SSH_ORIGINAL_COMMANDには無効であり、git-shell
やけど

1

Neil Mayhewによって報告されたのと同じ理由でgrawityのソリューションを動作させることができませんでした(つまり、gitクライアントから送信された単一引用符が無効を引き起こしています-を使用しています)$SSH_ORIGINAL_COMMANDgit v1.7.x

ただし、@ moocodeによって実装される次のソリューションは正常に機能します。

https://moocode.com/posts/6-code-your-own-multi-user-private-git-server-in-5-minutes

ルビーFTW!:-)


1

完全を期すため、および元の質問では同じアカウントをgit以外のアイテムに使用できるgit-shellように指定していなかったため、明白な答えは使用するように設計されたとおりに使用することです:ログインシェルとして設定します(つまりusermod、 in /etc/passwd)そのsshユーザーの場合。

2つの方法を使用する単一のユーザーアカウントがある場合:

  • キー認証で接続する場合は、gitのみに使用します
  • パスワード認証で接続する場合、または別の秘密鍵を使用する場合は、完全なシェルを提供します

...次に、このスレッドの他の回答が適用されます。ただし、別のユーザーをgitに割り当てる余裕がある場合git-shellは、シェルをに設定するのが最も簡単な制限方法であり、追加のシェルスクリプトを必要としないため、若干安全です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.