Php git权限不足,无法将对象添加到本地git服务器存储库
我有一个用php运行的www数据,它控制着一个git服务器。 www数据用户创建Unix用户,并赋予它sudo adduser,这些用户应该控制自己的私有git目录,每个用户都可以在其中存放自己的存储库 我已经遵循了至少十次,除此之外,我还打算创建git服务器 Apache添加了一个unix用户栏,在/var/www/git/bar中有一个home,用户没有密码-禁用密码 用户栏是gitusers组的一部分,它允许+rwx访问组成员,并将其shell设置为/usr/bin/gitshell 这样做是为了让www数据可以访问他的主目录,并用存储库和ssh密钥填充它 骨架主目录还使用gitshell命令填充,用户www-data创建一个/var/www/git/bar/.ssh/authorized_密钥,并在其中附加我的测试用户的foo公钥 当www数据添加新用户,然后添加新存储库时,它会:Php git权限不足,无法将对象添加到本地git服务器存储库,php,git,apache,shell,ssh,Php,Git,Apache,Shell,Ssh,我有一个用php运行的www数据,它控制着一个git服务器。 www数据用户创建Unix用户,并赋予它sudo adduser,这些用户应该控制自己的私有git目录,每个用户都可以在其中存放自己的存储库 我已经遵循了至少十次,除此之外,我还打算创建git服务器 Apache添加了一个unix用户栏,在/var/www/git/bar中有一个home,用户没有密码-禁用密码 用户栏是gitusers组的一部分,它允许+rwx访问组成员,并将其shell设置为/usr/bin/gitshell 这样
sudo adduser --disabled password\
--home /var/www/git/bar\
--conf /var/www/conf/adduser.conf\
--ingroup gitusers\
bar
上述^^^是通过php完成的。
.ssh和授权的_密钥归www数据所有
然后www数据继续创建一个新目录并对其进行初始化:
mkdir/var/www/git/bar/test.git
cd/var/www/git/bar/test
git-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用户,而是具有禁用密码的用户栏
为什么要我输入ssh密码?他们不应该处理这个问题吗?
如果我创建了一个带有密码的条,那么我可以使用git存储库,替换foo@localhost:/var/www/git/barbar@localhost:/var/www/git/bar
当我根本不使用ssh://时,我仍然可以克隆,但在按下asfoo时会出现相同的错误,但如果我启用了密码,则不会使用asbar。
我做错了什么
是因为.ssh和授权的_密钥的权限太开放还是不属于bar
即使我以sudo的身份进入homedir酒吧,把所有的东西都归他所有,我仍然会犯同样的错误
最后,我为测试用户foo设置了我的.ssh/config,以便:
事实证明,这确实是许可。 跟踪/var/log/auth.log提供了以下见解: 身份验证被拒绝:目录/var/www/git/bar的所有权或模式错误 通过谷歌搜索,我发现问题在于整个主目录都可以被该组访问 所以回到原点,允许www数据成为+rwx组的一部分是不可能的,因为它破坏了ssh 编辑: 来自iveqy的评论非常明智,使用unix用户进行此类操作是一种过激行为,并且会打开潜在的安全漏洞,因为它要求您将用户www数据升级到超级用户 我最终使用了gitolite admin,我添加它是为了将来参考Debian/Ubuntu下的apache用户如何控制gitolite 说明书 Web服务器apache2在系统上作为www数据运行。 所有php脚本都作为www数据执行。 这要求我们允许该用户自动管理我们的git服务器 要使gitolite正常工作,需要管理员提供ssh密钥。 这反过来要求用户www-data-apache2拥有一对ssh密钥。 必须保护密钥对,否则ssh将无法工作: 使用主目录在:/var/www/git中创建新用户git sudo adduser git-home/var/www/git 将cd放入/var/dir/git并删除所有骨架文件.bashrc、.profile、.bash\u注销 以用户git:su-git的身份在本地登录,并使用前面创建的密码 确保git user home dir的权限设置为755 g+rx 创建.ssh dir:mkdir.ssh,然后将其设置为私有:chmod 700-R.ssh 现在,随着www数据从git用户创建ssh密钥出口: 进入/var/www/并创建一个由www data拥有并带有700掩码的./ssh。 sudo-u www数据ssh-keygen-t rsa 如果一切正常,请将/var/www/.ssh/id_rsa.pub复制到/var/www/git/.ssh/ 将密钥的所有权授予用户git:sudo chown git.git.ssh/id\u rsa.pub 以git:su-git身份重新登录 将发布密钥设为私有:chmod 600.ssh/id_rsa.pub 安装gitolite的时间: git克隆git://github.com/sitaramc/gitolite mkdir-p$HOME/bin gitolite/安装-至$HOME/bin 设置要用作gitolite管理员的www数据公用rsa密钥: $HOME/bin/gitolite setup-pk.ssh/id\u rsa.pub 你应该得到: 在/var/www/Git/repositories/gitolite-admin.Git中初始化空Git存储库/ 在/var/www/Git/repositories/testing.Git中初始化空Git存储库/ 警告:/var/www/git/.ssh/authorized_密钥丢失;创建一个新的 这在全新安装上是正常的 用户git现在已设置完毕。 注销:退出 不要触摸目录/var/www/g 从现在开始 我们将在本地克隆它,并从那里控制它。 将其克隆为用户www数据: 首先创建由www-data拥有的本地副本:sudo mkdir gitolite admin&&chown-R www-data.www-data gitolite admin/ 然后作为用户www数据执行命令:sudo-u www数据git clonegit@localhost:gitolite admin gitolite admin/ 这将在/var/www/gitolite-admin中克隆gitolite-admin,您可以从中控制gitolite服务器 有关如何控制gitolite服务器的说明,请参阅: 从现在起,您执行的任何gitolite命令都将作为用户www数据执行。 任何以root或sudo身份运行的命令都会破坏服务器
PS:如果这破坏了您的apache配置,我不承担任何责任。我希望它能帮助任何来到这里的人,原因和我一样:创建git服务器。我愿意接受建议、更好的想法或改进。虽然这不是对你问题的回答,但我认为你的攻击方式是错误的。看看gitolite,如果这和gitlab都不符合您的需要,那么看看他们是如何实现让用户拥有私有存储库的。让所有用户都有一个git用户是一个更简单的解决方案。许多unix用户很难以良好的方式获得成功。
Host localhost
Hostname 127.0.0.1
IdentityFile ~/.ssh/foo
User foo