一、Gitlab简介
GitLab 是基于Git实现的WEB代码仓库托管软件,你可以用Gitlab自己搭建一个类似于Github一样的代码仓库,一般使用gitlab搭建私有代码仓库,主要是用在公司的内部代码管理。他还是一个完整的DevOps平台,其中贯穿了安全性、单数据存储支持下可见性和洞察力,支持无缝集成和可扩展系统,用户和企业从中获得速度和效率的收益。
Gitlab 功能是能够对代码的提交审核和问题跟踪,这个对于软件工程(代码)质量的管理是至关重要的。
Gitlab分为社区版(CE)和企业版(EE)。大多数的公司还是会选择社区版。部署Gitlab是对服务器有配置要求的建议是CPU两核,内存4G以上。
二、Gitlab部署与安装
1、YUM安装
下载清华gitlab安装包,源地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/
# yum -y install curl policycoreutils openssh-server openssh-clients postfix
# wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-15.8.1-ce.0.el7.x86_64.rpm --no-check-certificate
# yum -y install gitlab-ce-15.8.1-ce.0.el7.x86_64.rpm
2、docker安装
创建数据目录
mkdir -p /data/gitlab/config # 映射到 Glitlab 容器中的配置目录
mkdir -p /data/gitlab/logs # 映射到 Glitlab 容器中的日志目录
mkdir -p /data/gitlab/data # 映射到 Glitlab 容器中的数据目录
运行容器
docker run -d \
--hostname 宿主机ip \
-p 443:443 -p 80:80 -p 23:22 \
--name gitlab \
--restart always \
-v /data/gitlab/config:/etc/gitlab \
-v /data/gitlab/logs:/var/log/gitlab \
-v /data/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce
查看初始密码,Root 用户的初始密码在配置文件中只保存 24 小时,太长也不方便记忆。所以登录后先修改默认的初始密码。
cat /data/gitlab/config/initial_root_password
3、docker-compose安装
version: "3"
services:
gitlab:
restart: always
image: gitlab/gitlab-ce:15.8.1-ce.0
container_name: gitlab
hostname: gitlab.example.com
ports:
- "8080:80"
- "2222:22"
volumes:
- ./config:/etc/gitlab
- ./data:/var/opt/gitlab
environment:
TZ: Asia/Shanghai
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://gitlab.example.com'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
三、gitlab配置
1、配置SMTP邮件服务
# vim /etc/gitlab/gitlab.rb
### Email Settings
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.163.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "test@163.com"
gitlab_rails['smtp_password'] = "xxxxxxxxxxxxxx"
gitlab_rails['smtp_domain'] = "163.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_from'] = "test@163.com"
gitlab_rails['gitlab_email_reply_to'] = "test@163.com"
user["git_user_email"] = "test@163.com"
2、启用https自动更新
# vim /etc/gitlab/gitlab.rb
external_url 'https://gitlab.example.com'
letsencrypt['enable'] = true
letsencrypt['contact_emails'] = [test@163.com] # This should be an array of email addresses to add as contacts
letsencrypt['group'] = 'root'
letsencrypt['key_size'] = 2048
letsencrypt['owner'] = 'root'
letsencrypt['wwwroot'] = '/var/opt/gitlab/nginx/www'
# See http://docs.gitlab.com/omnibus/settings/ssl.html#automatic-renewal for more on these sesttings
letsencrypt['auto_renew'] = true
letsencrypt['auto_renew_hour'] = 12
letsencrypt['auto_renew_minute'] = 30 # Should be a number or cron expression, if specified.
letsencrypt['auto_renew_day_of_month'] = "*/7"
3、头像不显示问题
# vim /etc/gitlab/gitlab.rb
gitlab_rails['gravatar_plain_url'] = 'https://gravatar.loli.net/avatar/%{hash}?s=%{size}&d=identicon'
gitlab_rails['gravatar_ssl_url'] = 'https://gravatar.loli.net/avatar/%{hash}?s=%{size}&d=identicon'
4、禁用不需要的服务
# vim /etc/gitlab/gitlab.rb
gitlab_rails['registry_enabled'] = false
registry['enable'] = false
prometheus['enable'] = false
alertmanager['enable'] = false
node_exporter['enable'] = false
redis_exporter['enable'] = false
postgres_exporter['enable'] = false
prometheus_monitoring['enable'] = false
grafana['enable'] = false
四、Gitlab的备份与恢复
1、备份GitLab 配置
1、备份
不建议将配置备份存储在与应用程序数据备份相同的位置
备份在每周二(第 2 天)到周六(第 6 天)工作日之后的每天早上运行
# crontab -e -u root
15 04 * * 2-6 gitlab-ctl backup-etc && cd /etc/gitlab/config_backup && cp $(ls -t | head -n1) /secret/gitlab/backups/
确保/secret/gitlab/backups/
存在
2、恢复
# mv /etc/gitlab /etc/gitlab.$(date +%s)
# tar -xf gitlab_config_1487687824_2017_02_21.tar -C /
# gitlab-ctl reconfigure
3、备份相关的配置
备份时的一些配置除了在命令行中通过参数进行配置,还可以在配置文件/etc/gitlab/gitlab.rb
中进行配置
# vim /etc/gitlab/gitlab.rb
gitlab_rails['manage_backup_path'] = true
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups" # 可自定义备份目录
gitlab_rails['backup_archive_permissions'] = 0644 # 设置备份文件的用户权限
gitlab_rails['backup_keep_time'] = 604800 # 设置备份文件的保存期限
2、备份GitLab 应用程序数据
1、备份
应用程序数据备份会创建一个包含数据库、所有存储库和所有附件的存档文件
为了能够备份和恢复,请确保您的系统上安装了 Rsync。如果你安装了 GitLab
# yum -y install rsync
gitaly-backup
用于存储库备份和恢复
# vim /etc/gitlab/gitlab.rb
gitlab_rails['backup_gitaly_backup_path'] = '/path/to/gitaly-backup'
# gitlab-ctl reconfigure
备份命令
# gitlab-backup create
命令行的备份策略参数
默认的备份策略实际上是使用Linux命令tar和gzip将数据从相应的数据位置流式传输到备份。在大多数情况下,这可以正常工作,但是在数据快速变化时可能会导致问题。例如:
- 当tar正在读取数据时更改数据时,错误文件可能会随着我们读取数据而发生更改,并导致备份过程失败。为了解决这个问题,8.17引入了一种称为副本的新备份策略。该策略在调用tar和gzip之前将数据文件复制到一个临时位置,从而避免了错误。副作用是备份过程最多占用额外的1X磁盘空间。该过程尽力在每个阶段清理临时文件,这样问题就不会复杂化,但是对于大型安装而言,这可能是一个相当大的变化。这就是为什么复制策略不是8.17中的默认策略
BACKUP
:设置备份文件名,代替默认备份文件名规则中的时间戳字段,例如:[BACKUP的值]-版本_gitlab_backup.tar
gitlab-backup create BACKUP=dump
GZIP_RSYNCABLE
:设置备份文件可被rsync
传输
gitlab-backup create BACKUP=dump GZIP_RSYNCABLE=yes
SKIP
:设置备份时排除哪些gitlab资源,可选项有db(database)、uploads(attachments)、builds(CI job output logs)、artifacts(CI job artifacts)、lfs(LFS objects)、registry(Container Registry images)、pages(Pages content)、repositories(Git repositories data)
gitlab-backup create BACKUP=dump GZIP_RSYNCABLE=yes SKIP=builds,lfs
SKIP=tar
:创建备份的最后一部分是生成包含所有部分的.tar文件。在某些情况下(例如,如果备份是由其他备份软件获取的),创建.tar文件可能会浪费精力,甚至直接有害,因此可以通过将tar添加到SKIP环境变量中来跳过此步骤。将tar添加到SKIP变量会将包含备份的文件和目录保留在用于中间文件的目录中。创建新备份时,这些文件将被覆盖,因此,应确保将它们复制到其他位置,因为系统上只能有一个备份。
GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY
与GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY
:
设置导出代码仓库数据时使用多线程,GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY
是设置同时最多可导出多少个代码仓库数据,默认为1。GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY
设置每个存储上同时备份的最大项目数。这样可以将存储库备份分散到各个存储中
gitlab-backup create GITLAB_BACKUP_MAX_CONCURRENCY=4 GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY=1
CRON
:在使用crontab进定时备份时,设置为1是为了不显示备份进度信息,减少备份期间相关输出
0 2 * * * /opt/gitlab/bin/gitlab-backup create CRON=1
2、恢复
在重新创建Gitlab后(注意版本需要和备份文件的版本一致),执行下面操作:
1、配置PostgreSQL
在开始执行恢复之前需要先对PostgreSQL做一些配置,否则在执行恢复的时候可能会出现类似下面的异常报错。
Restoring PostgreSQL database gitlabhq_production ... ERROR: must be owner of extension pg_trgm
ERROR: must be owner of extension btree_gist
ERROR: must be owner of extension btree_gist
ERROR: must be owner of extension pg_trgm
修改/var/opt/gitlab/postgresql/data/postgresql.conf
,找到属性listen_addresses
,执行配置:
listen_addresses = '*'
修改/var/opt/gitlab/postgresql/data/pg_hba.conf
,在文件最后添加内容:
local all all trust
host all all 127.0.0.1/32 trust
重启服务。
gitlab-ctl restart
将gitlab
设置为超级用户:
这部分的终端的交互内容大致如下:
# su - gitlab-psql
$ /opt/gitlab/embedded/bin/psql -h 127.0.0.1 gitlabhq_production
psql (13.6)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
gitlabhq_production=# ALTER USER gitlab WITH SUPERUSER;
ALTER ROLE
gitlabhq_production=# \q
$ exit
#
上面终端内容的大意大致如下:
su - gitlab-psql
,切换成用户gitlab-psql
。/opt/gitlab/embedded/bin/psql -h 127.0.0.1 gitlabhq_production
, 打开gitlabhq_production
数据库。执行该命令后会打印相应信息并且提示符变成gitlabhq_production=#
。ALTER USER gitlab WITH SUPERUSER;
,把用户gitlab
修改为超级用户。\q
,退出SQL。exit
,退出gitlab-psql
用户。
2、拷贝备份文件
把前面备份的tar文件拷贝到/var/opt/gitlab/backups/
;以及把gitlab-secrets.json
以及gitlab.rb
拷贝到/etc/gitlab
,并确保这些文件的权限。
假定已经通过工具(譬如FTP工具)把相应文件上传到容器的/tmp
目录下:
mv /tmp/1673231242_2023_01_09_15.5.4_gitlab_backup.tar /var/opt/gitlab/backups/
chown git:git /var/opt/gitlab/backups/1673231242_2023_01_09_15.5.4_gitlab_backup.tar
chmod g-rwx,o-rwx /var/opt/gitlab/backups/1673231242_2023_01_09_15.5.4_gitlab_backup.tar
mv /tmp/gitlab.rb /tmp/gitlab-secrets.json /etc/gitlab/
chown root:root /etc/gitlab/gitlab-secrets.json /etc/gitlab/gitlab.rb
chmod g-rwx,o-rwx /etc/gitlab/gitlab-secrets.json /etc/gitlab/gitlab.rb
3、执行恢复
停掉unicorn
和sidekiq
。
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
执行恢复
gitlab-backup restore force=yes
# 如果/var/opt/gitlab/backups/下有多个备份文件,可以执行下面命令指定恢复的目标
gitlab-backup restore force=yes BACKUP=1673231242_2023_01_09_15.5.4
4、重置、重启、自检
执行下面命令执行重置、重启以及自检。
gitlab-ctl reconfigure
gitlab-ctl restart
gitlab-rake gitlab:check SANITIZE=true
在执行gitlab-rake gitlab:check SANITIZE=true
的时候可能会出现报错,类似:
Internal API available: FAILED - Internal API error (502)
gitlab-shell self-check failed
Try fixing it:
Make sure GitLab is running;
Check the gitlab-shell configuration file:
sudo -u git -H editor /opt/gitlab/embedded/service/gitlab-shell/config.yml
Please fix the error above and rerun the checks.
又或者:
Sidekiq: ... Running? ... no
Try fixing it:
sudo -u git -H RAILS_ENV=production bin/background_jobs start
For more information see:
doc/install/installation.md in section "Install Init Script"
see log/sidekiq.log for possible errors
Please fix the error above and rerun the checks.
这可能是因为重启Gitlab后,部分服务还没完全启动以至于自检出现报错,稍等一会再重新执行自检可能就会顺利通过。
数据恢复的流程至此结束。
五、Gitlab版本升级
gitlab旧版本高危漏洞较多,建议尽快升级到高版本
1、简介
gitlab的版本规则是:主版本(Major).次版本(Minor).补丁版本(Patch)
-
主版本会在每年的五月22左右发布
-
次版本会在每月22号左右发布
-
补丁版本会不定时发布
版本升级说明
- 在同一个主要版本下,补丁版本和次要版本之间跳转是安全的。例如
12.7.5
->12.10.5
11.3.4
->11.11.1
12.0.4
->12.0.12
11.11.1
->11.11.8
- 而主版本升级,需要考虑版本是否可向后兼容与数据迁移,原则上先升级到当前主版本的最大次版本,然后在升级到下个主要版本最小次版本,依次往最新的版本进行升级
说明文档:
- https://docs.gitlab.com/ee/policy/maintenance.html
- https://docs.gitlab.com/ee/update/README.html#version-specific-upgrading-instructions
2、升级前准备
1、确定版本升级路径
可查看最新的版本升级路径文档:https://gitlab-com.gitlab.io/support/toolbox/upgrade-path/?
2、确定升级步骤
升级的步骤取决于Gitlab的部署方式
二进制包安装
源码编译安装
Docker方式安装
Helm方式安装
3、Docker升级步骤
以升级14.5.3 -> 14.9.5 -> 14.10.5 -> 15.0.5 -> 15.1.4
为例
/data/gitlab/docker-compose.yml
version: "3"
services:
gitlab:
restart: always
image: gitlab/gitlab-ce:15.8.1-ce.0
container_name: gitlab
hostname: gitlab.example.com
ports:
- "8080:80"
- "2222:22"
volumes:
- '/data/gitlab/config:/etc/gitlab'
- '/data/gitlab/logs:/var/log/gitlab'
- '/data/gitlab/data:/var/opt/gitlab'
environment:
TZ: Asia/Shanghai
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://gitlab.example.com'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
1、备份数据和镜像
-
备份docker-compose整个目录
mkdir /data/gitlab-backup-20220805 cp -r /data/gitlab/ /data/gitlab-backup-20220805
-
备份docker镜像
docker save -o /data/gitlab-backup-20220805/gitlab-ce-14-5-3-ce.tar gitlab/gitlab-ce:14.5.3-ce.0
2、修改docker-compose文件中的镜像版本
# 14.5.3 -> 14.9.5
sed -i "s/image\: \'gitlab\/gitlab-ce:14.5.3-ce.0\'/image\: \'gitlab\/gitlab-ce\:14.9.5-ce.0\'/g" docker-compose.yml
# 14.9.5 -> 14.10.5
sed -i "s/image\: \'gitlab\/gitlab-ce:14.9.5-ce.0\'/image\: \'gitlab\/gitlab-ce\:14.10.5-ce.0\'/g" docker-compose.yml
# 14.10.5 -> 15.0.5
sed -i "s/image\: \'gitlab\/gitlab-ce:14.10.5-ce.0\'/image\: \'gitlab\/gitlab-ce\:15.0.5-ce.0\'/g" docker-compose.yml
# 15.0.5 -> 15.1.4
sed -i "s/image\: \'gitlab\/gitlab-ce:15.0.5-ce.0\'/image\: \'gitlab\/gitlab-ce\:15.1.4-ce.0\'/g" docker-compose.yml
3、重启容器
cd /data/gitlab
docker-compose up -d && docker-compose logs -f
4、检查后台迁移任务是否完成
必须确认后台迁移任务均为0时,才可以开始后续的下一个版本的升级
-
方式一:在Web页面的
管理中心–> 监控 –> 后台任务
中查看队列中的迁移任务 -
方式二:
-
GitLab EE > 14.0
gitlab-psql -c 'select job_class_name,table_name, column_name, job_arguments from batched_background_migrations where status <> 3;'
-
GitLab EE=12.9 < 14.0
gitlab-rails runner -e production 'puts Gitlab::BackgroundMigration.remaining'
-
参考:https://docs.gitlab.com/ee/update/index.html#batched-background-migrations
5、重复2~4步升级至指定版本
- 每一次替换升级,都需要容器重启至可访问,后台迁移任务检查为0时方可操作下一个版本的升级
6、验证
- 使用账号密码看是否能正常登陆?
- 本地使用git客户端看是否能正常拉取推送代码?
- 测试各个环境的gitlab runner,提交代码看pipeline能否正常运行和部署?
- 测试钉钉通知是否正常?
- 验证SonarQube是否可以通过Gitlab认证进行登录?
- 验证新增功能
7、启用新功能
# 进入容器
docker exec -it gitlab bash
# 进入GitLab Rails 控制台
gitlab-rails console -e production
# 执行命令以启动新功能
Feature.enable(:performance_analytics)
4、yum升级步骤
# wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-新版本-ce.0.el7.x86_64.rpm --no-check-certificate
# gitlab-rake gitlab:backup:create # 备份
# gitlab-ctl stop unicorn
# gitlab-ctl stop sidekiq
# gitlab-ctl stop nginx
# rpm -Uvh gitlab-ce-新版本-ce.0.el7.x86_64.rpm
# gitlab-ctl reconfigure
# gitlab-ctl restart
# gitlab-ctl restart postgresql # 可省略,根据提示执行,有时会提示重启redis
5、升级失败的处理
利用**备份数据文件
和镜像文件
**重新恢复最初状态
附部分漏洞:
一、背景介绍
1.1部分漏洞详细介绍:
(1)GitLab 远程代码执行漏洞(CVE-2022-2185)
GitLab 社区版(CE)和企业版(EE)中存在一个远程代码执行漏洞,经过身份验证的攻击者 通过利用该漏洞导入恶意项目,最终可实现在目标服务器上执行任意代码。
(2)GitLab 跨站脚本(XSS)漏洞(CVE-2022-2235)
GitLab 企业版(EE)存在一个 XSS 漏洞,经过身份验证的攻击者通过诱导用户点击特制的 恶意文件可以成功利用该漏洞。
(3)GitLab 存储型 XSS 漏洞(CVE-2022-2230)
GitLab 社区版(CE)和企业版(EE)的设置页面中存在一个存储型的 XSS 漏洞,拥有高权限 的攻击者利用该漏洞可导致以受害者的名义在 GitLab 中执行任意 JavaScript 代码。
(4)GitLab 授权不当漏洞(CVE-2022-2229)
GitLab 社区版(CE)和企业版(EE)的设置页面中存在一个授权不当漏洞,未经身份验证的 攻击者可在所属的公共项目或私人项目中提取出攻击者已知名称的,且未受保护变量的值。
1.2 漏洞编号
CVE-2022-2185
CVE-2022-2235
CVE-2022-2230
CVE-2022-2229
1.3 漏洞等级
高危
二、修复建议
2.1 受影响版本
CVE-2022-2185:
GitLab CE/EE 14.0 <14.10.5
GitLab CE/EE 15.0 <15.0.4
-GitLab CE/EE 15.1<15.1.1
CVE-2022-2235:
GitLab EE 14.5 < 14.10.5
GitLab EE 15.0 <15.0.4
GitLab EE 15.1 <15.1.1
CVE-2022-2230:
GitLab CE/EE 14.4 < 14.10.5
GitLab CE/EE 15.0 < 15.0.4
GitLab CE/EE 15.1 < 15.1.1
CVE-2022-2229:
GitLab CE/EE 13.7 < 14.10.5
GitLab CE/EE 15.0 < 15.0.4
GitLab CE/EE 15.1 < 15.1.1
评论区