gometalinter是一個(gè)go語言linter工具集,通過靜態(tài)代碼掃描,能夠找出代碼中潛在的問題。
專注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)紫云免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了1000+企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
現(xiàn)在打包應(yīng)用到 Docker Image 變的越來越普遍了,因此鏡像的安全性也變得越來越重要了;
很多人認(rèn)為只要打包成鏡像應(yīng)用就是安全的,但是大家也知道鏡像是一個(gè)靜態(tài)文件,由很多層組成,只要其中的一層發(fā)現(xiàn)漏洞,就會(huì)對(duì)你的應(yīng)用造成威脅;
現(xiàn)在也出現(xiàn)了很多開源的漏洞掃描工具,用來掃描鏡像中可能存在的漏洞,有 Anchore , Clair 和 Trivy
Anchore 是用 python 寫的,主要功能就是對(duì) Docker Image 的掃描,它是一個(gè) CLI 工具,當(dāng)然也可以通過 API 的方式調(diào)用; Anchore 也有一款帶有界面的 Anchore Enterprise 版本
Anchore Github
Clair 是用 Golang 寫的,主要實(shí)現(xiàn)了對(duì) Docker image 的漏洞分析,用戶可以調(diào)用它的 API 來掃描鏡像中的漏洞
Clair Github
Trivy 也是用 Golang 寫的,它不僅實(shí)現(xiàn)了對(duì) Image 的掃描,還可以掃描文件,Git 倉庫以及配置;它也是一個(gè) CLI 工具,安裝之后就可以通過命令實(shí)現(xiàn)掃描功能
Tricy Github
下面就用這三個(gè)掃描器分別對(duì) Docker 官方統(tǒng)計(jì)的常用鏡像掃描,掃描結(jié)果的對(duì)比如下:
Anchore 和 Clair 相比較 Trivy 出現(xiàn)的時(shí)間更早,但是掃描的結(jié)果發(fā)現(xiàn) Trivy 能發(fā)現(xiàn)更多的漏洞,尤其是對(duì) alphine 鏡像;現(xiàn)在大部分鏡像的基礎(chǔ)鏡像都會(huì)選擇 alpine ,因?yàn)樗虞p量級(jí)而且漏洞相對(duì)較少
而 Anchore 和 Clair 對(duì)一些 alpine 鏡像是掃描不出來漏洞的,但是使用 Trivy 卻能夠找到;之前部署的 Harbor 版本使用的掃描器是 Clair ,掃描 alphine 鏡像之后沒有發(fā)現(xiàn)漏洞,就認(rèn)為是安全的;現(xiàn)在 Harbor2.0 之后是使用 Trivy 作為默認(rèn)掃描器,對(duì)一些 alphine 就能夠掃描出來漏洞了
Trivy 相對(duì)于其他兩個(gè)來說,安裝更加的簡(jiǎn)單,使用也更加的方便;并且能夠支持多種類型的文件的掃描,目前也是 Harbor 默認(rèn)的掃描器
參考連接:
使用go語言遞歸查找指定目錄下的文件,根據(jù)正則匹配篩選出需要的文件,并且忽略指定的目錄
先使用 ioutil.ReadDir 遍歷出指定目錄下的文件,再遞歸進(jìn)目錄中遍歷,問題的關(guān)鍵在于識(shí)別出文件為目錄, fs.FileInfo 中有一個(gè) IsDir() 函數(shù)可以識(shí)別是否是目錄
正則匹配使用 regexp.MatchString ,regexp中有很多正則操作的工具,如根據(jù)正則替換字符串中的指定字符
最近在看左神新書 《Go 語言設(shè)計(jì)與實(shí)現(xiàn)》的垃圾收集器時(shí)產(chǎn)生一個(gè)疑惑,花了點(diǎn)時(shí)間搞清楚了記錄一下。
Go 語言垃圾回收的實(shí)現(xiàn)使用了標(biāo)記清除算法,將對(duì)象的狀態(tài)抽象成黑色(活躍對(duì)象)、灰色(活躍對(duì)象中間狀態(tài))、白色(潛在垃圾對(duì)象也是所有對(duì)象的默認(rèn)狀態(tài))三種,注意沒有具體的字段標(biāo)記顏色。
整個(gè)標(biāo)記過程就是把白色對(duì)象標(biāo)黑的過程:
1.首先將 ROOT 根對(duì)象(包括全局變量、goroutine 棧上的對(duì)象等)放入到灰色集合
2.選一個(gè)灰色對(duì)象,標(biāo)成黑色,將所有可達(dá)的子對(duì)象放入到灰色集合
3.重復(fù)2的步驟,直到灰色集合中為空
下圖是書上的插圖,看上去是一個(gè)典型的深度優(yōu)先搜索的算法。
下圖是劉丹冰寫的《Golang 修養(yǎng)之路》的插圖,看上去是一個(gè)典型的廣度優(yōu)先搜索的算法。
我疑惑的點(diǎn)在于這個(gè)標(biāo)記過程是深度優(yōu)先算法還是廣度優(yōu)先算法,因?yàn)楹芏辔恼虏┛蛯?duì)此都沒有很清楚的說明,作為學(xué)習(xí)者這種細(xì)節(jié)其實(shí)也不影響對(duì)整個(gè) GC 流程的理解,但是這種細(xì)節(jié)我非常喜歡扣:)
對(duì)著書和源碼摸索著大致找到了一個(gè)結(jié)果是深度優(yōu)先。下面看下大致的過程,源碼基于1.15.2版本:
gcStart 是 Go 語言三種條件觸發(fā) GC 的共同入口
啟動(dòng)后臺(tái)標(biāo)記任務(wù)
為每個(gè)處理器創(chuàng)建用于執(zhí)行后臺(tái)標(biāo)記任務(wù)的 Goroutine
上面休眠的 G 會(huì)在調(diào)度循環(huán)中檢查并喚醒執(zhí)行
執(zhí)行標(biāo)記
gcw 是每個(gè) P 獨(dú)有的所以不用擔(dān)心并發(fā)的問題 和 GMP、mcache 一樣設(shè)計(jì),減少鎖競(jìng)爭(zhēng)
嘗試在全局列表中獲取一個(gè)不為空的 buf
這是官方實(shí)現(xiàn)的無鎖隊(duì)列:)漲見識(shí)了,for 循環(huán)加原子操作實(shí)現(xiàn)棧的 pop
到這里從灰色集合中獲取待掃描的對(duì)象邏輯說完了。找到對(duì)象了接著就是 scanobject(b, gcw) 了,里面有兩段邏輯要注意
根據(jù)索引位置找到對(duì)象進(jìn)行標(biāo)色
嘗試存入 gcwork 的緩存中,或全局隊(duì)列中
無鎖隊(duì)列,for 循環(huán)加原子操作實(shí)現(xiàn)棧的 push
到這里把灰色對(duì)象標(biāo)黑就完成了,又放回灰色集合接著掃下一個(gè)指針。
Go 語言設(shè)計(jì)與實(shí)現(xiàn) 垃圾收集器
Golang三色標(biāo)記+混合寫屏障GC模式全分析