写点什么

我搭建了一套企业级私有 Git 服务,抗住了每天上万次攻击!

用户头像
冰河
关注
发布于: 2020 年 09 月 20 日
我搭建了一套企业级私有Git服务,抗住了每天上万次攻击!

写在前面


事情是这样的,今年疫情期间,我在某云购买了一套服务器,做什么呢?不是用来部署项目,也不是用来搭建网站,而是用来做代码备份和管理。没错,都是我个人的代码,也许你会说,你个人能有多少代码啊?确实不多,备份的都是我在 GitHub 上开源的个人作品。为何做这个备份管理?原因就是谁 TM 能保证某国哪天不会限制我们使用 GitHub 呢?

>

小伙伴们可以关注【冰河技术】微信公众号,回复【Git】领取 Git 安装包。


部署私有 Git 服务


说干就干,下单,付款一气呵成,接下来就是搭建企业级的私有 Git 服务。搭建完成后,没想到搭建完成后的几天,就被攻击了。额,MD 这个云不安全啊,那换一个云服务?对于我这个有一定渗透经验的人来说,还真不想换,我就想看看能不能抵御这些攻击。于是乎,我仔细分析了这些攻击的套路和规律,一步步完善了自己搭建的私有 Git 服务。目前,每天已经能够抗住上万次攻击了!



在正式介绍如何搭建企业级私有 Git 服务之前,我们先来看看 Git 的四种通信协议。

Git 四种通信协议


简单来说 Git 的四种通信协议分别为:Local、SSH、HTTP、Git,如下所示。



Local(本地协议)


基于本地文件系统或共享(NFS)文件系统进行访问,


优点 : 简单,直接使用了现有的文件权限和网络访问权限,小团队小项目建立一个这样的版本管理系统是非常轻松的一件事。


缺点: 这种协议缺陷就是本身共享文件系统的局限,只能在局域网,而且速度也慢。


适应场景: 小团队,小项目临时搭建版本服务。

本地协议使用方式


(1)从本地 f/git/atals 目录克隆项目


git clone /f/git/atals/
复制代码


即使是 bare 仓库也可以正常下载


git clone /f/git/atals.git
复制代码


(2)基于 file 协议克隆本地项目


git clone file:///f/git/atals/
复制代码


如果在 URL 开头明确的指定 file://,那么 Git 的行为会略有不同。 如果仅是指定路径,Git 会尝试使用硬链接(hard link)或直接复制所需要的文件。 如果指定 file://,Git 会触发平时用于网路传输资料的进程,传输过来的是打包好的文件,更节约硬盘空间。

SSH 协议


Git 支持支持利用 ssh 协议进行通信,这是绝大部分 linux、uninx 系统都支持的,所以利用该协议架设 GIT 版本服务是非常方便的。


优点: 首先 SSH 架设相对简单、其次通过 SSH 访问是安全的、另外 SSH 协议很高效,在传输前也会尽量压缩数据。


缺点: 权限体系不灵活,必须提供操作系统的帐户密码,哪怕是只需要读取版本。


适应场景: 小团队、小项目、临时项目

SSH 协议使用方式


这里我们把 Git 服务先安装到 Linux 系统上,然后才能使用 SSH 协议跟 Git 服务进行通信。

linux 安装 git 服务


(1)安装依赖环境


yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
复制代码


(2)下载并解压源码


wget https://github.com/git/git/archive/v2.3.0.zip
复制代码


如果大家觉得 GitHub 网速太慢的话,可以关注【冰河技术】微信公众号,回复【Git】领取 Git 安装包。


unzip v2.3.0.zipcd git-2.3.0
复制代码


(3)编译 安装(如果没有权限就加上 sudo)


make prefix=/usr/local/git allmake prefix=/usr/local/git install
复制代码


(4)添加环境变量


vim /etc/profileexport PATH=/usr/local/git/bin:$PATHsource /etc/profile
复制代码


如果成功显示版本号表示添加成功


git --versiongit version 2.3.0
复制代码


(5)创建一个祼项目


git --bare init binghe.git
复制代码


(6)本地基于远程克隆仓库


git clone root@192.168.0.147:/data/git-repository/binghe.gitcd binghe/
复制代码


(7)添加文件


echo "this is binghe" >> README.MD
复制代码


(8)本地添加、提交、并推送至远程


git add -A; git commit -am 'first commit'; git push;
复制代码


可能的错误:


git-upload-pack: command not found
复制代码


原因是 ssh 协议下只能访问/usr/bin 下的目录,解决办法如下:


