【发布时间】:2016-05-15 23:33:47
【问题描述】:
我有一个 www-data 与 php 一起运行,它控制着一个 git 服务器。
www-data 用户创建 Unix 用户(给它sudo adduser),这些用户应该控制他们自己的私有 git 目录,每个用户都可以在其中存放他/她的存储库。
我已经关注this guide至少十次了,除此之外,我也是following this guide为了创建git服务器。
Apache 添加了一个unix 用户
bar,在/var/www/git/bar中有一个家,并且该用户没有密码(--disable-password)用户
bar是组gitusers的一部分,该组允许+rwx访问组成员,并且他的shell 设置为/usr/bin/git-shell。这样做是为了让
www-data可以访问他的主目录并使用存储库和 ssh 密钥填充它。骨架主目录也填充了
git-shell-commands,用户www-data创建了一个/var/www/git/bar/.ssh/authorized_keys,它在其中附加了我的测试用户foo公钥。
当www-data 添加一个新用户,然后添加一个新存储库时:
sudo adduser --disabled password\
--home /var/www/git/bar\
--conf /var/www/conf/adduser.conf\
--ingroup gitusers\
bar
上面的^^是通过php完成的。
.ssh 和 authorized_keys 归 www-data 所有。
然后www-data继续创建一个新目录并初始化它:
mkdir /var/www/git/bar/test.gitcd /var/www/git/bar/testgit --bare init
我的测试用户foo 可以从 ssh 读取它(它只是克隆一个空的存储库)。
一旦我尝试推送初始提交:
git clone ssh://foo@localhost:/var/www/git/bar/test.git
cd test
touch readme
vim readme
git add .
git commit -m "init"
git push origin master
foo@127.0.0.1's password:
Counting objects: 6, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (6/6), 411 bytes | 0 bytes/s, done.
Total 6 (delta 0), reused 0 (delta 0)
remote: error: insufficient permission for adding an object to repository database ./objects
remote: fatal: failed to write object
error: unpack failed: unpack-objects abnormal exit
To ssh://foo@localhost:/var/www/git/bar/random.git
! [remote rejected] master -> master (unpacker error)
error: failed to push some refs to 'ssh://foo@localhost:/var/www/git/bar/random.git'
我被要求输入foo 用户的密码(即拥有公钥的用户)。
这不是拥有主目录的 Unix 用户,而是拥有禁用密码的用户 bar。
- 为什么要求我输入 ssh 密码?他们不应该使用 ssh 密钥来解决这个问题吗?
- 如果我创建一个
barwith 密码,那么我可以使用该git 存储库,将foo@localhost:/var/www/git/bar替换为bar@localhost:/var/www/git/bar - 当我完全不使用
ssh://时,我仍然可以使用clone,但在推送为foo时会出现相同的错误,但如果我启用了密码,则不是bar。
我做错了什么?
是不是.ssh和authorized_keys的权限太开放或者不属于bar?
即使我(以 sudo 身份)进入 bar homedir 并让所有东西都归他所有,我仍然遇到同样的错误。
最后,我为测试用户foo 设置了我的.ssh/config,以便:
Host localhost
Hostname 127.0.0.1
IdentityFile ~/.ssh/foo
User foo
【问题讨论】:
-
虽然这不是您问题的答案,但我认为您以错误的方式攻击它。看看 gitolite,如果它(也不是 gitlab)不符合你的需求,看看他们如何实现让用户拥有私有存储库。为所有用户设置一个 git 用户是一种更简单的解决方案。许多 unix 用户很难以好的方式取得成功。