12

gitolite などのプログラムがどのように機能するのか、特に、それらが SSH プロトコルとどのように相互作用してカスタマイズされたエクスペリエンスを提供するのかについて興味があります。次のようなことを達成する方法と、このトピックについてどこで学ぶことができるかの例を誰かが提供できますか?

→ ssh git@github.com
PTY allocation request failed on channel 0
Hi <username>! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.

補足質問: 私の主要言語は JavaScript です。NodeJSで私が望むことを達成することは可能ですか?

4

3 に答える 3

28

gitolite 自体は、ssh を必要としない認証レイヤーです。
がそれを呼び出しているかを 知る必要があるだけで、その人が git コマンドを実行することを承認するかどうかを判断できます。

SSH は認証に使用されます (ただし、たとえば、HTTP Apache を認証に使用することもできます)。

gitolite が ssh によって呼び出される方法は、「Gitolite と ssh」で説明されており、ssh メカニズムの強制コマンドを使用します。

http://oreilly.com/catalog/sshtdg/chapter/ssh_0802.gif

( ~/.ssh/authorized_keysgitolite ssh サーバー上) は次のようになります。

command="[path]/gitolite-shell sitaram",[more options] ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA18S2t...
command="[path]/gitolite-shell usertwo",[more options] ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEArXtCT...

まず、このファイル内のどの公開鍵が着信ログインと一致するかを調べます。一致が見つかると、その行に指定されたコマンドが実行されます。たとえば、ログインすると実行されます[path]/gitolite-shell sitaram
したがって、最初に注意すべきことは、そのようなユーザーは「シェル アクセス」を取得しないということです。これは良いことです。

(強制コマンド = 対話型シェル セッションなし:制限付きシェルのみを提供し、常に同じスクリプトを 1 つだけ実行します)

ただし、コマンドを実行する前に、ワークステーションが送信した実際のコマンドを含むsshdという環境変数を設定します。これは、許可された鍵ファイルに その部分がなかった場合に実行されるコマンドです。SSH_ORIGINAL_COMMANDgit
command=

制御を取得するgitolite-shellと、最初の引数 (" sitaram"、" usertwo" など) を調べて、ユーザーが誰であるかを判断します。次に、SSH_ORIGINAL_COMMAND変数を調べて、アクセスするリポジトリと、読み取りまたは書き込みのどちらを行っているかを調べます。

ユーザー、リポジトリ、およびアクセスが要求された (読み取り/書き込み)ため、 gitoliteはその構成ファイルを調べて、要求を許可または拒否します。

authorized_keysが perl スクリプトを呼び出す ( ) のgitolite-shellは、Gitolite が perl で記述されているためです。
JavaScriptプログラムを呼び出すことができます。


コマンドを使用せずに GitHub で ssh を使用すると、質問で言及したような挨拶メッセージが表示されます。コマンド scriptの関数で
説明されているように、Gitolite は同様のメッセージを表示します。print_version()info

sub print_version {
    chomp( my $hn = `hostname -s 2>/dev/null || hostname` );
    my $gv = substr( `git --version`, 12 );
    $ENV{GL_USER} or _die "GL_USER not set";
    print "hello $ENV{GL_USER}, this is " . ($ENV{USER} || "httpd") . "\@$hn running gitolite3 " . version() . " on git $gv\n";
}

メッセージは次のようになります。

hello admin, this is git@server running gitolite3 v3.0-12-ge0ed141 on git 1.7.3.4

2013年後半の Gitolite のドキュメントには、すべての要素をまとめた図が含まれています。

ssh と Gitolite

于 2012-11-10T07:41:51.307 に答える
5

sshd は ~/.ssh/authorized_keys ファイルの線形スキャンを行うことに注意してください。そこに約 3000 個のキーを取得すると、ファイルの後半にキーが表示される人々は遅延に気付き始めます-それはネットワーク遅延以上のものになり始めます:-)

これが、github が独自のパッチを適用したバージョンの sshd を持っている理由の 1 つです。通常の sshd で管理するにはユーザーが多すぎます。

于 2012-12-23T14:56:53.290 に答える
0

基本的な手順は次のとおりです。

  1. ログインしようとしている人の公開鍵を確認する
  2. 公開鍵をアクセス制御リストにマップする

つまり、これらを機能させるには、ユーザーから公開キーを取得し、キーとユーザーおよびアクセス許可をペアにするリスト (ファイル、データベースなど) を生成する必要があります。

于 2012-11-10T02:58:23.800 に答える