Linux环境下GitLab安全加固指南
通过防火墙限制GitLab服务器仅开放必要端口(HTTP 80、HTTPS 443),阻断非法IP访问。可使用iptables或ufw工具:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables-save > /etc/iptables.rules
sudo systemctl restart iptables
sudo apt install ufw
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
使用SSL/TLS证书加密数据传输,防止中间人攻击。可选择Let’s Encrypt免费证书或商业证书:
sudo apt install certbot python3-certbot-nginx # Debian/Ubuntu
sudo yum install certbot python2-certbot-nginx # CentOS/RHEL
sudo certbot --nginx -d gitlab.example.com # 替换为实际域名
/etc/gitlab/gitlab.rb,指定证书路径:external_url 'https://gitlab.example.com'
nginx['ssl_certificate'] = "/etc/letsencrypt/live/gitlab.example.com/fullchain.pem"
nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/gitlab.example.com/privkey.pem"
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
通过用户/组管理实现权限精细化:
替代密码认证,避免密码泄露风险:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
id_rsa.pub)添加至GitLab账户:
ssh -T git@gitlab.example.com
通过备份恢复因故障或攻击丢失的数据:
sudo gitlab-rake gitlab:backup:create
备份文件默认存储在/var/opt/gitlab/backups目录。cron设置每日定时备份(如凌晨2点):sudo crontab -e
添加以下内容:0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create
sudo gitlab-ctl cleanup
修复已知漏洞,降低安全风险:
sudo apt update && sudo apt list --upgradable | grep gitlab # Debian/Ubuntu
sudo yum check-update | grep gitlab # CentOS/RHEL
sudo apt install gitlab-ce=15.1.0-ce.0 # Debian/Ubuntu
sudo yum update gitlab-ce # CentOS/RHEL
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
设置复杂密码规则,防止弱密码攻击:
编辑/etc/gitlab/gitlab.rb,添加以下配置:
gitlab_rails['password_authentication'] = true # 启用密码认证
gitlab_rails['password_complexity'] = {
'min_length' => 12, # 最小长度12位
'require_lowercase' => true,
'require_uppercase' => true,
'require_numbers' => true,
'require_symbols' => false
}
gitlab_rails['account_lockout_after_multiple_failed_logins'] = 5 # 5次失败锁定账户
重载配置:
sudo gitlab-ctl reconfigure
防止敏感信息(如数据库凭证、API密钥)泄露:
.gitignore忽略敏感文件:在项目根目录添加.gitignore,排除敏感文件(如*.env、*.pem、config/database.yml)。.git/hooks/pre-receive中添加脚本,拒绝包含敏感信息的提交(如匹配password=、secret=的行)。对必须上传的敏感文件(如secrets.yml)进行加密:
ansible-vault或git-secret工具加密文件:gem install git-secret # 安装git-secret
git secret init # 初始化加密目录
git secret add secrets.yml # 添加敏感文件
git secret hide # 加密文件(生成secrets.yml.enc)
git secret tell user@example.com # 授权用户
git secret reveal # 解密文件
通过代码审查和合并请求(MR)流程降低安全风险:
main/master分支为受保护分支,仅允许Maintainer及以上角色推送代码、合并MR。Maintainer批准才能合并。追踪系统活动,快速响应安全事件:
/var/log/gitlab/目录(如gitlab-rails/production.log记录应用日志,nginx/access.log记录HTTP请求)。遵循“最小权限原则”,根据用户职责分配角色:
Developer角色(可推送代码、创建分支);Maintainer角色(可管理项目设置、合并MR);Owner角色(可添加成员、设置项目可见性)。通过分支保护规则防止未经授权的修改:
main分支,设置:
Maintainer及以上;Maintainer及以上;定期检查用户权限,确保符合当前业务需求:
Maintainer降级为Developer)。Maintainer需审核MR中的代码安全性),提高安全意识。