【问题标题】:How do programs like gitolite work?像 gitolite 这样的程序是如何工作的?
【发布时间】:2012-10-30 09:37:34
【问题描述】:

我很好奇 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 完成我想要的?

【问题讨论】:

  • gitolite 是开源的,您可以通过阅读代码/文档了解它的工作原理。
  • 我已经阅读了代码,据我所知,它是一个 perl 脚本。我不知道 perl,所以我希望有人可以为我提供一个快速示例来生成我上面的内容。

标签: ssh gitolite


【解决方案1】:

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

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

ssh调用gitolite的方式在“Gitolite and ssh”中有说明,使用ssh机制forced command

~/.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() function of the info command script

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

late 2013 Gitolite documentation 现在包含总结所有部分的图表:

【讨论】:

  • 那么出于好奇,像 GitHub 这样的网站如何利用这些技术?为git 用户维护包含每个人的公钥的authorized_keys 文件以及处理对该文件的更改(删除密钥等)似乎不切实际?
  • @user1813844 GitHub?但 GitHub 肯定使用 gitolite。它有自己的 ssh 密钥管理。我想,这与 Gitolite 使用的 ssh 密钥管理差不多。
  • 那么他们有自己的 SSHD 版本吗?我试图弄清楚他们如何使用标准的现有技术构建他们的系统。
  • @user1813844 标准?不确定他们的授权机制是否标准。他们只是建造了他们需要的东西。最近,他们基于 OAuth (developer.github.com/v3/oauth) 的身份验证部分,但对于授权...它可以是他们想要的任何内部开发。
  • @linquize 正确,我在stackoverflow.com/a/11646767/6309 中提到了很多。使用 V3,您还有一小部分可以运行的 gitolite 命令:sitaramc.github.com/gitolite/cust.html#commands
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    基本步骤是:

    1. 检查尝试登录的人的公钥
    2. 将公钥映射到访问控制列表

    换句话说,要使这些事情起作用,您必须从用户那里获取公钥,然后生成一个列表(文件、数据库等),将密钥与用户和权限配对。

    【讨论】:

    • 我对使用 SSH 协议的机制更感兴趣。
    • stackoverflow.com/questions/402615/… 然后让你的问题更清楚。我查看了 gitolite 源代码顶部的评论,上面写着“从 ~/.ssh/authorized_keys 调用的脚本”,所以我搜索了如何从 authorized_keys 文件中调用脚本并找到了这个问题。
    • 我不是想在这里拖钓。但我不倾向于深入细节来回答这个问题,因为独立解决这个问题看起来并不费力。
    猜你喜欢
    • 1970-01-01
    • 2010-12-30
    • 2012-08-27
    • 2013-02-06
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    相关资源
    最近更新 更多