Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php git权限不足,无法将对象添加到本地git服务器存储库_Php_Git_Apache_Shell_Ssh - Fatal编程技术网

Php git权限不足,无法将对象添加到本地git服务器存储库

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 这样

我有一个用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数据添加新用户,然后添加新存储库时,它会:

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