当前位置:网站首页>Harbor webhook从原理到构建
Harbor webhook从原理到构建
2022-07-01 11:00:00 【huzai9527】
1. 什么是webhook
- 以下内容来自wiki


- 总结一下: webhook可以看作是一个钩子,例如当我们从harbor上拉取镜像时,harbor会将请求转换成一个可读的JSON格式,并且转发给webhook endpoint(钩子的实现)进行处理。下面就是harbor对pull请求的json概括,包括了镜像的具体信息,用户的具体信息以及项目信息等等。当endpoint拿到这些信息之后,就可以根据信息进行相关的操作。例如对pull的镜像进行恶意文件检查,如果检查不通过就阻止pull的操作。
{
"type":"PULL_ARTIFACT",
"occur_at":1656324256,
"operator":"admin",
"event_data":{
"resources":[
{
"digest":"sha256:f841a2abd0422364ec94bb633a56707a38c330179f2bbccebd95f9aff4a36808",
"tag":"sha256:f841a2abd0422364ec94bb633a56707a38c330179f2bbccebd95f9aff4a36808",
"resource_url":"10.9.33.98/library/[email protected]:f841a2abd0422364ec94bb633a56707a38c330179f2bbccebd95f9aff4a36808"
}
],
"repository":{
"date_created":1656315229,
"name":"java",
"namespace":"library",
"repo_full_name":"library/java",
"repo_type":"private"
}
}
}
2. harbor如何使用webhook
- 官方文档

- 就跟我上面总结的一样,webhook endpoint 根据 harbor 传过来的信息对镜像进行相关的扫描操作,最后根据扫描结果执行相关操作。
3. 如何开启harbor webhook
- harbor配置,在你的项目中选择webhook,直接配置就行,这里要注意endpoint地址是我们自己实现的一个httpserver。

- 在全局配置中开启webhook检测,在配置管理中的系统设置中

4. 构建一个webhook endpoint
- 这里的webhook endpoint实际上就是一个httpserver,这里我们使用gin构建一个httpserver,并将harbor穿过来的信息打印出来,这里只要看api即可
func main() {
r := gin.Default()
r.POST("/push_image", func(c *gin.Context) {
postData := &PushImage{
}
data, _ := ioutil.ReadAll(c.Request.Body)
fmt.Println("string => ", string(data))
if err := json.Unmarshal(data, &postData); err != nil {
fmt.Println(err)
}
fmt.Printf("ctx.Request.body: %s", postData.EventData.Resources[0].Digest)
})
r.POST("/pullimage", func(c *gin.Context) {
postData := &PullImage{
}
data, _ := ioutil.ReadAll(c.Request.Body)
if err := json.Unmarshal(data, &postData); err != nil {
fmt.Println(err)
}
fmt.Println("api TYPE => ", postData.Type)
fmt.Println("iamge name => ", postData.EventData.Resources[0].ResourceURL)
})
r.POST("/api", func(c *gin.Context) {
var body map[string]interface{
}
data, _ := ioutil.ReadAll(c.Request.Body)
if err := json.Unmarshal(data, &body); err != nil {
fmt.Println(err)
}
fmt.Println("body data => ", string(data))
for k, v := range c.Request.Header {
fmt.Println(k, v)
}
})
r.Run() // listen and serve on 0.0.0.0:8080
}
- 接下来启动server并从harbor中pull镜像,我们可以在server终端看到如下的信息

- 当然,我们也可以将请求的json转成go中的对象,然后从对象中获取信息
type PushImage struct {
Type string `json:"type"`
OccurAt int `json:"occur_at"`
Operator string `json:"operator"`
EventData struct {
Resources []struct {
Digest string `json:"digest"`
Tag string `json:"tag"`
ResourceURL string `json:"resource_url"`
} `json:"resources"`
Repository struct {
DateCreated int `json:"date_created"`
Name string `json:"name"`
Namespace string `json:"namespace"`
RepoFullName string `json:"repo_full_name"`
RepoType string `json:"repo_type"`
} `json:"repository"`
} `json:"event_data"`
}
type PullImage struct {
Type string `json:"type"`
OccurAt int `json:"occur_at"`
Operator string `json:"operator"`
EventData struct {
Resources []struct {
Digest string `json:"digest"`
Tag string `json:"tag"`
ResourceURL string `json:"resource_url"`
} `json:"resources"`
Repository struct {
DateCreated int `json:"date_created"`
Name string `json:"name"`
Namespace string `json:"namespace"`
RepoFullName string `json:"repo_full_name"`
RepoType string `json:"repo_type"`
} `json:"repository"`
} `json:"event_data"`
}

