認証に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?
エラーメッセージ。
次は私のために働きます。
~/.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
パラメータを調整する必要があることに注意してください。
追加のスクリプトを使用せずに、authorizedKeysファイルで直接git-Shellを正常に使用できました。
重要なのは、環境変数の周りに\"
を追加することです。
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...
Grawity の解は、行を置き換えることで簡単に変更できます
exec $SSH_ORIGINAL_COMMAND
ラインで
git-Shell -c "$SSH_ORIGINAL_COMMAND"
引用は上記で報告された問題を処理し、execをgit-Shellで置き換えることはもう少し安全なようです。
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
完全を期すため、そして元の質問では同じアカウントがgit以外のものに使用可能である必要があると指定されていなかったため、明白な答えは、使用するように設計されたgit-Shell
を使用することです:ログインとして設定そのsshユーザーのシェル(つまり、/etc/passwd
のusermod
を使用)。
2つの方法を使用する単一のユーザーアカウントがある場合:
...その後、このスレッドの他の回答が適用されます。ただし、別のユーザーをgitに割り当てることができる場合は、そのシェルをgit-Shell
に設定するのが最も簡単な方法であり、追加のシェルスクリプトを必要としないため、少し安全です。
Neil Mayhew によって報告されたのと同じ理由で grawity の解決策が機能しませんでした(つまり、gitクライアントによって送信された単一引用符が無効な$SSH_ORIGINAL_COMMAND
を引き起こしています-私はgit v1.7.x
を使用しています)
ただし、 @ moocode によって実装された次のソリューションは機能します。
https://moocode.com/posts/6-code-your-own-multi-user-private-git-server-in-5-minutes
Ruby FTW! :-)