使用git作为部署实用程序时的安全问题

时间:2012-02-14 17:18:41

标签: git security deployment

git是一个非常强大的工具,但不是那么容易使用

例如,我很高兴使用git作为工具从我的git存储库更新我的远程站点。问题是我的网站根目录下有一个.git目录,外部用户只需使用site / .git访问它,这很糟糕,因为他们可以轻松获取我的代码历史记录,基本上是当前的代码,他们甚至可以从配置文件中获取密码和私人信息。

那么使用git哪种方法可以充分利用git,但不引入这些威胁呢?

使用git clone git://repo site_root初始化网站,git pull进行更改非常方便,但也带来了巨大的安全问题。

是否有任何方法可以像上面显示的步骤一样方便,但没有安全隐患?

6 个答案:

答案 0 :(得分:2)

Apache至少默认其配置禁止对以.开头的任何文件进行Web访问,这也可以在任何其他网络服务器上完成。

此外,最好将敏感文件保留在Web根目录之外,即:

.git/
config.file
public/
public/index.html

并将该站点的文档根目录为public/目录。

答案 1 :(得分:1)

请参阅http://www.clientcide.com/best-practices/exporting-files-from-git-similar-to-svn-export/

从上面开始:

  

这是我的一行命令,用于获取存档并将其发送到   不同的位置:

     

git archive HEAD | (cd~ / path / where / I / want / it /& amp;& tar -xvf - )

     

这会将ENTIRE库提取到指定的路径(没有   .git文件和诸如此类的东西。

     

然而,有时候,我想拉出一部分库。   git存档总是给你整个辣酱玉米饼馅,有点糟透了,   在这种情况下,我使用rsync,如下所示:

     

rsync path / I / want / to / export / -ri --del -m --exclude“。*”   〜/ path / where / I / want / it / | grep sT

     

最后一点 - grep sT将限制我所看到的输出   我只看到更新的文件。我只是为了理智而使用它   检查我的出口。如果我看到TON的东西去更新路径   已经有了库,我知道我只更改了一个文件,然后是我   知道我错了路。

答案 2 :(得分:1)

好吧,我真的不喜欢直接使用git来自动部署代码的最后一个版本,但这是另一个问题。

关于您的安全问题,一个非常基本的解决方案是删除对.git文件的访问权限(使用htaccess文件?)。

另一件事是从git存储库中删除你的密码,在你的版本控制系统中可能没有使用它。

答案 3 :(得分:0)

@ JaredPar的评论和@Chris Shain上面的答案(git档案的+1)的组合。

我也使用git archive,然后使用Chef进行实际部署。不可能更简单。

  1. git archive <tag_name> | gzip > rc.tar.gz
  2. mv rc.tar.gz到我的食谱
  3. 上传食谱
  4. 在我的服务器上运行的chef-client运行配方,将压缩文件复制到chache位置并将其解压缩到我的Web服务器目录中。

    自我注意:在github上发布食谱

答案 4 :(得分:0)

如果要求在生产服务器中拥有完整的仓库,那么就有一个解决方案。

你可以在文件系统中的某个地方拥有整个历史记录,并让git“指向”它。

$ cd /public                        # go to the public directory
$ git clone git://repo              # to initialize the web site
$ mv .git /private/repo.git         # move sensible information to a private place
$ export GIT_DIR=/private/repo.git  # make git "point" to the history
$ git pull                          # update changes

如果您这样做,您的历史记录将位于无法通过网络访问的/private/repo.git中,您的工作目录将位于/ public,仅提供您指定的文件版本。

有关详细信息,请参阅progit

答案 5 :(得分:0)

我会重新提出这个问题,因为我也在研究安全问题。

您应该使用分离的工作树,如here所述。您可以在Web根目录之外创建git存储库,并让git指向不同目录下的源代码。