目 录CONTENT

文章目录

gitlab的安装与配置

简中仙
2023-02-14 / 0 评论 / 0 点赞 / 111 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文如有错误或者侵权的地方,欢迎您批评指正!

一、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_CONCURRENCYGITLAB_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、执行恢复

停掉unicornsidekiq

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
  • 而主版本升级,需要考虑版本是否可向后兼容与数据迁移,原则上先升级到当前主版本的最大次版本,然后在升级到下个主要版本最小次版本,依次往最新的版本进行升级

说明文档:

2、升级前准备

1、确定版本升级路径

可查看最新的版本升级路径文档:https://gitlab-com.gitlab.io/support/toolbox/upgrade-path/?

2、确定升级步骤

升级的步骤取决于Gitlab的部署方式

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

0

评论区