Gitolite一个用户 - 许多键 - 不同的用户名

时间:2011-04-20 16:39:36

标签: git authentication ssh gitolite

我已按照说明建立了gitolite,一切都按计划进行。

我有点不确定用户名部分是如何工作的,浏览文档并没有帮助我 - 也许我错过了一些简单的东西。

如果我有两台客户机,供一个真人使用,但在每台机器上都有用户名,让我们说dave和david。如何组织keydir和任何配置文件中的密钥,以便它们代表同一个用户?我得到后缀的东西,dave @ laptop,dave @ desktop(我认为),而不是如何连接不同的客户端机器用户名,因为它似乎在验证时寻找这个(可能是因为包含user @ host信息的公钥) ?)

如果需要,我可以提供更多细节 - 我只是不想用无关的信息轰炸你们所有人。

非常感谢。

8 个答案:

答案 0 :(得分:51)

根据文档

的当前推荐方式
  

“最简单,最容易理解的是把钥匙放在不同的地方   子目录[在你的/ kedir里面],(alice.pub,home / alice.pub,   laptop / alice.pub等。“

参考:http://gitolite.com/gitolite/gitolite.html#multi-key

旧方式

如果您问如何完成以下任务:

  1. 大卫(家用电脑
  2. David(工作计算机
  3. 大卫(笔记本电脑
  4. 在每台计算机上使用不同的ssh密钥,您只需创建密钥(即:keygen“david@someemail.com”),然后将公钥复制到您的gitolite keydir目录(gitolite-admin / keydir)。执行此操作时,只需将密钥命名为david@homecomputer.pubdavid@workcomputer.pubdavid@laptop.pub。将密钥添加到存储库(git add keydir/.),将提交(git commit -m "added David's additional keys")和git push添加回服务器。

    Gitolite足够聪明,知道即使它是一个不同的密钥,用户名(在@之前)仍然是david,并且会让该用户登录并使用ACL {{ 1}}

    希望这有帮助

    修复您可能david john_home.pub打开gitolite repo(admin repo)并将john_work.pub中的密钥重命名为kedir和{{ 1}}提交和推送。现在,您的用户john@work.pub可以从任一计算机登录并使用相同的用户名。

    请注意,为了使其正常工作,SSH密钥中的电子邮件地址必须与所有用户密钥相同。因此,使用上面的示例,在密钥john@home.pubjohndavid@homecomputer.pub中,所有密码都应该包含david@workcomputer.pub的电子邮件地址。

    上面是“旧方法”对此做的,如果您以“电子邮件地址方式”命名您的密钥,可能会导致并发症,这与我上面所说的相反gitolite不检查您的密钥是否正确的电子邮件地址。请忽略(为了清楚起见,我保留了原始评论。)

答案 1 :(得分:11)

至少对于Gitolite v3 最简单的解决方案是使用此处记录的子文件夹系统http://sitaramc.github.com/gitolite/users.html

Gitolite将通过keydir递归搜索并将所有.pub关联为一个用户。 我现在使用子文件夹系统与Windows笔记本电脑和Linux开发机器工作正常。

user @ host约会似乎太复杂了。

我正在做这样的事情:

keydir
 |--mfang
 |    |--laptop01
 |    |      |--mfang.pub
 |    |--linux01
 |    |      |--mfang.pub
 |...etc

答案 2 :(得分:4)

自gitolite v3.5.2-10-g437b497(2013年9月,提交59c817d0)以来,有一个更简单的解决方案:

ukm, for "user key management"

  

用户密钥管理允许某些用户添加和删除密钥。

它可以引入一个级别的委托,当不仅仅是gitolite管理员用户可以添加新的ssh公钥时,其他用户现在也可以这样做。

它还有助于添加/删除公共ssh密钥。

您可以在“contrib/t/ukm.t”中看到它:

Gitolite文档includes a section on that topic,但 ukm ,更容易(“Users that want to manage multiple keys”部分):

  

你的gitolite管理员用你的一把钥匙作为你的初始钥匙来创造你的gitolite身份。此密钥只能由gitolite管理员管理,而不能由您管理。它基本上决定了你对gitolite所知的名称。

     

You can add new keys to this identity and remove them at your will

# The admin can add multiple keys for the same userid.
try "
ADDOK u5 admin u4\@example.org
ADDOK u5 admin u4\@example.org\@home
ADDOK u5 admin laptop/u4\@example.org
ADDOK u5 admin laptop/u4\@example.org\@home
";

答案 3 :(得分:3)

我已经重组了我的gitolite管理员keydir几次,但仍然没有真正决定哪种是最好的组织方式。如果你能坚持一些惯例,事情肯定会更容易,但这并不总是可行的。幸运的是,gitolite是灵活的。

一般情况下,我更喜欢 not 使用包含所有密钥的单个平面目录,在命名约定“user@host.pub”上依赖 来保持直接。 (这似乎暗示在其他答案中?)如果您在多个主机上有多个密钥而单个“真实”用户有多个用户名(或者两个不同主机上两个不同用户的用户名相同),这可能会变得令人困惑。使用子目录有助于组织事物 - 使用任何深度的树,但通常我只使用一个级别。

两个主要选项(甚至是它们的组合):

  1. 每个“真实”用户一个目录,每个目录包含多个密钥 该用户(例如,通常每个主机一个)。
  2. 每个(授权)主机一个目录,每个用户将拥有一个(或多个)密钥 在该主机上工作。虽然用户可以将他们的私钥复制到另一个私钥 主持人,这是(在我的情况下)气馁。在任何情况下,子目录都是在最初生成密钥的主机之后命名的。
  3. 作为每个用户一个子目录的示例(选项#1):

    conf
     |--gitolite.conf
    keydir
     |--john.doe
     |    |--john@host1.pub
     |    |--john@host2.pub
     |    |--jdoe@host2.pub
     |    |--john.doe@company.com.pub
     |    |--tester@temp-vm43.pub
     |--will.rodgers
     |    |--wrodgers.pub
     |    |--wrodg1234@host2.pub
     |    |--will.rodgers@company.com.pub
     |    |--tester@temp-vm22.pub
     |...etc
    

    请注意:

    • 目录名称(在keydir下)与gitolite无关。
    • 目录名称应该是通用唯一的,例如电子邮件地址或其他一些全局ID。这允许“git”用户在不同的主机上具有相同的用户名。
    • 用户可以跨多个主机共享“user.pub”或“user@email.com.pub”之类的密钥;但是,根据政策,可能会阻止这样做。

    一般来说,我更喜欢并使用选项#1,附上一些选项#2的例子。选项#2可能会简化内部网自动化,如果您有服务器进出(可能是配置和回收VM)并希望维护主机级而不是用户级,那么您可以(例如)轻松清理退役主机上的过时密钥(例如,短期测试VM)。

    关于gitolite的好处是keydir目录的(重新)组织不会影响用户。但是如果不小心的话,你很容易(无意中)锁定你的用户(或你自己)。

答案 4 :(得分:1)

您在服务器上的一个用户下安装gitolite;通常为git,并且在您的SSH连接字符串中,您始终明确使用git@servername连接到Git用户帐户。然后,Gitolite将查看您提供的公钥,在您的配置中找到它,并将您视为关联用户。

答案 5 :(得分:1)

你总是这样连接:

git clone gitoliteuser@gitoliteserver:reponame

无论您是哪个用户。 Gitolite通过您提供的公钥识别您。例如,该密钥称为dave.pub。通过与此公钥的ssh连接完成的任何操作都将由gitolite根据配置文件中使用“dave”或“all”的位置进行详细检查。

您可以自由设置名称和电子邮件,使其成为您在不同计算机和不同存储库上的所需内容。提交将拥有该信息。但是,您可以读取或写入的分支,树或存储库取决于管理存储库中配置文件中“dave”的限制 - 如果您对ssh使用相同的公钥/私钥。

希望这会有所帮助。

答案 6 :(得分:1)

每个人似乎都缺少一个微妙的观点,或者至少没有明确回答。

OP询问如何在两个不同的PLATFORMS上使用两个不同的USERNAMES和两个不同的(相关的)pub-keys来处理同一个PERSON。

EG。 dave@platform_a.pub和david@platform_b.pub都代表同一个真正的git用户。

添加dave和amp;都很容易大卫作为gitolite.conf文件中“@known”(已知用户)行的用户,并将两个密钥放在keydir中,但是没有办法判断这是两个独立的用户,还是同一个人。

EG。 “git blame”会将戴​​夫和大卫视为两个独立的用户。

除了OP的帖子之外,如果有几个戴维斯在同一个项目上工作会发生什么更复杂的事情?

我想有关的戴维斯必须制定一个系统(或满足于互相指责; - )。

答案 7 :(得分:0)

Gitolite使用ssh强制命令进行身份验证。每个有权访问gitolite存储库的用户都会在安装gitolite的情况下登录。钩子在keydir中获取新密钥,并将它们添加到配置为使用强制命令的授权密钥文件中。

用户被迫使用带有参数的gitolite shell,该参数是用户名。以下相关钩子接受文件路径并将其分配给用户,然后剥离名称中带有/的所有目录和文件。剩下的内容将成为用户名,只要它以.pub结尾,并且只要至少有一个附加字符,它将忽略@后缀之前的单个.pub符号

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

这提供了这样的功能:

keydir
  |--host1
       |--dave.pub
       |--david.pub
  |--host2
       |--dave.pub

目录是任意的,但出于组织目的,主机用于提供结构。您最终会有两位dave位用户和一位david位用户。

我使用的配置更像是这样:

keydir
  |--steve
       |--steve@example.com@laptop.pub
       |--steve@example.com@desktop.pub
  |--services
       |--jenkins
            |--jenkins@master-buildhost.pub
            |--jenkins@slave-buildhost.pub
       |--redmine
            |--redmine@dev-server.pub
       |--jira
            |--jira@dev-alias.pub

同样,目录结构无关紧要。这为用户提供了steve@example.comjenkinsredminejirasteve@example.com用户有两个密钥以及jenkins用户。如果我有多个用户,我可能会有一个包含steve密钥目录的users子目录。