作者:京東零售 張夢雨
雲技術和我們的生活息息相關,日常生活中通路的網頁,刷的短視訊,用的雲盤等都是雲計算提供的服務。那在雲計算時代,前端可以做什麼呢?
一、雲技術與前端
在前端發展初期,前端隻需完成靜态頁面和互動的開發即可,然後将源檔案給後端部署;之後前後端分離,有了工程化的概念,前端需要自己去完成建構、打包、內建、部署,部署方式有通過CI/CD工具進行指令工具部署、Docker鏡像部署、平台化部署等。随着nodejs、跨端技術的快速發展,進入大前端時代,前端工程師也可以做全棧開發,需要了解學習的端和技術越來越多。
前後端分離後,各種前端架構層出不窮,百花齊放,随着三大架構的盛行以及前端工程化的成熟,各端分工更加明确,此時,雲計算在前端領域起到了很重要的作用,主要是可以在雲裡拿一些資源來支撐業務開發,比如各種工程化工具、開源庫等,實作代碼的共享,提高了開發效率。
二、前端開源庫
相信作為前端大家都使用過Vue、React等耳熟能詳的JavaScript架構,使用vue-cli、create-react-app等腳手架工具能快速的生成一個可獨立運作的Vue、React項目。因為它是可以獨立運作的,是以需要依賴NodeJS,NodeJS是一個基于Chrome V8引擎的JavaScript運作環境,它可以使JavaScript運作在服務端。說到NodeJS,不得不提NPM。
NPM,全稱Node Package Manager,是一個NodeJS包管理和分發工具,即包管理器,管理第三方依賴。它以多種方式自動處理項目依賴關系,提供了指令行工具,可以安裝、解除安裝、更新三方包,配置項目設定,運作腳本等等。目前主流的包管理工具有npm、yarn、pnpm等。npm是 2010 年釋出的nodejs依賴管理工具,yarn是 Facebook 于 2016 年 釋出的替代npm的包管理工具,pnpm是 2017 年釋出的一款替代npm包管理工具,具有速度快、節省磁盤空間的特點。
NPM是JavaScript運作時環境Node.js的預設包管理器。采用npm指令下載下傳三方包,下載下傳的包會在node_modules檔案夾中,可進行按需引入,實作了代碼共享。目前Github提供了很多開源NPM包,雖然用起來很友善,但是怎麼保證包的安全性是一個一直在探讨的問題。
前段時間,npm開源庫作者以反戰為名,在node-ipc庫中添加惡意代碼,代碼先是針對俄羅斯和白俄羅斯使用者IP,嘗試覆寫目前目錄、父目錄和根目錄的所有檔案,後改成了往桌面上寫個WITH-LOVE-FROM-AMERICA.txt 的宣言檔案。這個事件受到了開源圈強烈的譴責,造成了很不好的影響。該供應鍊投毒事件同時也暴漏了JS/node/npm生态的脆弱。該事件也對我們起了警示作用,怎麼避免開源庫的安全隐患顯得尤為重要。
三、開源庫使用安全指南
1. 避免下載下傳未知或不可信的包
在進行開源庫的選型時,需要檢查開源許可證,關注stars、 forks、 commit frequency、contributors 等相關名額,檢視包的安全政策。
2. npm ci 代替 npm install
npm ci和npm install的差別主要在于執行npm ci指令時,項目必須要有package-lock.json檔案,如果package-lock.json中的依賴與package.json中的依賴不比對時,則将退出并顯示錯誤,該指令不會更改
package-lock.json和package.json。是以,當我們進行CI(持續內建)/CD(持續部署)或生産釋出時,盡量使用npm ci,它會嚴格按照package-lock.json檔案中指定的包版本進行安裝,防止由于版本問題産生問題。
3. 安裝和使用npm包時,忽略運作腳本,最小化攻擊面
當使用的包有新版本更新時,不要盲目更新,在更新之前檢視下版本的更改日志、發行說明和代碼,關注其他人的使用體驗。在安裝軟體包時,確定添加–ignore-scripts 字尾以禁止第三方軟體包執行任何腳本。考慮将 ignore-scripts 添加到.npmrc 項目檔案或全局 npm 配置中。
4. 及時更新過時的依賴項
盲目更新包版本不可取,但是當包版本過時不去更新也會帶來一系列問題。npm outdated指令可以檢視哪些包已經過期了。其中黃色的依賴包對應package.json中指定的版本,紅色的依賴包表示有可用的更新。
5. 使用安全工具來掃描npm包
大家拿到項目之後執行npm install,之後将項目運作起來,幾乎沒人關注安裝了什麼。安全問題不容忽視,接下來介紹的幾個掃描工具能快速幫你識别項目中的依賴有哪些漏洞。比較常用的掃描工具有npm audit、yarn audit、snyk等。
(1)npm audit
是npm的官方檢查工具,npm6 新增的一個指令,漏洞資料來自于GitHub Advisory Database,npm audit 對第三方包的掃描依賴于 package.json 和 package-lock.json 檔案,如果沒有這兩個檔案會報錯。
注意:京東源不支援,需要切換其他源
nrm ls
nrm use npm 切換源
npm audit 生成安全報告
High/Low/Moderate/Critical:安全漏洞等級
Package:存在漏洞的包名稱
Dependency of: 目前工程直接依賴的包名稱
Path: 漏洞完整依賴路徑
More info: 漏洞詳情
npm audit fix 安全漏洞修複
自動修複風險庫,原理是更新依賴庫,将庫更新到已修複了該風險的版本号
npm audit fix --force 強制修複漏洞
對于非相容性的依賴包更新需要執行該指令,謹慎操作,可能會導緻項目不能運作。
npm audit --json 列印出一個詳細的json格式的安全報告,裡面有漏洞的詳情和修複政策
actions:包含所有漏洞的修複政策
"update"更新版本号
"install"修複直接依賴
"install major"強制更新依賴,跨越主版本
"review"不可自動修複,需要人工review
advisories: 包含所有漏洞的詳情
"cves":CVE漏洞編号
"severity":漏洞等級
"vulnerable_versions":受影響的版本
"patched_versions":已修複的版本
(2)yarn audit
yarn audit無法自動修複,需要執行yarn upgrade手動更新版本号
(3)synk
Snyk 是一家美國的網絡安全公司,它維護自己的開源漏洞資料庫,包含多語言,多個包管理工具的漏洞。
Snyk cli是一個開發者優先的,自動發現依賴包的安全漏洞的工具,幫助開發者們在開發階段就能查找、修複和監測代碼的脆弱性。
安裝: npm install -g snyk
授權: snyk auth
掃描:snyk test
6. 及時披露發現的漏洞
如果找到任何漏洞或安全問題,及時報告給npm社群并更新相關的npm包。
四、自建代碼庫使用安全指南
1. 不要把敏感資訊送出到NPM庫中
npm包釋出時會根據.gitignore 、.npmignore、package.json檔案中的"file"屬性決定要忽略掉那些檔案和要包括哪些檔案。.gitignore和.npmignore檔案兩者之間并不是疊加關系,而是替代關系。.npmignore檔案的優先級更高,會替掉.gitignore檔案的作用,建議使用.gitignore。送出時切記将敏感資訊登記在.gitignore中。最優的方案是使用package.json檔案中的"file"屬性來控制要包含的檔案,雖然比較麻煩,但是是最安全的做法。
2. 重要資料進行加密傳輸
五、常見的漏洞資料庫
1. CVE
CVE是通用漏洞披露(Common Vulnerabilities and Exposures) 的簡稱,是一個記錄常見漏洞的資料庫。CVE對每一個漏洞都會有一個專屬的編号,格式為CVE-YYYY-NNNNN。YYYY為漏洞披露年份,NNNNN為流水編号。
2. CNNVD
CNNVD 是中國國家資訊安全漏洞庫,于2009年10月18日正式成立。
3. NVD
NVD 是美國國家漏洞資料庫,建立于2000年。
以上為雲計算時代,前端如何保證開源代碼安全性的一些個人見解和看法,歡迎大家一起交流學習~