背景:在多数企业中,都会选择 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 漏洞的解决办法
一般有以下三种解决方案:
-
升级 GitLab 版本,升级过程复杂,有丢失数据的风险,如果要升级,一定做好备份
-
替换 GitLab 自带的 nginx,方案比较复杂,会出现较多问题
-
在 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
-> latest14.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,一起交流!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库