git权限问题

那么在git服务器上通常会建立一个git这样一个账户,其它人共用这个账户来克隆或推送数据到git仓库中,通常也只需要这个功能,但是如果不加限制,那么其它人可以通过这个git账户登录到主机,那么这样是不安全的,所以需要加以限制,方法如下:
编辑/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内容如下:

扫描二维码关注公众号,回复: 3233403 查看本文章
$ 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这样一个裸仓库。

如果需要将其他开发者加入进来,现在不用将用户公钥加入到~/.ssh/authorized_keys这个文件中了,只需要将公钥放入keydir这个目录中就行了:

$ 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


全文完。

https://blog.csdn.net/mcgrady_tracy/article/details/40658251

猜你喜欢

转载自blog.csdn.net/m0_37477061/article/details/82378530
今日推荐