授权密钥文件中的Gitolite用户名

4
我会尽力解释我的情况:
我正在使用gitolite在一台Debian Squeeze服务器上,有3个用户可以访问和使用存储库:
- alex@workbox - alex@homebox - katy@workbox
以上是三个Ubuntu框的相应用户名和主机名(Alex从两个位置工作)。
首先,我添加了alex@workbox到gitolite:
1. Alex使用ssh-keygen生成了他的ssh密钥 2. 我将他的ssh密钥复制为“keydir”文件夹中的alex@workbox.pub 3. 修改了我的本地gitolite-admin克隆库的conf/gitolite.conf文件,以便让alex@workbox对存储库具有RW访问权限:
`repo project1`
`RW+ = alex@workbox` 4. 做了通常的事情: - `git add .` - `git commit -m“Added alex@workbox”` - `git push`
当Alex尝试克隆project1存储库时,会出现一个错误,提示拒绝用户“alex”的访问。因此,我登录服务器并打开/var/lib/gitolite/.ssh/authorized_keys文件。文件的第一部分如下:
command="/usr/share/gitolite/gl-auth-command alex",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa...

所以我手动用alex@workbox替换了alex,保存文件后这次Alex能够克隆存储库并且没有任何问题。
然后我按照上面的步骤添加了Katy,在将其推送到gitolite-admin之后,我再次打开了authorized_keys文件并发现gitolite用user替换了"user@hostname"。
因此,它使用alex代替alex@workbox,对于katy同样如此。
然后我不得不再次手动替换并保存该文件。我发现每次我为gitolite-admin repo执行推送时,gitolite都会在其.ssh/authorized_keys中用"user"替换每个"user@hostname",这就使得用户无法访问存储库。
我该怎么做才能让gitolite保留"user@hostname"呢?
是否需要在服务器上进行配置或在我本地克隆的gitolite-admin repo上进行配置更改?
2个回答

2

你真的不应该直接修改 authorized_keys 文件中的 Gitolite 部分。

@suffix 添加到keyfile路径名的想法是允许管理员为单个Gitolite用户轻松添加多个密钥。在您的情况下,keydir/alex@workbox.pubkeydir/alex@homebox.pub 都映射到一个名为 alex 的Gitolite用户。如果这些密钥都是同一个人“拥有”的,那么这通常是您想要的;这让您可以只在配置文件中使用 alex 而不必提及两个密钥文件名。如果这些密钥由不同的人拥有(或者您想要强制实施不同的访问限制),那么您需要稍微命名它们不同(使用其他分隔符,或在 @.pub 之间包含至少一个句点)。

每个用户多个密钥

Gitolite文档部分中名为“multiple keys per user”的章节描述了您可以为单个Gitolite用户配置多个密钥的方法。主要有两种方法:

  • 将名为username.pub的文件放置在keydir的不同子目录中(较新的方法),
  • 在用户名后加上@后缀(较旧的方法,有时对Gitolite管理员难以理解)。

使用子目录方法,您将使用如下路径名:

keydir/workbox/alex.pub
keydir/homebox/alex.pub

使用后缀方法,您将使用以下路径名:

例如:

keydir/alex@workbox.pub
keydir/alex@homebox.pub

所有上述路径名都提供了可以作为Gitolite用户验证的密钥,该用户命名为alex(用户名中没有@);您可以在配置文件中使用(例如)RW+ = alex。这些方法(仅使用密钥路径名的一部分来形成Gitolite用户名)使管理员可以添加(和删除)Gitolite用户的密钥,而无需每次有人想要使用新密钥(或失去对旧密钥的访问或控制)时编辑配置文件。
例如,如果alex获得了一个新的移动设备,您可以添加keydir/mobile/alex.pubkeydir/alex@mobile.pub,以使该密钥能够访问alex已经能够访问的所有内容。

电子邮件风格的用户名

后缀方法存在一个限制:后缀不能包含句点。这个限制存在是为了您可以使用电子邮件地址作为用户名;您仍然可以在此类用户名中使用后缀(或子目录)。以下密钥路径名可用于为用户名jane@gmail.com提供密钥(@gmail.com是用户名的一部分):
keydir/external/jane@gmail.com.pub
keydir/jane@gmail.com@remotebox.pub

这个用户jane@gmail.com与普通的jane用户不同。

注意:通过手动向authorized_keys条目添加@workbox后缀,您有效地强制Gitolite使用不包含句点的电子邮件类型用户名(根据如何将keydir路径名解析为用户名,这通常是不可能的)。

使用哪个?

如果你希望能够将用户的密钥分成有限数量的类别(家庭、工作、移动等),那么子目录似乎是最合适的选择。如果您有一些无法归类的密钥,则@后缀似乎很有用。

与子目录/后缀无关,电子邮件样式的用户名对于组织内没有规范用户名的任何人都可能有用(例如,临时外部承包商)。

总结

Gitolite用户名来源于keydir下的路径名,但它们与那里使用的文件名并不相同。具体来说,keydir路径名通过去除任何子目录和删除.pub扩展名以及任何@后缀来映射到用户名(只要在@之后没有句点,否则@将被视为电子邮件样式的用户名的一部分)。

如果您有一个人想要使用多个密钥的情况,则应该使用上述方法之一(子目录或无句点的@后缀),以便让您将多个密钥映射到单个Gitolite用户名。

例如:安装keydir/workbox/alex.pubkeydir/homebox/alex.pub,然后在配置文件中使用alex(给予两个密钥相同的访问权限)。

如果您有不同人的密钥需要给出类似的名称,或者您想要授权单个人的各种密钥的不同访问权限(家庭访问只读?),那么您应该在用户名的区分部分之间使用分隔符(而不是@),或者确保在@之后有一个句点,这样它就被视为电子邮件样式的用户名。

例如:安装keydir/workbox/alex.pubkeydir/homebox/alex-ro.pubmobile/alex-ro.pub,然后在配置文件中使用alexalex-ro(以某种方式赋予alex-ro只读访问权限,而alex获得读写访问权限)。


很好的补充。+1 - VonC

2

配置语法”中提到:

用户名和仓库名应该尽可能简单;必须以字母或数字开头,但在此之后,它们也可以包含 ., _-

用户名可选地可以跟随一个至少包含一个 .domainname@(这使你可以使用电子邮件地址作为某人的用户名)。

你的命名规范不遵循正确的带有 “@” 的语法。

你可以在 src/triggers/post-compile/ssh-authkeys 中看到此规则的应用。

sub optionise {
    my $f = shift;

    my $user = $f;
    $user =~ s(.*/)(); # foo/bar/baz.pub -> baz.pub
    $user =~ s/(\@[^.]+)?\.pub$//; # baz.pub, baz@home.pub -> baz

    my @line = slurp($f);
    if ( @line != 1 ) {
        _warn "$f does not contain exactly 1 line; ignoring";
        return '';
    }
    chomp(@line);
    return "command=\"$glshell $user" . ( $kfn ? " $f" : "" ) . "\",$auth_options $line[0]";
}

感谢VonC的回答,非常感激。所以我将尝试使用像alex@workbox.local这样的用户名。我将在相关的框、ssh密钥和gitolite-admin上进行相应的更改,看看效果如何。 - Roland Pish
工作得很好。编辑了gitolite-admin/conf/gitolite.conf文件,将alex@workbox替换为alex.workbox。然后将gitolite-admin/keydir/alex@workbox.pub重命名为alex.workbox.pub,并在服务器的/var/lib/gitolite/.ssh/authorized_keys中更新了正确的条目。Alex现在可以无问题地工作了。再次感谢。 - Roland Pish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接