ln -s /usr/local/git/bin/git-upload-pack /usr/bin/git-upload-packln -s /usr/local/git/bin/git-receive-pack /usr/bin/git-receive-pac\k
复制代码

HTTP 协议


Git http 协议实现是依懒 WEB 容器(apache、nginx)及 cgi 组件进行通信交互,并利用 WEB 容器本身权限体系进行授权验证。在 Git 1.6.6 前只支持 http Dumb 协议,该协议只能下载不能提交,通常会配合 ssh 协议一起使用,ssh 分配提交帐号,http dumb 提供只读帐号。1.6.6 之后 git 提供了 git-http-backend 的 CGI 用于实现接收远程推送等功能。


优点: 解决了 local 与 ssh 权限验证单一的问题、可基于 http url 提供匿名服务,从而可以放到公网上去。而 local 与 ssh 是很难做到这一点,必如实现一个类似 github 这样的网站。


缺点: 架设复杂一些需要部署 WEB 服务器,和 https 证书之类的配置


场景: 大型团队、需要对权限精准控制、需要把服务部署到公网上去

HTTP Dumb 配置与使用


(1)创建服务端版本仓库


cd /data/git-repositorygit --bare init binghe.gitcd binghe.git/hooks/mv 
复制代码


(2)版本更新钩子,当有版本提交的时候会执行更新


post-update.sample post-update./post-update
复制代码


Nginx 静态访问配置


server {    listen    80;    server_name git.tl.com;    location / {      root /data/git-repository;    }}
复制代码


(3)重命名钩子


mv hooks/post-update.sample hooks/post-update
复制代码


(4)本地克隆远程服务


git clone http://git.tl.com/binghe.git
复制代码


注: http Smart 协议 是基于 CGI 配合 GIT git-http-backend 脚本进行使用,配置较复杂,现在一般不会这么去做,而是采用 gitlab 、gogs 之类的 web 管理进行代替。

Git 协议


Git 协议是包含在 Git 里的一个特殊的守护进程;它监听在一个特定的端口(9418),类似于 SSH 服务,但是访问无需任何授权。


优点: 目前,Git 协议是 Git 使用的网络传输协议里最快的。 如果你的项目有很大的访问量,或者你的项目很庞大并且不需要为写进行用户授权,架设 Git 守护进程来提供服务是不错的选择。 它使用与 SSH 相同的数据传输机制,但是省去了加密和授权的开销。


缺点: Git 协议缺点是缺乏授权机制。 而且 9418 是一个非标准端口,一般防火墙不会开放。

Git 协议的使用


cd binghe.git/
复制代码


(1)创建一个空文件,表示开放该项目


touch git-daemon-export-ok
复制代码


(2)启动守护进程


nohub git daemon --reuseaddr --base-path=/data/git-repository/ /data/git-repository/ &
复制代码


(3)本地克隆远程项目


git clone git://192.168.0.147:9418/binghe.git
复制代码


看到这里,小伙伴们有点累了,来给大家看个妹子,稍后我们继续今天的重点:搭建企业级私有 Git 服务。


搭建企业级私有 Git 服务


这里,我们是基于 gogs 搭建的企业级 GIt 服务。

gogs 服务安装


Gogs 是一款开源的轻量级 Git web 服务,其特点是简单易用完档齐全、国际化做的相当不错。其主要功能如下:


  • 提供 Http 与 ssh 两种协议访问源码服务

  • 提供可 WEB 界面可查看修改源码代码

  • 提供较完善的权限管理功能、其中包括组织、团队、个人等仓库权限

  • 提供简单的项目 wiki 功能

  • 提供工单管理与里程碑管理。

下载安装


官网:https://gogs.io


下载:https://gogs.io/docs/installation 选择 linx amd64 下载安装


文档:https://gogs.io/docs/installation/installfrombinary


安装


解压之后目录:



运行


(1)前台运行


./gogs web
复制代码


(2)后台运行


nohup ./gogs web &
复制代码


默认端口:3000


初次访问 http://<host>:3000 会进到初始化页,进行引导配置。


可选择 mysql 或 sqlite 等数据。这里选的是 sqllite


注:mysql 索引长度的问题没有安装成功,需要用 mysql5.7 以上版本

gogs 基础配置


邮件配置说明:


邮件配置是用于注册时邮件确认,和找回密码时候的验证邮件发送。其配置分为两步:


(1)创建一个开通了 smtp 服务的邮箱帐号,一般用公司管理员邮箱。我这里用的是 QQ 邮箱。


