Как работают такие программы, как Gitolite?
Мне любопытно, как работают такие программы, как 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?
3 ответа
Гитолит сам по себе является авторизационным слоем, который не нуждается в SSH.
Нужно только знать, кто его вызывает, для того, чтобы разрешить или нет этому человеку выполнять команды git.
SSH используется для аутентификации (но вы также можете использовать Http Apache для аутентификации)
Способ, которым ssh вызывает gitolite, объясняется в " Gitolite and ssh " и использует принудительную команду механизма ssh:
~/.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 года, теперь включает диаграмму, которая обобщает все фрагменты:
Обратите внимание, что sshd выполняет линейное сканирование файла ~/.ssh/authorized_keys. Как только вы получите около 3000 ключей, люди, чьи ключи появятся позже в файле, начнут замечать задержку - она станет больше, чем сетевая задержка:-)
Это одна из причин, по которой у github есть собственная исправленная версия sshd. У них слишком много пользователей, чтобы можно было управлять с помощью обычного sshd!
Основные шаги:
- Проверьте открытый ключ лица, пытающегося войти
- Сопоставить открытый ключ со списком контроля доступа
Другими словами, чтобы все это работало, вы должны получить открытые ключи от пользователей, а затем сгенерировать список (файл, базу данных и т. Д.), Который связывает ключ с пользователем и разрешениями.