web-dev-qa-db-ja.com

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

認証に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? エラーメッセージ。

38
Matt Connolly

次は私のために働きます。

~/.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パラメータを調整する必要があることに注意してください。

31
Neil Mayhew

追加のスクリプトを使用せずに、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...
33
sophana

Grawity の解は、行を置き換えることで簡単に変更できます

        exec $SSH_ORIGINAL_COMMAND

ラインで

        git-Shell -c "$SSH_ORIGINAL_COMMAND"

引用は上記で報告された問題を処理し、execをgit-Shellで置き換えることはもう少し安全なようです。

5
dschwen

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
4
user1686

完全を期すため、そして元の質問では同じアカウントがgit以外のものに使用可能である必要があると指定されていなかったため、明白な答えは、使用するように設計されたgit-Shellを使用することです:ログインとして設定そのsshユーザーのシェル(つまり、/etc/passwdusermodを使用)。

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

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

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

2
Felix

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! :-)

1
pvandenberk