(2)在{gogs_home/custom/conf/app.ini 文件中配置。

QQ 邮箱开通 smtp 服务


(1)点击设置



(2)开启 smtp


邮件设置


设置文件:{gogs_home}/custom/conf/app.ini


可以看到,我们配置的主要信息如下所示。


ENABLED = trueHOST=smtp.qq.com:465FROM=USER=PASSWD=
复制代码


  • ENABLED :是否启用邮件服务,true 表示启用邮件服务。

  • host 为 smtp 服务器地址,(需要对应邮箱开通 smtp 服务 且必须为 ssl 的形式访问)

  • from 发送人名称地址

  • user 发送帐号

  • passwd 开通 smtp 帐户时会有对应的授权码


重启后可直接测试,小伙伴们可以按照如下顺序进行测试。

管理员登录==》控制面版==》应用配置管理==》邮件配置==》发送测试邮件 gogs 定时备份与恢复


备份与恢复:


(1)查看备份相关参数


./gogs backup -h
复制代码


(2)默认备份,备份在当前目录


./gogs backup 
复制代码


(3)参数化备份 --target 输出目录 --database-only 只备份 db


./gogs backup --target=./backupes --database-only --exclude-repos
复制代码


(4)恢复。执行该命令前要先删除 custom.bak


./gogs restore --from=gogs-backup-20200920062712.zip
复制代码


(5)自动备份脚本


\#!/bin/sh -egogs_home="/home/apps/svr/gogs/"backup_dir="$gogs_home/backups"cd `dirname $0`
复制代码


(6)执行备份命令


./gogs backup --target=$backup_dir
复制代码


echo 'backup sucess'day=7
复制代码


(7)查找并删除 7 天前的备份


find $backup_dir -name '*.zip' -mtime +7 -type f |xargs rm -f;echo 'delete expire back data!'
复制代码


(8)添加定时任务 每天 4:00 执行备份


打开任务编辑器


crontab -e
复制代码


输入如下命令 00 04 * 每天凌晨 4 点执行 do-backup.sh 并输出日志至 #backup.log


00 04 * * * /home/apps/svr/gogs/do-backup.sh >> /home/apps/svr/gogs/backup.log 2>&1
复制代码


配置与添加客户端公钥


Git 配置


Git 安装完之后,需做最后一步配置。打开 git bash,分别执行以下两句命令


git config --global user.name “用户名”git config --global user.email “邮箱”
复制代码


Git 自动记住用户和密码操作


git config --global credential.helper store
复制代码


SSH 公钥创建


(1)打开 git bash


(2)执行生成公钥和私钥的命令:ssh-keygen -t rsa 并按回车 3 下


(3)执行查看公钥的命令:cat ~/.ssh/id_rsa.pub


(4)拷贝 idrsa.pub 内容至服务器~/.ssh/authorizedkeys 中

重磅福利


微信搜一搜【冰河技术】微信公众号,关注这个有深度的程序员,每天阅读超硬核技术干货,公众号内回复【PDF】有我准备的一线大厂面试资料和我原创的超硬核 PDF 技术文档,以及我为大家精心准备的多套简历模板(不断更新中),希望大家都能找到心仪的工作,学习是一条时而郁郁寡欢,时而开怀大笑的路,加油。如果你通过努力成功进入到了心仪的公司,一定不要懈怠放松,职场成长和新技术学习一样,不进则退。如果有幸我们江湖再见!


另外,我开源的各个 PDF,后续我都会持续更新和维护,感谢大家长期以来对冰河的支持!!

写在最后


如果你觉得冰河写的还不错,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 冰河技术 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 冰河技术 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 冰河技术 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!



发布于: 2020 年 09 月 20 日阅读数: 1940
用户头像

冰河

关注

公众号:冰河技术 2020.05.29 加入

Mykit系列开源框架发起者、核心架构师和开发者,《海量数据处理与大数据技术实战》与《MySQL开发、优化与运维实战》作者。【冰河技术】微信公众号作者。

评论 (4 条评论)

发布
用户头像
2020 年 09 月 23 日 14:40
回复
来,你发表一个?另外,攻防实战类的不让公开发表
2020 年 10 月 04 日 13:18
回复
用户头像
连https都没有,直接搭个http在外网,谈不上什么安全性。另外也没看出怎么防攻击了,攻击手段怎么都要说下吧。
2020 年 09 月 23 日 11:16
回复
搭个https也未必安全?攻防实战后续会更新到【冰河技术】微信公众号
2020 年 10 月 04 日 13:16
回复
没有更多了
我搭建了一套企业级私有Git服务,抗住了每天上万次攻击!