什么是制品说庭?
制品是指由源碼編譯打包生成的二進(jìn)制文件裳涛,不同的開發(fā)語言對(duì)應(yīng)著不同格式的二進(jìn)制文件涮较;這些二進(jìn)制文件通常用于運(yùn)行在服務(wù)器上或者作為編譯依賴,“制品的管理”是配置管理的重要組成部分左刽。
通常襟雷,這些組件是各種文件的存檔刃滓,包括:類文件中的Java字節(jié)碼、C對(duì)象文件耸弄、文本文件咧虎、二進(jìn)制文件。組件的多種格式计呈,例如:Java JAR砰诵,WAR,EAR格式捌显;普通ZIP或.tar.gz文件茁彭;其他軟件包格式,例如NuGet軟件包扶歪,Ruby gems理肺,NPM軟件包;可執(zhí)行文件格式,例如.exe 或.sh 文件妹萨,Android APK文件年枕,各種安裝程序格式。
按照使用場(chǎng)景乎完,制品大致分為三類
- 外部引入的第三方組件
- 產(chǎn)品內(nèi)部依賴包熏兄,公共SDK
- 產(chǎn)品交付安裝包
按照開發(fā)語言,制品類型包含以下類型:
- Generic File 指的是通用文件類型的制品囱怕。
- Docker
- Maven
- npm
- PyPI
- Helm
- Composer
- NuGet
- Conan
為什么要制品管理霍弹?
- 外部依賴下載慢
- 影響研發(fā)構(gòu)建速度
- 版本管理混亂 (svn,ftp)
- 交付包使用FTP或者SVN進(jìn)行管理,管理粒度相對(duì)較粗娃弓;在這種粗放式的制品管理方式下典格,不同類型包的存儲(chǔ)與獲取是一件頭疼的事情,版本追蹤極其混亂台丛,團(tuán)隊(duì)協(xié)作也是障礙重重耍缴。
- 由于受到監(jiān)管約束,一鍵部署是不可能任務(wù)挽霉,跨網(wǎng)段的包交付智能依賴于手工拷貝
- 安全漏洞風(fēng)險(xiǎn)
- 依賴組件越多防嗡,引入漏洞的風(fēng)險(xiǎn)也越高
- 第三方依賴包下載管理混亂,沒有準(zhǔn)入管控
- 漏洞藏的越深侠坎,修復(fù)漏洞所花費(fèi)的時(shí)間就越長(zhǎng)
- 制品存儲(chǔ)風(fēng)險(xiǎn)
- 團(tuán)隊(duì)內(nèi)部搭建的制品庫是單點(diǎn)的蚁趁,缺乏集群部署
- 資源浪費(fèi)
- 因?yàn)闆]有統(tǒng)一的制品庫,存在重復(fù)建設(shè)的問題实胸;維護(hù)成本高他嫡,或者說目前根本就沒有維護(hù)
制品和CI/CD流水線
對(duì)于CI/CD流水線而言,制品起到一個(gè)承上啟下的關(guān)鍵作用庐完,它是持續(xù)集成CI的終點(diǎn)钢属,同時(shí)也是持續(xù)交付CD的起點(diǎn)。
如果缺乏有效的制品管理策略和工具门躯,根本不可能建立高效的流水線淆党;脫離制品管理,每次只能重新從代碼開始構(gòu)建讶凉,對(duì)于任何企業(yè)組織是不可接受的染乌,同時(shí)也不符合“一次構(gòu)建,多次使用”的原則懂讯。
在整個(gè)研發(fā)過程中慕匠,制品對(duì)于測(cè)試人員和運(yùn)維人員至關(guān)重要,他們關(guān)注的是怎么拿到需要的版本進(jìn)行測(cè)試和部署域醇,如果缺乏有效的制品管理,整個(gè)DevOps價(jià)值流就會(huì)出現(xiàn)銜接上的問題。你可能會(huì)碰到這種情況譬挚,測(cè)試同學(xué)會(huì)通過各種方式去詢問那個(gè)版本可以測(cè)試锅铅,包在哪里等情況。
包的元數(shù)據(jù)
何為包的元數(shù)據(jù)减宣?別人給你一個(gè)包盐须,你怎么知道包里包含了哪些需求缺陷變更,包含了哪些代碼提交漆腌,還有包的md5,hash等信息贼邓。這些信息對(duì)于測(cè)試人員追蹤問題的引入,后續(xù)改進(jìn)闷尿,版本回歸至關(guān)重要塑径,通俗點(diǎn)說,弄清楚制品的前世今生填具。
那么這些信息哪里來统舀?當(dāng)然是持續(xù)構(gòu)建CI流水線,需求劳景,代碼提交都可以通過CI流水線收集誉简。如果你的組織購買過Jfrog的產(chǎn)品,會(huì)發(fā)現(xiàn)這個(gè)特點(diǎn)在的它的平臺(tái)上尤為突出盟广。
制品的晉級(jí)
****在開發(fā)實(shí)踐中闷串,大多數(shù)團(tuán)隊(duì)會(huì)準(zhǔn)備DEV, TEST, UAT, RELEASE等不同的環(huán)境,相應(yīng)的建設(shè)不同的流水線筋量,將制品部署到不同的環(huán)境前都會(huì)對(duì)制品進(jìn)行不同的測(cè)試烹吵,所里這里也衍生出來了制品的晉級(jí),就是給制品設(shè)置不同的準(zhǔn)入門禁毛甲。
綜上所屬年叮,制品和CI/CD流水線有著緊密的聯(lián)系,不可分割玻募,在設(shè)計(jì)流水線時(shí)候要考慮好制品的使用場(chǎng)景只损。
制品管理工具
如上所述,由于制品管理的重要性七咧,所以衍生出來對(duì)應(yīng)的制品解決方案用來統(tǒng)一管理不同格式的軟件制品跃惫。 除了基本的存儲(chǔ)功能,還提供了版本控制艾栋、訪問控制爆存、安全掃描、依賴分析等重要功能蝗砾,最終建立“單一可信源”先较,是一種企業(yè)處理軟件開發(fā)過程中產(chǎn)生的所有包類型的標(biāo)準(zhǔn)化方式携冤。
目前主市場(chǎng)上主流的制品管理工具主要有以下幾種:
Nexus
Nexus是一套“開箱即用”的系統(tǒng)不需要數(shù)據(jù)庫,它使用文件系統(tǒng)加Lucene來組織數(shù)據(jù)闲勺。Nexus 使用ExtJS來開發(fā)界面曾棕,利用Restlet來提供完整的REST APIs,通過m2eclipse與Eclipse集成使用菜循。Nexus支持WebDAV與LDAP安全身份認(rèn)證翘地。
Nexus是少有的支持幾乎所有主流制品格式,并且提供免費(fèi)版的制品管理產(chǎn)品癌幕,這也是大多數(shù)中小公司的選擇衙耕,可以滿足大部分業(yè)務(wù)場(chǎng)景,但是勺远,免費(fèi)版不提供高可用方案橙喘。
價(jià)格參考: https://www.sonatype.com/products/pricing?topnav=true
由于Nexus在國(guó)內(nèi)沒有代理商,所以大家對(duì)它的認(rèn)知還有限谚中,其實(shí)Nexus僅僅是sonatype產(chǎn)品解決方案的一種渴杆,提供對(duì)軟件研發(fā)周期的制品管理方案。
Jfrog Artifactory
Jfrog是一家以色列公司宪塔,專注于制品管理環(huán)境磁奖,提供商用的解決方案,所以它的產(chǎn)品是要花錢的某筐。
下圖列出了Jfrog Artifactory和Nexus的產(chǎn)品特點(diǎn)對(duì)比比搭,僅供參考。既然是掏錢買的南誊,肯定比免費(fèi)的Nexus提供的支持和服務(wù)更多身诺,包括高可用,組件的漏洞風(fēng)險(xiǎn)分析抄囚,多地分發(fā)等等霉赡。不是說Nexus不行,而是我們大家用的大部分都是Nexus的免費(fèi)版幔托,其實(shí)它的收費(fèi)版也提供類似的方案穴亏。
Harbor
Harbor是VMware公司開源的企業(yè)級(jí)Docker Registry項(xiàng)目,其目標(biāo)是幫助用戶迅速搭建一個(gè)企業(yè)級(jí)的Docker registry服務(wù)重挑。
基于官方 Registry V2 實(shí)現(xiàn)嗓化,提供了管理UI,基于角色的訪問控制(Role Based AccessControl)谬哀,AD/LDAP集成刺覆、以及審計(jì)日志(Auditlogging) 等企業(yè)用戶需求的功能,通過添加一些企業(yè)必需的功能特性史煎,例如安全谦屑、標(biāo)識(shí)和管理等驳糯,擴(kuò)展了開源 Docker Distribution。
Harbor目前已經(jīng)成為私有Docker/Helm管理的主要工具伦仍,相比于Nexus, Harbor在docker鏡像的管理方面更有優(yōu)勢(shì)结窘,提供鏡像同步服務(wù),支持團(tuán)隊(duì)項(xiàng)目隔離充蓝。在實(shí)踐過程中,筆者發(fā)現(xiàn)Nexus在docker鏡像的團(tuán)隊(duì)隔離方面上喉磁,存在一些問題谓苟。
WePack
WePack是騰訊Coding基于之前的DevOps拆分出來的單獨(dú)的制品管理服務(wù),支持私有化部署协怒。也許也是看到單獨(dú)的制品管理工具涝焙,比大而全的DevOps平臺(tái)更好的切入用戶場(chǎng)景吧。
如何管理制品孕暇?
為了統(tǒng)一管理不同語言格式的包仑撞,以上制品管理工具幾乎都按照如下方式管理組織制品。
制品庫的層級(jí)關(guān)系為:倉庫 > 包 > 版本妖滔,每個(gè)層級(jí)描述如下:
- 倉庫:用于管理不同類型的倉庫和倉庫下的包資源隧哮,可以設(shè)置倉庫對(duì)外的訪問權(quán)限。
- 包:構(gòu)建產(chǎn)物對(duì)外提供訪問的基礎(chǔ)單元座舍,用于介紹當(dāng)前構(gòu)建產(chǎn)物的用途和使用指引沮翔。
- 版本:列出某個(gè)包下的所有構(gòu)建產(chǎn)物,詳細(xì)記錄了每次構(gòu)建產(chǎn)物的版本迭代更新變化曲秉。
規(guī)范制品庫命名
如果團(tuán)隊(duì)比較大一采蚀,對(duì)制品管理的要求不高,按照以上方式基本可以滿足需求承二。但是榆鼠,如果建設(shè)公司級(jí)別的需要規(guī)范一些命名,如下所示
制品版本號(hào)規(guī)范化
制品的版本號(hào)用于標(biāo)記特定制品亥鸠,通過規(guī)范化命名有助于自動(dòng)化腳本的編寫和流水線的復(fù)用妆够。
制品庫權(quán)限規(guī)范化
不管是基于開源工具,還是自研工具读虏,基于制品倉庫的權(quán)限設(shè)計(jì)也是必要的责静,做到團(tuán)隊(duì)產(chǎn)品的隔離。
開源制品的安全風(fēng)險(xiǎn)
對(duì)于制品的管理盖桥,大多人數(shù)都停留在僅僅是存儲(chǔ)灾螃,拉取使用的想法,筆者今年前也是這種思維揩徊。2021年末的Log4j2的安全事件腰鬼,引起了整個(gè)IT圈的軒然大波嵌赠,這個(gè)開源組件幾乎涉及所有的java應(yīng)用,每個(gè)公司不得不緊急排查自己產(chǎn)品是否引入該風(fēng)險(xiǎn)熄赡。
通過該事件姜挺,讓我們開始關(guān)注開源組件可能存在的風(fēng)險(xiǎn),這也是目前比較熱門的研發(fā)過程中的“供應(yīng)鏈安全”彼硫,也是DevSecOps其中重要的一個(gè)環(huán)節(jié)炊豪。
image
作為研發(fā)過程中的制品管理,引入階段的審核機(jī)制拧篮,使用中的安全词渤,越來越成為大家關(guān)注的熱點(diǎn)。如果所示串绩,組織需要引入組件審核制度缺虐,杜絕開發(fā)人員隨意的拉取互聯(lián)網(wǎng)的開源制品,并且建立實(shí)時(shí)的漏洞掃描機(jī)制礁凡,形成組織級(jí)的白名單倉庫高氮。
SBOM-軟件物料清單
現(xiàn)代軟件主要是使用第三方和開源組件組裝而成的,它們以復(fù)雜而獨(dú)特的方式融合在一起顷牌,并與原始代碼集成以實(shí)現(xiàn)所需的功能剪芍。除了通過在開源組件引入階段加入安全審核機(jī)制,IT企業(yè)往往也需要關(guān)注自己開發(fā)或使用的軟件產(chǎn)品的組成韧掩,像我們?cè)诔匈徺I食品時(shí)在食品包裝上看到的食品配料清單紊浩,標(biāo)注了所用的所有材料。
為了準(zhǔn)確摸清軟件所含組件的情況疗锐,SBOM(即:Software Bill Of Materials)應(yīng)運(yùn)而生坊谁,其包括多種關(guān)鍵信息,如:組件名稱滑臊、版本號(hào)口芍、供應(yīng)商等,這些關(guān)鍵信息在分析軟件安全時(shí)發(fā)揮著關(guān)鍵作用雇卷。通過這些信息鬓椭,可以追溯軟件的原始供應(yīng)鏈,極大提高開發(fā)者對(duì)其所用軟件安全風(fēng)險(xiǎn)的理解关划,幫助企業(yè)在網(wǎng)絡(luò)安全風(fēng)險(xiǎn)分析小染、漏洞管理和應(yīng)急響應(yīng)過程中提高效率。
對(duì)軟件開發(fā)企業(yè)而言贮折,SBOM可有效控制開源組件風(fēng)險(xiǎn)裤翩,幫助企業(yè)更早識(shí)別并消除開源組件安全缺陷和許可風(fēng)險(xiǎn);對(duì)軟件采購企業(yè)而言调榄,SBOM可幫助采購決策者輕松了解開發(fā)方軟件是否存在開源組件風(fēng)險(xiǎn)踊赠;對(duì)軟件開發(fā)人員而言呵扛,SBOM可幫助開發(fā)人員全面準(zhǔn)確掌握其所研發(fā)軟件的開源組件情況。
總結(jié)
- 制品管理是DevOps實(shí)踐過程中的重要環(huán)節(jié)筐带,起著承上啟下今穿,收集過程信息的重要角色;
- 于此同時(shí)伦籍,制品的引入使用會(huì)存在安全風(fēng)險(xiǎn)蓝晒,組織需要關(guān)注這一點(diǎn),避免類似Log4j2安全事件帶來的一系列風(fēng)險(xiǎn)鸽斟;
- 作為實(shí)踐者拔创,在制品的管理上需要結(jié)合組織和流水線需要,指定相應(yīng)的規(guī)范富蓄,避免混亂;
- 好的制品管理流程慢逾,可減少開發(fā)自測(cè)和測(cè)試人員進(jìn)行接收測(cè)試銜接過程中的低效溝通立倍;
這里僅僅是對(duì)制品管理做了全局的梳理,后續(xù)會(huì)對(duì)其中具體的知識(shí)點(diǎn)進(jìn)行詳細(xì)介紹侣滩。