Как работают такие программы, как gitolite?

Мне любопытно, как работают такие программы, как gitolite, в частности, как они взаимодействуют с протоколом SSH, чтобы обеспечить индивидуальный подход. Может ли кто-нибудь привести пример того, как я могу выполнить что-то вроде следующего и где я могу узнать больше об этой теме?

→ ssh [email protected]
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?


person user1813844    schedule 10.11.2012    source источник
comment
gitolite имеет открытый исходный код, вы можете узнать, как он работает, прочитав код/документацию.   -  person tpg2114    schedule 10.11.2012
comment
Я прочитал код и из того, что я могу понять, это Perl-скрипт. Я не знаю perl, поэтому я надеялся, что кто-нибудь может предоставить мне быстрый пример для создания того, что у меня есть выше.   -  person user1813844    schedule 10.11.2012
comment
stackoverflow.com/questions/5180981/ssh-client-for -узел-js   -  person Peter Oram    schedule 10.11.2012


Ответы (3)


gitolite сам по себе представляет собой уровень авторизации, которому не нужен ssh.< br> Ему нужно только знать, кто его вызывает, чтобы разрешить или запретить этому человеку выполнять команды git.

SSH используется для аутентификации (но вы также можете использовать Http Apache для аутентификации, например)

Способ вызова gitolite с помощью ssh объясняется в разделе "Gitolite и ssh" и использует механизм ssh принудительная команда:

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

~/.ssh/authorized_keys (на сервере gitolite 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.
Итак, первое, что нужно отметить, это то, что такие пользователи не получают «доступа к оболочке», и это хорошо!

(принудительная команда = нет сеанса интерактивной оболочки: будет предоставлена ​​только ограниченная оболочка, выполняющая только один скрипт, всегда один и тот же)

Однако перед запуском команды sshd устанавливает переменную среды с именем SSH_ORIGINAL_COMMAND, которая содержит фактическую команду git, отправленную вашей рабочей станцией.
Это команда, которая была бы запущена, если бы у вас не было части command= в авторизованных ключах. файл.

Когда gitolite-shell получает управление, он смотрит на первый аргумент ("sitaram", "usertwo" и т. д.), чтобы определить, кто вы. Затем он просматривает переменную SSH_ORIGINAL_COMMAND, чтобы узнать, к какому репозиторию вы хотите получить доступ, и читаете вы или пишете.

Теперь, когда у него есть запрошенный пользователь, репозиторий и доступ (чтение/запись), gitolite просматривает свой файл конфигурации и либо разрешает, либо отклоняет запрос.

Тот факт, что authorized_keys вызывает perl-скрипт (gitolite-shell) это потому, что Gitolite написан на Perl.
Он вполне может вызвать программу на javascript.


Если вы используете ssh на GitHub без какой-либо команды, вы получите приветственное сообщение, подобное вашему упоминанию в вопросе.
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

документация Gitolite конца 2013 года теперь включает в себя эту диаграмму, которая обобщает все части:

ssh и Gitolite

person VonC    schedule 10.11.2012
comment
Итак, просто из любопытства, как такой сайт, как GitHub, может использовать эти методы? Кажется нецелесообразным поддерживать файл authorized_keys для пользователя git, содержащий все открытые ключи, а также обрабатывать изменения в этом файле (удаление ключей и прочее)? - person user1813844; 12.11.2012
comment
@ user1813844 Гитхаб? Но GitHub наверняка не использует gitolite. у него есть собственное управление ключами ssh. Я полагаю, что это не более и не менее практично, чем управление ключами ssh, используемое Gitolite. - person VonC; 12.11.2012
comment
Так у них есть своя версия SSHD? Я пытаюсь понять, как они могли построить свою систему, используя стандартные существующие технологии. - person user1813844; 13.11.2012
comment
@ user1813844 стандартный? не уверен, что их механизм авторизации является стандартным. Они просто построили то, что им было нужно. В последнее время часть аутентификации основана на OAuth (developer.github.com/v3/oauth), но для авторизации... это может быть любая внутренняя разработка, которую они захотят. - person VonC; 13.11.2012
comment
@user1813844 user1813844 GitLab, с другой стороны, (бесплатный аналог GitHub) использует gitolite для авторизации. gitlabhq.com. Они более поздние, и гитолит был более зрелым во время их разработки. - person VonC; 13.11.2012
comment
разрешены только такие команды, как git-upload-pack и git-receive-pack, другие команды unix, такие как ls, rm, заблокированы. - person linquize; 30.01.2013
comment
@linquize правильно, я упомянул об этом в stackoverflow.com/a/11646767/6309. С V3 у вас также есть небольшой список команд gitolite, которые можно запустить: sitaramc.github .com/gitolite/cust.html#commands - person VonC; 30.01.2013
comment
Примечание: github, как и bitbucket, скорее всего, использует слегка модифицированную версию sshd, которая позволяет выполнять поиск в большой базе данных. о чем они говорят здесь: blog.bitbucket.org /2014/08/11/the-inner-guts-of-bitbucket ; точно так же, как bitbucket, github, скорее всего, использует haproxy для балансировки нагрузки ssh. - person gabeio; 01.12.2014
comment
@gabeio Я согласен, но GitHub или BitBucket вообще не используют gitolite, не так ли? - person VonC; 01.12.2014
comment
github использует пользовательскую сборку ruby ​​gem - это то, что я получил, прочитав блог создателя, а bitbucket построен на java, поэтому у них, скорее всего, есть собственное приложение, и я сомневаюсь, что кто-либо из них использует gitolite, но я не работаю ни в одной компании, поэтому Я просто предполагаю. - person gabeio; 01.12.2014

Обратите внимание, что sshd выполняет линейное сканирование файла ~/.ssh/authorized_keys. Как только вы получаете около 3000 ключей, люди, чьи ключи появляются позже в файле, начинают замечать отставание — оно начинает превышать сетевое отставание :-)

Это одна из причин, по которой на github есть собственная исправленная версия sshd. У них слишком много пользователей, чтобы можно было управлять с помощью обычного sshd!

person Sitaram    schedule 23.12.2012

Основные шаги:

  1. Проверьте открытый ключ человека, пытающегося войти в систему
  2. Сопоставьте открытый ключ со списком контроля доступа

Другими словами, чтобы эти вещи работали, вы должны получить открытые ключи от пользователей, а затем сгенерировать список (файл, базу данных, что угодно), который связывает ключ с пользователем и разрешениями.

person tpg2114    schedule 10.11.2012
comment
Меня больше интересует механика использования протокола SSH. - person user1813844; 10.11.2012
comment
stackoverflow.com/questions/402615/ Затем сделайте свои вопросы более ясными. Я посмотрел комментарий в верхней части исходного кода gitolite, и в нем говорилось, что скрипт вызывается из ~/.ssh/authorized_keys, поэтому я искал, как вызвать скрипт из файла author_keys, и нашел этот вопрос. - person tpg2114; 10.11.2012
comment
Я не пытаюсь здесь троллить. Но я не склонен вдаваться в массу подробностей, чтобы ответить на вопрос, когда не похоже, что на его самостоятельное решение ушло много усилий. - person tpg2114; 10.11.2012