热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GitLab最佳实践集成gitsecrets扫描敏感信息

随着互联网的快速发展,信息安全问题也变得越来越重要,对于代码仓库管理员来说,我们需要通过代码扫描工具防止开发者将企业系统中的账号密码和其他敏感信息提交到Git仓库。从而避免这些敏感信息泄露到互联

随着互联网的快速发展,信息安全问题也变得越来越重要,对于代码仓库管理员来说,我们需要通过代码扫描工具防止开发者将企业系统中的账号密码和其他敏感信息提交到Git仓库。从而避免这些敏感信息泄露到互联网。

AWS的git-secrets
(https://github.com/awslabs/git-secrets)。提供了一种扫描代码文件的方法。下面我分享一下我们项目组使用git-secrets的一些经验。

起初,我们要求所有开发在本地安装git-secrets工具,这样能使他们在commit/push代码的时候及时发现代码中是否存在敏感信息,若是存在则会阻止代码推送到Git服务器仓库。真的这样是一种很好的方式。但是在实施的过程中还是存在开发人员将敏感信息写在代码中,并且上传到GitHub(是的,最早我们没有自建代码仓库,使用了GitHub私有仓库)。

GitLab最佳实践 -- 集成git-secrets扫描敏感信息 - 文章图片

后来,我们搭建了私有GitLab,将GItHub代码仓库迁移到了GitLab。并且在GitLab服务器安装git-secrets。通过编写扫描脚本,定时扫描所有代码仓库,将扫描结果以邮件形式发送给所有开发人员。

def scan_all_repository():
root = "/var/opt/gitlab/git-data/repositories"
cmd = "find {} -name '*.git'".format(root)
status_code, output = subprocess.getstatusoutput(cmd)
result = []
if status_code == 0:
files = output.split("\n")
total = len(files)
for idx, name in enumerate(files):
if idx % 10 == 0:print("[{}] This is {}/{}".format(datetime.datetime.now(), idx, total))
os.chdir(name)
cmd = "git secrets --scan-history {}".format(name)
status_code, output = subprocess.getstatusoutput(cmd)
if status_code == 1:
result.append("****************************************************")result.append("name: {}".format(name))result.append(output)
print("[{}] Total: {}".format(datetime.datetime.now(), total))
return "\n".join(result)

这种方式也很好,但并不是最佳的做法,因为客户端始终可以将敏感信息提交到服务器的代码仓库。

最后,我们采用Git Hooks的方式,在GitLab服务器使用git-secrets。如果开发人员在客户端没有进行git-secrets扫描,我们在服务器进行git-secrets扫描。若是代码中存在敏感信息,将阻止客户端的push操作。

接下来我们详细介绍GitLab如何集成git-secrets。

Step1、进入服务器Gitlab Docker容器。安装git-secrets。

docker exec -it gitlab /bin/bash
apt-get -y update \
&& apt-get -y install build-essential \
&& git clone https://github.com/awslabs/git-secrets /var/opt/git-secrets \
&& cd /var/opt/git-secrets \
&& make install

GitLab最佳实践 -- 集成git-secrets扫描敏感信息 - 文章图片

GitLab最佳实践 -- 集成git-secrets扫描敏感信息 - 文章图片

Step2、编写Git Hooks脚本

# git-secrets.sh
#!/usr/bin/env bash
refname=$1
oldrev=$2
newrev=$3
echo "Executing git-secrets"
echo ""
# use git-secrets aws-provider git configuration
HOME=/opt/git-hooks
# add git-secrets to path
PATH=$PATH:/usr/local/bin
# handle empty repository
if [ "$oldrev" = "0000000000000000000000000000000000000000" ]; then
oldrev=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi
for i in $(git show $newrev:.gitallowed 2>/dev/null); do
git secrets --add --allowed $i;
done
exitcode='0'
FILES=`git diff --name-status $oldrev $newrev | awk '{print $2}'`
for filepath in $FILES; do
if [ "$filepath" = ".gitallowed" ]; then
echo "Skipping $filepath ..."
else
echo "Scanning $filepath ..."
fi
git show $newrev:$filepath | git secrets --scan -
result=$?
if [ "$result" != "0" ]; then
exitcode=$result
fi
done
if [ "$exitcode" != "0" ]; then
echo ""
echo "Listing configuration ..."
echo ""
git secrets --list
echo ""
echo "Please fix the above issues by running \`git reset HEAD~1\`, and encrypting the secrets."
echo ""
echo "To prevent committing secrets in the future, install git-secrets on your local machine."
echo " https://github.com/awslabs/git-secrets"
echo ""
echo "Add AWS configuration template to add hooks to all repositories you initialize or clone in the future."
echo " git secrets --register-aws --global"
echo ""
echo "Add hooks to all your local repositories."
echo " git secrets --install ~/.git-templates/git-secrets"
echo " git config --global init.templateDir ~/.git-templates/git-secrets"
echo ""
exit 1
fi

Step3、配置 gitconfig

# .gitconfig
[user]
name = GitLab
email = xxx
[core]
autocrlf = input
[gc]
auto = 0
[secrets]
providers = git secrets --aws-provider
patterns = [A-Z0-9]{20}
patterns = (\"|')?(AWS|aws|Aws)?_?(SECRET|secret|Secret)?_?(ACCESS|access|Access)?_?(KEY|key|Key)(\"|')?\\s*(:|=>|=)\\s*(\"|')?[A-Za-z0-9/\\+=]{40}(\"|')?
patterns = (\"|')?(AWS|aws|Aws)?_?(ACCOUNT|account|Account)_?(ID|id|Id)?(\"|')?\\s*(:|=>|=)\\s*(\"|')?[0-9]{4}\\-?[0-9]{4}\\-?[0-9]{4}(\"|')?
allowed = AKIAIOSFODNN7EXAMPLE
allowed = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

Step4、将上诉文件复制到指定目录。

cp .gitconfig /opt/git-hooks/
cp git-secrets.sh /opt/git-hooks/
chown -R git:git /opt/git-hooks

Step5、修改gitlab配置文件。

vim /etc/gitlab/gitlab.rb
gitlab_shell['custom_hooks_dir'] = 'opt/git-hooks'

最后,重启Gitlab。

docker restart gitlab

重启完成后,我们测试一下。

echo "AKIAIOSFODVERYSECRET wJalrXUtnFEMI/K7MDENG/bPxRfiCYVERYSECRET" > README.md
git add README.md
git commit -m "Test gitlab server side git-secrets"
git push origin master

GitLab最佳实践 -- 集成git-secrets扫描敏感信息 - 文章图片

如果您喜欢这篇文章,请考虑关注我。

长沙DevOps联盟 - 关注容器技术,K8S,自动化部署,基础设施架构。
GitLab最佳实践 -- 集成git-secrets扫描敏感信息 - 文章图片


推荐阅读
  • 解决github访问慢的问题的方法集锦
    本文总结了国内用户在访问github网站时可能遇到的加载慢的问题,并提供了解决方法,其中包括修改hosts文件来加速访问。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • 本文介绍了如何将CIM_DateTime解析为.Net DateTime,并分享了解析过程中可能遇到的问题和解决方法。通过使用DateTime.ParseExact方法和适当的格式字符串,可以成功解析CIM_DateTime字符串。同时还提供了关于WMI和字符串格式的相关信息。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • 本文介绍了win7系统休眠功能无法启动和关闭的解决方法,包括在控制面板中启用休眠功能、设置系统休眠的时间、通过命令行定时休眠、手动进入休眠状态等方法。 ... [详细]
  • 本文详细介绍了git常用命令及其操作方法,包括查看、添加、提交、删除、找回等操作,以及如何重置修改文件、抛弃工作区修改、将工作文件提交到本地暂存区、从版本库中删除文件等。同时还介绍了如何从暂存区恢复到工作文件、恢复最近一次提交过的状态,以及如何合并多个操作等。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 小程序wxs中的时间格式化以及格式化时间和date时间互转
    本文介绍了在小程序wxs中进行时间格式化操作的问题,并提供了解决方法。同时还介绍了格式化时间和date时间的互相转换的方法。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • Node.js学习笔记(一)package.json及cnpm
    本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
  • python中安装并使用redis相关的知识
    本文介绍了在python中安装并使用redis的相关知识,包括redis的数据缓存系统和支持的数据类型,以及在pycharm中安装redis模块和常用的字符串操作。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 原文链接:Python:获取“3年前的今天”的日期时间Python:getdatetimefor3yearsagotoday在Python中,如何获取3年前的今天的datetime ... [详细]
author-avatar
包子F3R
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有