写在前面

事情是这样的,今年疫情期间,我在某云购买了一套服务器,做什么呢?不是用来部署项目,也不是用来搭建网站,而是用来做代码备份和管理。没错,都是我个人的代码,也许你会说,你个人能有多少代码啊?确实不多,备份的都是我在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.zip
cd git-2.3.0

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

make prefix=/usr/local/git all
make prefix=/usr/local/git install

(4)添加环境变量

vim /etc/profile
export PATH=/usr/local/git/bin:$PATH
source /etc/profile

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

git --version
git version 2.3.0

(5)创建一个祼项目

git --bare init binghe.git

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

git clone root@192.168.0.147:/data/git-repository/binghe.git
cd 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-pack
ln -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-repository
git --bare init binghe.git
cd 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/install_from_binary

安装

解压之后目录:

运行

(1)前台运行

./gogs web

(2)后台运行

nohup ./gogs web &

默认端口:3000

初次访问http://: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 = true
HOST=smtp.qq.com:465
FROM=
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 -e
gogs_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)拷贝id_rsa.pub 内容至服务器~/.ssh/authorized_keys 中

重磅福利

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

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

写在最后

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

我搭建了一套企业级私有Git服务,抗住了每天上万次攻击!的更多相关文章

  1. 使用百度网盘配置私有Git服务

    GitHub上免费的版本只能开源代码库,有时候需要配置些私有的服务,不方便公开.现在免费的网盘的容量越来越大,可以用来做存储的服务,如果只使用网盘存储合并代码很不方便,所以使用网盘+git 配置私有仓 ...

  2. 通过用户名、密码提交的方式搭建私有git服务端

    1. 系统环境 centos git yum -y install git 2).创建属于自己的git库 mkdir /myGit git init --bare xiangyun.git 3). 添 ...

  3. gogs搭建git服务教程

    使用gogs搭建自己的git服务!!! 一.GIT服务器搭建方式 上一节课我们讲过GIT是一个分布式版本管理系统,既然是分布那么必定会涉及远程通信,那么GIT是采用什么协议进行远程通信的呢? git支 ...

  4. 使用Gogs搭建自己的Git服务--windows

    Gogs介绍 官方网站:传送门... 使用Gogs可以搭建一个自己的私有Git服务. 有时候我们有一些有些不想公开的私人小项目或者练习项目,源码想放在GitHub.码云(一直觉得这名字有点蹭知名度)这 ...

  5. 利用阿里云搭建私有Git服务器

    服务器系统:Centos 6 (查看centos版本命令:lsb_release -a) 客户端系统:Windows 7 一.服务器端安装Git ==通常centos上使用yum源安装的git版本过低 ...

  6. 私有git搭建

    Git简介(目前世界上最先进的分布式版本控制系统) 那什么是版本控制系统? 你可以把一个版本控制系统(缩写VCS)理解为一个特殊的“数据库”,在需要的时候,它可以帮你完整地保存一个项目的快照.当你需要 ...

  7. utils04_搭建私有Git服务器

    1.远程仓库实际上和本地仓库没啥不同,纯粹为了7x24小时开机并交换大家的修改.GitHub就是一个免费托管开源代码的远程仓库.但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给G ...

  8. Kubernetes-5:搭建企业级私有仓库Harbor

    搭建企业级私有仓库Harbor 安装需求 python版本 >= 2.7 Docker引擎版本 >= 1.10 docker-compose版本 >= 1.6.0 安装环境 一.Py ...

  9. 版本控制系统之基于httpd搭建私有git仓库

    在上一篇博客中,我们主要聊到了git的基本工作原理和一些常用的git命令的使用:回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13787701.html:今天我 ...

随机推荐

  1. css实现网页缩放时固定定位的盒子与版心一同缩放

    在网页设计过程中我们可能会出现这种情况:设置好一个固定定位的盒子,但是当网页缩放时固定定位的盒子与网页的版心分离 这是因为css定位中的固定定位是以页面为参照进行定位的,而不是以版心盒子为参照,那么我 ...

  2. linux 安装sftp

    1.定义sftp的数据目录 mkdir -p /data/sftp 2.将目录归到root用户,否则无法chroot chown root. -R /data/sftp/或者chown root:ro ...

  3. centos7上借助于xargs快速查询并卸载rpm软件

    在centos上卸载某些软件的时候,如果查询的软件包比较多,可以考虑使用xargs,边查询边卸载 如:下面在查询mysql包时候,将查询结果通过管道传送给xargs,然后使用rpm -e --node ...

  4. VUE 中引入百度地图(vue-Baidu-Map)

    1.安装 $ npm install vue-baidu-map --save 2.全局注册,在main.js中引入以下代码 import BaiduMap from 'vue-baidu-map' ...

  5. 8.hbase写入流程和读取流程

    1 hbase写入流程 hbase中无论是新增数据还是修改已有行,其内部流程都是一样的,hbase执行写入时会写到两个地方,write-ahead log 简称wal 也叫hlog 预写式日志 和 M ...

  6. 分块练习C. interval

    分块练习C. interval 题目描述 \(N\)个数\(a_i\),\(m\)个操作 \(1\). 从第一个数开始,每隔\(k_i\)个的位置上的数增加\(x_i\) \(2\). 查询\(l\) ...

  7. 做seo如何选择一个好的标题

    http://www.wocaoseo.com/thread-86-1-1.html 我们常说人要红妆马配鞍,那么对于seo来说,网站的标题也是很重要的,如何写好标题呢?只要注意以下几点就行了. 首先 ...

  8. spring-boot如何生成元数据与javaBean进行关联用作配置文件提示

    spring-boot如何生成元数据与javaBean进行关联用作配置文件提示 首先需要引入一个jar依赖包,以及一个maven plugin如下所示 <dependency> <g ...

  9. 跟我一起学.NetCore之中间件(Middleware)简介和解析请求管道构建

    前言 中间件(Middleware)对于Asp.NetCore项目来说,不能说重要,而是不能缺少,因为Asp.NetCore的请求管道就是通过一系列的中间件组成的:在服务器接收到请求之后,请求会经过请 ...

  10. 喵的Unity游戏开发之路 - 互动环境(有影响的运动)

    如图片.视频或代码格式等显示异常,请查看原文: https://mp.weixin.qq.com/s/Sv0FOxZCAHHUQPjT8rUeNw 很多童鞋没有系统的Unity3D游戏开发基础,也不知 ...