Categories
程式開發

我搭建了一套企業級私有Git服務,抗住了每天上萬次攻擊!


寫在前面

事情是這樣的,今年疫情期間,我在某雲購買了一套服務器,做什麼呢? 不是用來部署項目,也不是用來搭建網站,而是用來做代碼備份和管理。 沒錯,都是我個人的代碼,也許你會說,你個人能有多少代碼啊? 確實不多,備份的都是我在GitHub上開源的個人作品。 為何做這個備份管理? 原因就是誰TM能保證某國哪天不會限制我們使用GitHub呢?

>

小伙伴們可以關注【冰河技術】微信公眾號,回复【Git】領取Git安裝包。

部署私有Git服務

說乾就乾,下單,付款一氣呵成,接下來就是搭建企業級的私有Git服務。 搭建完成後,沒想到搭建完成後的幾天,就被攻擊了。 額,MD這個云不安全啊,那換一個雲服務? 對於我這個有一定滲透經驗的人來說,還真不想換,我就想看看能不能抵禦這些攻擊。 於是乎,我仔細分析了這些攻擊的套路和規律,一步步完善了自己搭建的私有Git服務。 目前,每天已經能夠抗住上萬次攻擊了!

我搭建了一套企業級私有Git服務,抗住了每天上萬次攻擊! 1

在正式介紹如何搭建企業級私有Git服務之前,我們先來看看Git的四種通信協議。

Git四種通信協議

簡單來說Git的四種通信協議分別為:Local、SSH、HTTP、Git,如下所示。

我搭建了一套企業級私有Git服務,抗住了每天上萬次攻擊! 2

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 [email protected]:/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-pack

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服務,抗住了每天上萬次攻擊! 3

搭建企業級私有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

安裝

解壓之後目錄:

我搭建了一套企業級私有Git服務,抗住了每天上萬次攻擊! 4

運行

(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)點擊設置

我搭建了一套企業級私有Git服務,抗住了每天上萬次攻擊! 5

(2)開啟smtp

我搭建了一套企業級私有Git服務,抗住了每天上萬次攻擊! 6

郵件設置

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

我搭建了一套企業級私有Git服務,抗住了每天上萬次攻擊! 7

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

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)拷貝idrsa.pub 內容至服務器~/.ssh/authorizedkeys 中

重磅福利

微信搜一搜【冰河技術】微信公眾號,關注這個有深度的程序員,每天閱讀超硬核技術乾貨,公眾號內回复【PDF】有我準備的一線大廠面試資料和我原創的超硬核PDF技術文檔,以及我為大家精心準備的多套簡歷模板(不斷更新中),希望大家都能找到心儀的工作,學習是一條時而鬱鬱寡歡,時而開懷大笑的路,加油。 如果你通過努力成功進入到了心儀的公司,一定不要懈怠放鬆,職場成長和新技術學習一樣,不進則退。 如果有幸我們江湖再見!

另外,我開源的各個PDF,後續我都會持續更新和維護,感謝大家長期以來對冰河的支持! !

寫在最後

如果你覺得冰河寫的還不錯,請微信搜索並關注「 冰河技術」微信公眾號,跟冰河學習高並發、分佈式、微服務、大數據、互聯網和雲原生技術,「 冰河技術」微信公眾號更新了大量技術專題,每一篇技術文章乾貨滿滿! 不少讀者已經通過閱讀「 冰河技術」微信公眾號文章,吊打麵試官,成功跳槽到大廠;也有不少讀者實現了技術上的飛躍,成為公司的技術骨幹! 如果你也想像他們一樣提升自己的能力,實現技術能力的飛躍,進大廠,升職加薪,那就關注「 冰河技術」微信公眾號吧,每天更新超硬核技術乾貨,讓你對如何提陞技術能力不再迷茫!

我搭建了一套企業級私有Git服務,抗住了每天上萬次攻擊! 8