背景:在多数企业中,都会选择 GitLab 作为代码仓库存储公司的代码,关于 GitLab 的优点、牛逼的功能属于常识了,不了解的可以自行查询资料。本文假设你已经知道了 GitLab,并能熟练的操作和管理它。

 

一、Nginx CVE-2021-23017 漏洞说明

2021年5月25日,F5公司发布了影响NGINX DNS解析的低风险漏洞 CVE-2021-23017,受影响版本为NGINX开源和NGINX Plus版本。通过更新或升级NGINX的指定版本均可以得到解决。

CVE-2021-23017风险描述:

        针对CVE-2021-23017漏洞,如果攻击者伪造来自指定的DNS服务器发出的UDP包,NGINX 解析器(resolver)可能引起一个字节的内存重写,从而可能导致NGINX worker进程崩溃或其他未指定的影响。

CVE-2021-23017影响范围:

        远程攻击者可能导致NGINX worker进程停止响应,从而拒绝某些用户的访问。仅当已配置一个或多个解析程序指令时,才存在此漏洞。默认情况下,NGINX不会配置任何解析器。

        如果客户上线配置中不包含resolver相关的配置,不会受到此风险的影响,可以暂时对本次的CVE低风险漏洞不做考虑,也可以通过升级到新的版本解决这个问题。

 

        原文作者:NGINX官方账号

        对于NGINX开源用户,受影响版本为:0.6.18 - 1.20.0,升级到如下版本可修复此CVE漏洞:

  • NGINX 1.21.0

  • NGINX 1.20.1

 

二、GitLab 内置 Nginx

        GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务。GitLab 内置了一系列的服务,像 Nginx、DNS、SSL、SMTP、postgresql、redis、registry、prometheus等,可以在配置文件 /etc/gitlab/gitlab.rb 中找到各自的默认配置。

内置 Nginx 版本检查

        在低版本的 GitLab 中,内置的 Nginx 版本也比较低,就会存在安全风险,nginx 的版本可以通过命令查看

$ sudo /opt/gitlab/embedded/sbin/nginx -v

nginx version: nginx/1.18.0

 

三、GitLab 内置 Nginx 漏洞的解决办法

一般有以下三种解决方案:

  1. 升级 GitLab 版本,升级过程复杂,有丢失数据的风险,如果要升级,一定做好备份

  2. 替换 GitLab 自带的 nginx,方案比较复杂,会出现较多问题

  3. 在 GitLab 外用 nginx 最新版再负载一层,这个方案不需要修改很多 GitLab 原有的配置,目前使用的人多

 

        我用的 GitLab 版本是13.7.0,比较老旧,升级的话,要先升级到13.8.8,再升级到12.12.15...,具体可以参考官网介绍。过程繁琐,因此暂时不打算升级。况且,GitLab 能够稳定运行,升级也存在风险,有其他办法可以解决Nginx 漏洞,也没必要一定要升级。

13.0.14 -> 13.1.11 -> 13.8.8 -> 13.12.15 -> 14.0.12 -> latest 14.Y.Z

 

        第三种方案,比较简单,懂点 nginx 知识的人,配置下来应该没问题。这里我使用的是第二种方案,替换 GitLab 自带的 nginx

 

四、替换 GitLab 自带的 nginx 步骤

1、修改 GitLab 配置文件

        GitLab 主要设置都在/etc/gitlab/gitlab.rb文件里面,直接 vim 打开,修改几处内容

    $ sudo vim /etc/gitlab/gitlab.rb
external_url 'http://gitlab.abcd.com'
nginx['enable'] = false
web_server['external_users'] = ['nginx']

        external_url 就是给 GitLab 准备的域名,如果配置好了的话,可以不用修改

        nginx['enable'] 是替换自带 Nginx 的关键,true 是选择自带的 Nginx,false 是选择自己安装的 Nginx

        web_server['external_users']  这里配置自带 Nginx 的启动用户,建议留空,不配置

 

2、重新配置 GitLab

        修改 GitLab 配置文件后,执行命令让配置生效,如果遇到问题的话,更多参考内容看这里(英文)。

      $ sudo gitlab-ctl reconfigure

        如果 reconfigure 报错,需要检查配置。不报错,再进行下面的操作。

 

3、安装 Nginx

        这一步比较简单,可以直接使用官方的文档

        https://nginx.org/en/linux_packages.html#RHEL-CentOS

        最简单的方法,配置官方 yum 源,yum install 安装

 

4、配置 Nginx 代理Gitlab服务

        这一步是重点,安装好 Nginx 后,先别启动,需要对 Nginx 配置文件进行配置。

        GitLab 官方为我们准备好了 Nginx 需要的配置文件,访问这里GitLab recipes repository去下载。

upstream gitlab {
server unix:/var/opt/gitlab/gitlab-workhorse/socket;  ## 这里的 socket 路径,要在实际环境中适配
}

server {
listen *:80;
server_name gitlab.abcd.com; # 请修改为你的域名

server_tokens off;     # don't show the version number, a security best practice
root /opt/gitlab/embedded/service/gitlab-rails/public;

 # Increase this if you want to upload large attachments
 # Or if you want to accept large git objects over http
client_max_body_size 250m;

 # individual nginx logs for this gitlab vhost
access_log /var/log/gitlab/gitlab_access.log;
error_log   /var/log/gitlab/gitlab_error.log;

location / {
   # serve static files from defined root folder;.
   # @gitlab is a named location for the upstream fallback, see below
  try_files $uri $uri/index.html $uri.html @gitlab;
}

 # if a file, which is not found in the root folder is requested,
 # then the proxy pass the request to the upsteam (gitlab unicorn)
location @gitlab {
   # If you use https make sure you disable gzip compression
   # to be safe against BREACH attack

  proxy_read_timeout 300; # Some requests take more than 30 seconds.
  proxy_connect_timeout 300; # Some requests take more than 30 seconds.
  proxy_redirect     off;

  proxy_set_header   X-Forwarded-Proto $scheme;
  proxy_set_header   Host              $http_host;
  proxy_set_header   X-Real-IP         $remote_addr;
  proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
  proxy_set_header   X-Frame-Options   SAMEORIGIN;

   #proxy_pass http://gitlab;
  proxy_pass http://gitlab-workhorse;
}

 # Enable gzip compression as per rails guide: http://guides.rubyonrails.org/asset_pipeline.html#gzip-compression
 # WARNING: If you are using relative urls do remove the block below
 # See config/application.rb under "Relative url support" for the list of
 # other files that need to be changed for relative url support
location ~ ^/(assets)/ {
  root /opt/gitlab/embedded/service/gitlab-rails/public;
   # gzip_static on; # to serve pre-gzipped version
  expires max;
  add_header Cache-Control public;
}

error_page 502 /502.html;
}

  配置完后,检查 nginx 配置文件语法
  $ nginx -t

        这些配置 GitLab 官方也有给,需要自己根据实际情况修改,才能最终完成 Nginx 配置。

5、重启 GitLab

  $ sudo gitlab-ctl restart

       重启过程需要一点时间

6、启动 Nginx


$ sudo systemctl restart nginx

       启动好 Nginx 之后,浏览器访问 GitLab 域名,成功即可!!!

 

 

如果对你的学习和使用有帮助,请转发,谢谢!

也可以关注公众号,加微信:yf13476132778,一起交流!