如何下降在 npm 模塊中發佈敏感信息的可能性

clipboard.png

簡評:國內也有很多在開源代碼裏泄露敏感數據的例子,這種事必定要當心啊。

目前 npm 上有着數十萬的包,而隱藏在這驚人數量之下的是更使人驚訝的敏感信息泄漏。包括 authentication tokens、密碼、生產測試數據(好比信用卡號碼)等等。git

做爲一個開發者,必定要避免泄漏相似的敏感數據。npm

npm publishjson

首先,咱們要理解 npm publish 的行爲,瞭解其如何選擇要上傳的文件對咱們控制發佈內容相當重要。固然,若是你想要了解最爲詳細的內容,能夠直接查看 npm documentation。安全

當執行 npm publish 命令時,npm 會打包當前目錄下的文件,同時會根據 .gitignore,.npmignore 和 package.json 中的 "files" 屬性來決定忽略掉哪些文件和要包括哪些文件。app

npm 老是會包含的文件:curl

  • package.json;
  • README ;
  • CHANGLOG;
  • LICENSE 或者另外一種拼寫 LICENCE。

npm 老是會忽略掉的文件:svn

  • .*.swp
  • ._*
  • .DS_Store
  • .git, hg , .svn, CVS 版本控制目錄
  • .npmrc
  • .lock-wscript
  • .wafpickle-*
  • config.gypi
  • npm-debug.log

.gitignore vs .npmignore
忽略某些文件最經常使用的作法之一就是在 .gitignore 文件中聲明。由於,這些你不想提交到倉庫的文件一般你也不會想把它們發佈出去。工具

npm 本身也有一個 .npmignore 文件,其行爲與 .gitignore 徹底同樣。而這二者並非疊加的關係,而是替代關係。若是你在項目中增長了 .npmignore,那麼其會徹底替代掉 .gitignore 的做用。所以,若是你嘗試兩個都使用的話,可能就會無心中發佈某些你認爲已經排除掉的文件。測試

所以,若是能夠的話最好堅持使用 .gitignore,但若是是用其餘的版本控制工具,那就使用 .npmignore 吧。網站

文件白名單

除了去控制哪些文件被排除,還能夠經過 package.json 中的 "files" 屬性來控制包含哪些文件 - whitelisting with the files array。目前只有 57,000 個包使用了這種方式來控制發佈的內容,雖然可能比較麻煩,但確實是最安全的作法。

若是這樣作,最終打包的文件將是 "files" 中聲明的文件加上上面提到的確定會包含的文件再減去被排除掉的文件。

使用只讀 tokens

若是你有私有包使用了持續集成(CI)服務,一般會須要提供一個 token 認證,來讓 CI 可以完成所需的工做。如今,你能夠生成一個只讀的 token 給 CI,若是其被泄漏了,形成的損害也會頗有限。

目前 npm 命令行還不支持這個功能,但咱們能夠手動生成:

curl -u [USERNAME]:[PASSWORD] https://registry.npmjs.org/-/npm/v1/tokens \
-X POST -H 'content-type: application/json' \
-d '{"password":"[USERNAME]", "readonly": "true"}'

能夠點擊 npm 網站中的我的頭像 -> Tokens 中檢查和刪除建立的 token。

clipboard.png

若是真的不幸泄露了敏感信息,怎麼辦?

首先你要明白模塊一旦發佈,基本立刻就會被複制到其餘的鏡像。要確保泄漏的信息不會形成損害最好的辦法就是立刻讓被泄漏的 API 祕鑰失效,或者立刻修改被泄露的密碼。

而若是泄露的信息不是你能修改的,那你的第一步應該是 unpublish the package 來減少損害,而後纔去任何適用於數據泄漏的其餘操做。但若是你想要 unpublish 的模塊已經發布超過了 24 小時,那就只能尋求 npm 支持團隊(support@npmjs.com)的幫助了。

總結

若是開發中真的有很敏感的信息,仍是建議用白名單來控制,不要嫌麻煩。由於 npm 的特性,一旦泄露基本很快就會被發現。

原文: Publishing what you mean to publish
相關文章
相關標籤/搜索