那么在git服务器上通常会建立一个git这样一个账户,其它人共用这个账户来克隆或推送数据到git仓库中,通常也只需要这个功能,但是如果不加限制,那么其它人可以通过这个git账户登录到主机,那么这样是不安全的,所以需要加以限制,方法如下:
编辑/etc/passwd这个文件,在文件末尾可以找到类似这样的行:
对于将用户公钥保存在authorized_keys文件中的做法,只能应付于只有几个开发者的情况,如果开发者数量达到几百人的规模时,管理起来十分痛苦,每次增加或删除用户时都必须登录到服务器上去,而且还缺少必要的权限管理,因为用户对所有在/home/git下的git项目都拥有读写权限。
那么可以使用gitosis这个东西,gitosis是用来管理authorized_keys文件和简单连接限制的脚本。添加、删除用户或设定权限这些工作是通过管理一个特殊的git仓库来实现的,你只需要在这个仓库做好相应的设置,然后推送到服务器上,gitosis就会随之改变策略,听起来不错吧。
那么首先是安装gitosis,gitosis工作依赖某些python工具,所以需要安装一些必要的安装包:
如果之前将/etc/passwd中git账户的/bin/sh改成了/usr/bin/git-shell,那么这里需要先改回去(这里没有弄明白,改回去之后不就能使用git这个账户登录到主机了吗)。接下来就是初始化gitosis了,运行gitosis-init命令(注意需要在服务器端执行gitosis-init命令):
gitosis-admin.git这个特殊的git仓库已经建立好了,并且密钥的拥有者对该仓库具有访问权限,那么接下来就是将这个仓库拉下来:
那么之后呢,我们需要添加一个git项目iphone_project,由于此时只有scott这个用户(注意,这里members指定的用户名必须同".pub"前面的命名相同,例如,如果是scott.pub,那么这里写上scott就可以了,通常,我们生成密钥时会跟上机器的名字,如果你的.pub命名带上"@机器名"的话,那么members这里也要带上@机器名,总之members指定的名字一定要同".pub"前面命名相同),那么iphone_project这个项目就只对他进行授权:
如果只让John具有只读权限,也可以这样做:
全文完。
编辑/etc/passwd这个文件,在文件末尾可以找到类似这样的行:
git:x:1000:1000::/home/git:/bin/sh然后把/bin/sh改为/usr/bin/git-shell,这样git这个账户就只能用来克隆或者推送数据到git仓库中了,而不能用它来登录到主机。
对于将用户公钥保存在authorized_keys文件中的做法,只能应付于只有几个开发者的情况,如果开发者数量达到几百人的规模时,管理起来十分痛苦,每次增加或删除用户时都必须登录到服务器上去,而且还缺少必要的权限管理,因为用户对所有在/home/git下的git项目都拥有读写权限。
那么可以使用gitosis这个东西,gitosis是用来管理authorized_keys文件和简单连接限制的脚本。添加、删除用户或设定权限这些工作是通过管理一个特殊的git仓库来实现的,你只需要在这个仓库做好相应的设置,然后推送到服务器上,gitosis就会随之改变策略,听起来不错吧。
那么首先是安装gitosis,gitosis工作依赖某些python工具,所以需要安装一些必要的安装包:
$ sudo apt-get install python-setuptools接下来就是将gitosis克隆下来并安装:
$ git clone https://github.com/tv42/gitosis.git $ cd gitosis $ sudo python setup.py install默认gitosis会把/home/git作为git仓库的根目录,如果是其它目录,可以做一个链接:
$ ln -s /opt/git /home/git/repositories
如果之前将/etc/passwd中git账户的/bin/sh改成了/usr/bin/git-shell,那么这里需要先改回去(这里没有弄明白,改回去之后不就能使用git这个账户登录到主机了吗)。接下来就是初始化gitosis了,运行gitosis-init命令(注意需要在服务器端执行gitosis-init命令):
$ sudo -H -u git gitosis-init < /tmp/id_rsa.pub Initialized empty Git repository in /home/git/repositories/gitosis-admin.git/ Reinitialized existing Git repository in /home/git/repositories/gitosis-admin.git/这样公钥的拥有者就可以配置gitosis那个特殊的git仓库了,接下来需要手动对该仓库中的post-update脚本加上可执行权限:
$ sudo chmod +x /home/git/repositories/gitosis-admin.git/hooks/post-update注:首先需要删除服务器上的.ssh目录(包括其中的authorized_keys这个文件),这里为什么要删除.ssh这个目录呢,因为在执行gitosis-init命令时会在/home/git目录下创建一个.ssh目录,同时在.ssh目录下创建authorized_keys文件,并且将id_rsa.pub这个密钥写入authorized_keys这个文件中,这样该密钥的拥有者就对gitosis-admin.git这个仓库具有访问权限,但这里还是有点不是很明白,密钥不是放在gitosis-admin仓库中的keydir目录下的吗?
gitosis-admin.git这个特殊的git仓库已经建立好了,并且密钥的拥有者对该仓库具有访问权限,那么接下来就是将这个仓库拉下来:
$ git clone git@gitserver:repositories/gitosis-admin.git
注意:这里修改其命令为:
$ git clone git@gitserver:gitosis-admin.git
否则将出现如下提示错误:
$ git clone git@gitserver:repositories/gitosis-admin.git Cloning into 'gitosis-admin'... ERROR:gitosis.serve.main:Repository read access denied fatal: The remote end hung up unexpectedly
因为什么原因呢,gitosis默认git仓库路径就是/home/git/repositories,如果要新建其它仓库,最好也放在该目录下,否则也会提示同样的错误,还有一点需要注意的是服务器上的git仓库最好以.git后缀名结尾,否则克隆时会以(仓库名.git)这个名字去寻找,如果不是以.git后缀名结尾的话,就会出现找不到的情况。
如果克隆成功,那么将在本地出现gitosis-admin这个目录,可以到这个目录去看一下,该目录下主要有两个东西gitosis.conf和keydir,gitosis.conf主要是配置用户、仓库和权限的配置文件,而keydir目录中则保存的是用户的公钥,每个用户都得有一个.pub结尾的文件,例如scott.pub。而此时gitosis.conf内容如下:
$ cat gitosis.conf [gitosis] [group gitosis-admin] members = scott writable = gitosis-admin表示只有scott这个用户能管理gitosis-admin这个项目。
那么之后呢,我们需要添加一个git项目iphone_project,由于此时只有scott这个用户(注意,这里members指定的用户名必须同".pub"前面的命名相同,例如,如果是scott.pub,那么这里写上scott就可以了,通常,我们生成密钥时会跟上机器的名字,如果你的.pub命名带上"@机器名"的话,那么members这里也要带上@机器名,总之members指定的名字一定要同".pub"前面命名相同),那么iphone_project这个项目就只对他进行授权:
[group mobile] members = scott writable = iphone_project修改完成之后,需要提交gitosis-conf这个文件:
$ git commit -am 'add iphone_project and mobile group' [master 8962da8] add iphone_project and mobile group 1 file changed, 4 insertions(+) $ git push origin master Counting objects: 5, done. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 272 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To git@gitserver:gitosis-admin.git fb27aec..8962da8 master -> master在推送之前,先设置一个远程仓库(此时是不用在服务器上创建iphone_project的裸仓库,gitosis会自动创建一个,不过我没有实验成功):
$ git remote add origin git@gitserver:iphone_project.git $ git push origin master Initialized empty Git repository in /opt/git/iphone_project.git/ Counting objects: 3, done. Writing objects: 100% (3/3), 230 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To git@gitserver:iphone_project.git * [new branch] master -> master
注意,这里后来也测试成功了,这里的意思是,首先需要在本地建立一个git工程,然后在执行git remote add命令添加一个远程仓库,最后执行git push命令时则在服务器上建立iphone_project.git这样一个裸仓库。
$ cp /tmp/id_rsa.john.pub keydir/john.pub $ cp /tmp/id_rsa.josie.pub keydir/josie.pub $ cp /tmp/id_rsa.jessica.pub keydir/jessica.pub然后把他们都加入mobile这个group中:
[group mobile] members = scott john josie jessica writable = iphone_project提交这个更新之后,scott这四个用户都对iphone_project项目具有读写权限。
如果只让John具有只读权限,也可以这样做:
[group mobile] members = scott josie jessica writable = iphone_project [group mobile_ro] members = john readonly = iphone_project现在Johon可以克隆和或者代码更新,但是不能提交代码到仓库中。像这样设置权限是很方便的,gitosis甚至还可以指定某个group为一个成员,例如:
[group mobile_committers] members = scott josie jessica [group mobile] members = @mobile_committers writable = iphone_project [group mobile_2] members = @mobile_committers john writable = another_iphone_project
全文完。