5. endpoint的结果如何反馈给用户
- 不同于
docker plugin, harbor webhook没有相关的authorization库,能够根绝扫描结果直接返回相关结果(允许/禁止),就像下面这样
func defaultAuthResponse() *authorization.Response {
return &authorization.Response{
Allow: true,
}
}
- 因此,如果需要进行相关的阻断操作,我们需要通过harbor的api来进行相关操作,其实上面的authorization库就是对docker api的封装,当时我还issue 了 harbor webhook的维护者


- 所以,总结一下,首先harbor 将操作请求转成json发送给webhook endpoint,然后enpoint进行相关检查,最后,enpoint可以根据检查结果调用harbor api进行相关操作,关于操作这一部分我还没有考虑好,所以没有示例,待续。。。
边栏推荐
- 爬虫(2) - Requests(1) | Requests模块的深度解析
- 个人商城二开逍遥B2C商城系统源码-可商用版/拼团拼购优惠折扣秒杀源码
- Export and import of incluxdb on WIN platform
- PHP有哪些优势和劣势
- 华为设备配置大型网络WLAN基本业务
- [MPC] ① quadratic programming problem matlab solver quadprog
- Addition, deletion, modification and query of database
- SQLAchemy 常用操作
- flutter path_ Provider: ^2.0.10 can get temporary directory
- 价值1000毕业设计校园信息发布平台网站源码
猜你喜欢

mysql如何把 一个数据库中的表数据 复制到 另一个数据库中(两个数据库不在同一个数据库链接下)

Oracle和JSON的结合

bash: ln: command not found

JS foundation -- data type

Recommend a JSON visualization tool artifact!

云上“视界” 创新无限 | 2022阿里云直播峰会正式上线

12款大家都在用的產品管理平臺

The first anniversary of the data security law, which four major changes are coming?

The list of winners of the digital collection of "century master" was announced
![[AI information monthly] 350 + resources! All the information and trends that can't be missed in June are here! < Download attached >](/img/62/562e93e66addc8e86c0a19bc514389.png)
[AI information monthly] 350 + resources! All the information and trends that can't be missed in June are here! < Download attached >
随机推荐
Development overview of fund internationalization
投稿开奖丨轻量应用服务器征文活动(5月)奖励公布
Crawler (2) - requests (1) | deep parsing of requests module
CRC 校验
【邂逅Django】——(二)数据库配置
CRC 校驗
Handling distributed transactions with powerful dbpack (PHP tutorial)
.NET 5.0+ 无需依赖第三方 原生实现定时任务
Huawei Equipment configure les services de base du réseau WLAN à grande échelle
Ask everyone in the group about the fact that the logminer scheme of flick Oracle CDC has been used to run stably in production
Export and import of incluxdb on WIN platform
The project bar on the left side of CodeBlocks disappears, workspace automatically saves the project, default workspace, open the last workspace, workspace (Graphic tutorial, solved)
prism journal导航按钮的可用性探索记录
dotnet 控制台 使用 Microsoft.Maui.Graphics 配合 Skia 进行绘图入门
Mobile hard drive reads but does not display drive letter
想请教一下,我在广州,到哪里开户比较好?现在网上开户安全么?
[.NET6]使用ML.NET+ONNX预训练模型整活B站经典《华强买瓜》
BAIC bluevale: performance under pressure, extremely difficult period
Suggest collecting | what to do when encountering slow SQL on opengauss?
CRC verification