Harbor倉庫映象掃描原理
harbor倉庫中的映象掃描這個功能,看似很高大上,其實等你瞭解了它的底層原理與流程,你就會發現就是做了那麼一件事而已,用通俗的一句話概括,就是找到每個映象檔案系統中已經安裝的軟體包與版本,然後跟官方系統公佈的資訊比對,官方已經給出了在哪個系統版本上哪個軟體版本有哪些漏洞,比如Debian 7系統上,nginx 1.12.1有哪些CVE漏洞,通過對逐個安裝的軟體包比對,就能知道當前這個映象一共有多少CVE。當然,如果你是解壓版的,那就沒啥說的,這個跟windows類似,系統無法在控制皮膚識別。下面就harbor的具體流程進行簡單介紹,讓你對這個功能瞭如指掌。
在瞭解映象掃描之前,這裡先簡單說下映象的概念,映象就是由許多Layer層組成的檔案系統,重要的是每個映象有一個manifest,這個東西跟springboot中的一個概念,就是檔案清單的意思。一個映象是由許多Layer組成,總需要這個manifest檔案來記錄下到底由哪幾個層聯合組成的。要掃描分析一個映象,首先你就必須獲取到這個映象的manifest檔案,通過manifest檔案獲取到映象所有的Layer的地址digest,digest在docker映象儲存系統中代表的是一個地址,類似作業系統中的一個記憶體地址概念,通過這個地址,可以找到檔案的內容,這種可定址的設計是v2版本的重大改變。在docker hub儲存系統中,所有檔案都是有地址的,這個digest就是由某種高效的sha演算法通過對檔案內容計算出來的。
上圖中虛線框中的模組是harbor自身功能,Clair是coreos開源的一個系統,映象掃描分析工作主要由Clair完成,它具體的結構在下面再分析,這裡先側重分析harbor這塊流程。箭頭方向大致描述的是請求方向,系統之間互動可能產生多次請求。
1.UI向Job發起映象掃描請求,引數中包含了倉庫名稱以及tag
2.Job收到請求之後,向registry發起一個Head請求(/v2/nginx/manifest/v1.12.1),判斷當前映象的manifest是否存在,取出當前manifest的digest,這個digest是存放在響應頭中的Docker-Content-Digest。
3.Job把第2步獲取到的digest以及倉庫名、tag作為一條記錄插入job表中,job的狀態為pending。
這個時候Job系統則會新建一個掃描任務的job進行排程,這裡則涉及到一個狀態機處理流程。
4.Job系統通過manifest檔案獲取映象的所有Layer digest,針對每一層,封裝一個ClairLayer引數物件,然後根據層的數量,迴圈請求Clair系統,ClairLayer引數結構如下:
Name: sha256:7d99455a045a6c89c0dbee6e1fe659eb83bd3a19e171606bc0fd10eb0e34a7dc
Headers: tokenHeader,
Format: "Docker",
Path: http://registry:5000/v2/nginx/blobs/7d99455a045a6c89c0dbee6e1fe659eb83bd3a19e171606bc0fd10eb0e34a7dc
ParentName: a55bba68cd4925f13c34562c891c8c0b5d446c7e3d65bf06a360e81b993902e1
5.Clair系統收到請求之後,根據ParentName首先校驗父Layer是否存在,不存在則報錯。
下面詳細講解Clair漏洞分析流程。
1.下載映象層檔案
攜帶必要的headers發起對path的Get請求,得到的則是一個歸檔檔案,然後進行解壓。
2.探測映象作業系統
遍歷解壓後的檔案目錄,探測作業系統檔案路徑。 首先要了解各Linux發行版的一些基礎檔案,比如系統版本、安裝的軟體包版本記錄等檔案。
centos:etc/os-release,usr/lib/os-release
檢視檔案/etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
clair逐行解析該檔案,提取ID以及VERSION_ID欄位,最終把centos:7作為clair中的一個namespace概念。
2.探測映象已安裝的軟體包
上一步已經探測到了作業系統,自然可以知道系統的軟體管理包是rpm還是dpkg。
debian, ubuntu : dpkg
centos, rhel, fedora, amzn, ol, oracle : rpm
centos系統的軟體管理包是rpm,而debain系統的軟體管理是dpkg。
rpm:var/lib/rpm/Packages
dpkg:var/lib/dpkg/status
apk:lib/apk/db/installed
比如debian系統,從檔案/var/lib/dpkg/status檔案則可以探測到當前系統安裝了哪些版本的軟體。
Package: sed
Essential: yes
Status: install ok installed
Priority: required
Section: utils
Installed-Size: 799
Maintainer: Clint Adams <clint@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 4.4-1
Pre-Depends: libc6 (>= 2.14), libselinux1 (>= 1.32)
Description: GNU stream editor for filtering/transforming text
sed reads the specified files or the standard input if no
files are specified, makes editing changes according to a
list of commands, and writes the results to the standard
output.
Homepage: https://www.gnu.org/software/sed/
Package: libsmartcols1
Status: install ok installed
Priority: required
Section: libs
Installed-Size: 257
Maintainer: Debian util-linux Maintainers <ah-util-linux@debian.org>
Architecture: amd64
Multi-Arch: same
Source: util-linux
Version: 2.29.2-1+deb9u1
Depends: libc6 (>= 2.17)
Description: smart column output alignment library
This smart column output alignment library is used by fdisk utilities.
逐行解析檔案,提取Package以及Version欄位,最終獲取 libsmartcols1 2.29-1+deb9u1以及sed等
3.儲存資訊
把上面探測到的系統版本、以及系統上安裝的各種軟體包版本都存入資料庫。Clair系統已經獲取了各linux版本作業系統軟體版本,以及對應軟體版本存在的CVE。官方公佈了某個軟體在某個版本修復了哪個CVE,Clair只需要將當前映象中的軟體的版本與官方公佈的版本進行比較。比如官方維護的CVE資訊中公佈了nginx 1.13.1修復了漏洞CVE-2015-10203,那麼當前映象中包含的版本為1.12.1的nginx必然存在漏洞CVE-2015-10203,這些版本比較都是基於同一個版本的作業系統之上比較的。
Harbor的Job系統傳送完最後一層的請求之後,則會發起一個CVE分析結果的請求查詢,生成一個掃描結果的概覽儲存在資料庫中,主要是記錄當前映象發現了高風險漏洞多少個,中度風險多少個等。同時把job表中的狀態設定為finished,如果請求Clair發生任何錯誤,則會把job記錄設定為error。harbor頁面具體的漏洞詳細資料展示,還是通過UI系統呼叫Clair系統實時查詢。
本文來自雲棲社群合作伙伴“開源中國”
本文作者:kingfsen
相關文章
- 搭建Harbor 映象倉庫
- CentOS部署Harbor映象倉庫CentOS
- containerd 配置使用私有映象倉庫 harborAI
- Docker企業級映象倉庫HarborDocker
- 容器技術之Docker私有映象倉庫harborDocker
- harbor映象倉庫證書過期問題
- Harbor-私有映象倉庫的安裝部署
- Docker倉庫之Harbor企業級映象倉庫的搭建與使用Docker
- 容器映象倉庫-Harbor的安裝及踩坑
- Nydus 映象掃描加速
- 企業級映象倉庫 Harbor 的安裝與配置
- Harbor實現容器映象倉庫的管理和運維運維
- 容器安全之映象掃描
- Docker 企業級映象倉庫 Harbor 的搭建與維護Docker
- Ubuntu 22.04 LTS 離線安裝 Harbor v2.11 (附https認證,Trivy映象掃描)UbuntuHTTP
- 配置pod拉取harbor容器映象倉庫私有映象:secret儲存賬號密碼密碼
- Docker搭建Harbor私有倉庫Docker
- Harbor倉庫搭建及使用
- kubernetes實踐之二十八:使用Harbor作為私有映象倉庫
- Trivy 容器映象掃描工具學習
- 淺談埠掃描原理
- 使用Harbor作為Rainbond預設容器映象倉庫,擴充套件Rainbond映象管理能力AI套件
- Docker私有倉庫之Harbor神器Docker
- 微服務探索之路03篇-docker私有倉庫Harbor搭建+Kubernetes(k8s)部署私有倉庫的映象微服務DockerK8S
- Docker搭建私有倉庫Registry&HarborDocker
- docker的企業級倉庫-harborDocker
- Docker-------私有倉庫 Harbor 的搭建Docker
- 容器映象安全:安全漏洞掃描神器Trivy
- 私有化輕量級持續整合部署方案--06-私有映象倉庫-Harbor
- Centos7安裝docker倉庫HarborCentOSDocker
- Docker--harbor私有倉庫部署與管理Docker
- Git倉庫大掃除Git
- Git 倉庫大掃除Git
- kubernetes的Harbor映象私庫線上部署(二)
- Dokcer 的映象和倉庫
- Harbor企業級倉庫錯誤總結
- 手把手教你搭建Docker私有倉庫HarborDocker
- npm配置淘寶映象倉庫以及electron映象NPM