安全防范:nginx下git引发的隐私泄露问题

安全防范:nginx下git引发的隐私泄露问题

1   安全事件

最近阿里云服务器后台管理系统中收到一条安全提示消息,系统配置信息泄露:

http://my.domain.com/.git/config

能够被公网无认证即可访问,请修复。

一般情况下,配置信息泄露是相当严重的问题,往往会千万另外一个地方整片区域的 沦陷,比如:数据库。当然本例并没有这样,但是可以作为一个典型安全来进行讲解。

2   问题分析

由于目前的 web 项目的开发采用前后端完全分离的架构:前端全部使用静态文件,和后端代码完全分离,隶属两个不同的项目。表态文件使用 git 来进行同步发布到服务器,然后使用 nginx 指向到指定目录,以达到被公网访问的目的。

(pyvenv) ➜  web-app-front git:(master) ls -a
.           .git        .idea       css         fonts       index.html  tpl
..          .gitignore  ReadMe.rst  favicon.ico images      js

将此项目发布到服务器的 /var/www/web-app-front 目录中,然后在Nginx中进行如下配置:

# configuration of the server
server {
    # the port your site will be served on
    listen      80;
    # the domain name it will serve for
    server_name my.domain.com; # substitute your machine's IP address or FQDN
    charset     utf-8;
    # max upload size
    client_max_body_size 75M;   # adjust to taste

    sendfile on;
    keepalive_timeout 0;


    location / {
        alias /var/www/web-app-front/; # your webapp static
    }

}

以上配置,确实可以达到,只要访问 my.domain.com 的域,即可进入到 /var/www/web-app-front/ 目录,但是本目录下面有一些本来不想让外界访问到的文件也会被访问到,例如: .git 目录。

一般情况下,黑客可以通过常用的 路径 字典,轻松暴破到此路径及相应的文件。

3   可能危害

因为要使用持续集成系统,所以对于前端静态文件的发布也必须要使用自动化,使用自动化就必须避免交互式的密码输入。而git中避免使用交互式密码输入,主要有如下几种方法:

  1. .netrc 保存明文账号和密码
  2. 在 url 中带明文账号和密码
  3. 使用 ssh-key 进行鉴权

当然,由于笔者使用的 ssh-key,所以并没有千万过多的隐私泄露,将危害控制到了最小(基本只泄露了这个仓库的名称信息,并没有危害)。

查看使用的 ssh-key 鉴权方式下的 .git/config 的内容:

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = git@github.com:myteam/web-app-front.git
        fetch = +refs/heads/*:refs/remotes/origin/*
        [branch "master"]
        remote = origin
        merge = refs/heads/master

但是,笔者不禁想起,以比较早期的时候,为了避免反复输入密码,曾经使用过在 url 中带明文账号和密码的方式来 clone 一个 git 仓库:

git clone https://username:password@github.com/myteam/web-app-front.git

即,把账号和密码放在url里面可以免去反复交互式输入账号密码的繁琐操作。这样的话 .git/config 就会包括如下内容了:

[remote "origin"]
        url = https://username:password@github.com/myteam/web-app-front.git

显然,如上的疏忽就会导致如下内容被泄露:

  • 账号名:username
  • 密码:password
  • 服务网站:github.com
  • 项目组代号:myteam
  • 项目仓库名称:web-app-front

然后黑客就可以轻松打开服务网站,使用指定的账号和密码登录。然后浏览开发人员所在组的所有代码,然后代码里面可能包含如下的内容:

  • 数据库账号密码
  • 服务器IP
  • 服务器账号密码
  • 其它隐私信息

将会完全被泄露出去,可以说,这样一个小疏忽会导致全线崩盘,这并不是耸人听闻。

4   处理方法

其实处理方法,最后仍然是这样一个思想:将权限最大化收拢,不过多外放任何不需要外放的权限

由于本文是使用 nginx 来让外网具备访问文件目录的能力,所以此权限就在 nginx 层做配置,只需要将不需要被外界访问的目录进行排除设置即可。例如,不允许外部访问 .git 目录:

server {
    location ~ /\.git {
        deny all;
    }
}

目录 .git 后是否带有"/",带"/"只禁止访问目录,不带"/"禁止访问目录中的文件。

当然, nginx 还有更多的限制访问的配置,本文不再一一列举,读者有兴趣的可以查看其官网上的相关文档进行更细致的研究。

5   总结

对于服务器往往都放在公网云端的互联网从业人员来说,任何时候都不能对权限配置疏忽了,否则可能千万无法估量的损失。


作者: Harmo哈莫
作者介绍: https://zhengwh.github.io
技术博客: http://www.cnblogs.com/beer
Email: dreamzsm@gmail.com
QQ: 1295351490
时间: 2016-02
版权声明: 欢迎以学习交流为目的读者随意转载,但是请 【注明出处】
支持本文: 如果文章对您有启发,可以点击博客右下角的按钮进行 【推荐】
posted @ 2016-06-16 09:25  一点一滴的Beer  阅读(5555)  评论(7编辑  收藏  举报