像 gitolite 这样的程序是如何工作的?

问题描述 投票:0回答:3

我很好奇 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 可以实现我想要的吗?

ssh gitolite
3个回答
28
投票

gitolite 本身是一个授权层,不需要 ssh。
它只需要知道正在调用它,以便授权或不授权该人执行 git 命令。

SSH 用于身份验证(但例如,您也可以使用 Http Apache 进行身份验证)

ssh调用gitolite的方式在《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

所以首先要注意的是,此类用户无法获得“shell 访问权限”,这很好!

强制命令 = 无交互式 shell 会话:它只会提供一个受限 shell,仅执行一个脚本,始终相同)

但是,在运行命令之前,

sshd
设置一个名为
SSH_ORIGINAL_COMMAND
的环境变量,其中包含工作站发出的实际
git
命令。
如果授权密钥文件中没有
command=
部分,则会运行此命令。

gitolite-shell
获得控制权时,它会查看第一个参数(“
sitaram
”、“
usertwo
”等)来确定您是谁。然后它会查看
SSH_ORIGINAL_COMMAND
变量以找出您要访问哪个存储库,以及您是在读取还是在写入。

现在它有了 用户、存储库和请求的访问权限(读/写),gitolite 会查看其配置文件,并允许或拒绝该请求。

authorized_keys
调用perl脚本(
gitolite-shell
)的事实是因为Gitolite是用perl编写的。
它很可能调用 JavaScript 程序。


如果您在 GitHub 上进行 ssh 时没有任何命令,您会收到一条问候消息,就像您在问题中提到的那样。
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 and Gitolite


5
投票
请注意,sshd 对 ~/.ssh/authorized_keys 文件进行线性扫描。一旦你在那里得到大约 3000 个密钥,密钥出现在文件后面的人就会开始注意到延迟——它开始不仅仅是网络延迟:-)

这就是 github 有自己的 sshd 补丁版本的原因之一。他们有太多的用户,无法使用普通的 sshd 进行管理!


0
投票
基本步骤是:

    检查尝试登录者的公钥
  1. 将公钥映射到访问控制列表
换句话说,为了让这些事情发挥作用,您必须从用户那里获取公钥,然后生成一个将密钥与用户和权限配对的列表(文件、数据库等)。

© www.soinside.com 2019 - 2024. All rights reserved.