Skip to content

Gitosis实现原理 #2

Description

@miclay

git作为一个分布式的版本控制系统,其实client端和server的差别并不是很大,只是server端往往没有工作拷贝的需求,所以往往是一个裸库(bare repository),往往文件夹的名称为xxxx.git ,裸库的内容其实就相当于客户端某个工程下的.git目录了.

使用git的时候,一般和服务器通讯使用的是ssh协议,用ssh的主要优点是速度快(传输前数据会先压缩,比HTTP快),安全,方便读写。 客户端通过ssh访问服务器端的验证方式一般有两种,一种是用户名密码的方式,一种是使用公私钥认证的方式. 使用公私钥的方式比较方便,无需每次登录输入密码。 某个受信任的客户端的公钥会被设置在服务器端的 ~/.ssh/authorized_keys文件中,有关此文件的格式可以参见 sshd的用户手册 man sshd . authorized_keys有个比较厉害的功能是 支持 command参数,使得每次用户使用此公钥进行验证的时候执行此后面的命令.这样就可以做一些逻辑处理了.

一般git库的管理需要权限控制,如何方便简单的进行库的权限管理呢? authorized_keys是一个思路,指定特定command参数,每次验证好用户后首先执行相关逻辑,检测当前用户是否具有某个权限。 所以便有了gitosis,与其说gitosis是一个git权限管理系统,还不如说它是一个authorized_keys文件管理器.
gitosis的设计思路很巧妙,开天辟地之初,需要一个gitosis的管理员,所以你就在你的客户端机器上生成一对公私钥,将公钥拷贝到git服务器端的/tmp/下,然后通过gitosis在git用户home目录下运行如下初始化命令,后面的公钥便是gitosis首个管理员的公钥

sudo -H -u git gitosis-init < /tmp/id_rsa.pub

执行之后,home目录下出现一个repositories的目录,目录下存在一个gitosis-admin.git的git库. 其实gitosis就是通过这个git库来管理所有git库的访问权限的。
在刚才你的客户端机器上clone出这个库,因为你刚刚用你的公钥初始化了gitosis,所以你有权限访问服务器端的库(其实你可以在服务器端看看authorized_keys文件便知道原因了)。 这个gitosis-admin的库中存在一个gitosis.conf和一个keydir的目录,gitosis.conf文件就是权限配置的地方,keydir目录下存放的是所有客户端的公钥,公钥名字必须和配置文件中的member名字对应.至于gitosis.conf的语法及用法可以去查看帮助。
当修改完配置和添加好需要添加的公钥之后,提交并push到git服务器,这个库的存在hook,当提交后,会根据新的配置和公钥去更新服务器端git用户的authorized_keys,以便加入新用户的公钥,用于权限控制命令,以及在裸库的目录下提取出新的gitosis.conf文件。

所以 gitosis的核心在于authorized_keys的command参数和git的hook功能.

原文:
http://geeklu.com/2012/10/gitosis/

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions