node.js - update - ubuntu install npm




npm如何/為什麼建議不以root身份運行? (2)

實際上,npm不建議不以root身份運行。 好了,不再了。

它在您提出問題的同時發生了變化。 這就是自述文件在2011年2月7日的樣子: “非常不推薦使用帶有npm的sudo。任何人都可以發布任何內容,包安裝可以運行任意腳本。” 稍後將更詳細地解釋為“選項4:無法推薦!我們可以一直使用sudo來處理所有事情,並忽略令人難以置信的令人討厭的警告,告訴你這樣做是瘋了。”

請參閱: https://github.com/isaacs/npm/tree/7288a137f3ea7fafc9d4e7d0001a8cd044d3a22e#readmehttps://github.com/isaacs/npm/tree/7288a137f3ea7fafc9d4e7d0001a8cd044d3a22e#readme

現在它實際上被認為是安裝npm的推薦技術:

簡單安裝 - 要使用一個命令安裝npm,請執行以下操作:

curl http://npmjs.org/install.sh | sudo sh

請參閱: https://github.com/isaacs/npm/tree/99f804f43327c49ce045ae2c105995636c847145#readmehttps://github.com/isaacs/npm/tree/99f804f43327c49ce045ae2c105995636c847145#readme

我的建議是永遠不要這樣做,因為它基本上意味著:

  1. 找出本地DNS(或任何欺騙DNS響應或中毒DNS緩存的人)說的是npmjs.org的IP地址
  2. 在端口80上連接不安全的TCP與該IP(或與誰說是他的IP)
  3. 相信您認為應該與之交談的路由器(或任何向您提供DHCP響應的人說您應該與之交談)將數據包傳遞給正確的主機
  4. 可能會通過另一層透明緩存代理
  5. 信任您和TCP連接另一端之間的所有其他網絡
  6. 不確定你與誰有聯繫
  7. 交叉你的手指
  8. 在不安全的HTTP上請求install.sh腳本,無需任何驗證
  9. 然後運行您正在與之交談的任何人返回的任何內容,並且無需檢查它是什麼。

正如你所看到的那樣,從字面上看,毫不誇張地說,在通過不安全的連接從互聯網上請求腳本而沒有任何驗證後, 你得到的任何東西都是 root shell 。 這里至少有5種不同的東西可能出錯,其中任何一種都可能導致攻擊者完全控制你的機器:

  1. DHCP欺騙
  2. ARP欺騙
  3. DNS緩存中毒
  4. DNS響應欺騙
  5. TCP會話劫持

另請注意,使用“sh”代替“sudo sh”通常風險不小,除非您將其作為無法訪問您的私人數據的其他用戶運行,通常情況並非如此。

您應該使用HTTPS連接(如果可用)下載此類腳本,這樣您至少可以驗證您正在與誰通話,即使這樣我也不會在沒有先讀取的情況下運行它。 不幸的是,npmjs.org有一個自簽名證書,因此在這種情況下它並沒有真正的幫助。

幸運的是,npm在GitHub上可用,它具有有效的SSL證書,您可以從中使用安全連接下載它。 有關詳細信息,請參閱:github.com/isaacs/npm。 但請確保npm本身不使用不安全的連接來下載它下載的文件 - 在npm config中應該有一個選項。

希望能幫助到你。 祝你好運!

簡而言之...

首先,為什麼npm建議它應該只作為非root運行? 我非常不相信所有其他包經理( aptyumgempacman )都不適合要求sudo。

其次,當我按照他們的建議(並以非root用戶身份運行npm install )時,它將無效(因為非root用戶沒有/ usr / local / lib的權限)。 我如何遵循他們的建議? 我不打算chown -R $USER /usr/local/lib ,因為這對我來說似乎是一個非常糟糕的主意。

詳細描述...

我通過curl http://npmjs.org/install.sh | sudo sh安裝了npm curl http://npmjs.org/install.sh | sudo sh (自述文件中的說明)。

當我運行sudo npm install mongoose ,npm告訴我不要以root身份運行它:

npm ERR! sudon't!
npm ERR! sudon't! Running npm as root is not recommended!
npm ERR! sudon't! Seriously, don't do this!
npm ERR! sudon't!

但是當我在沒有sudo的情況下運行npm install mongoose ,我得到以下內容:

npm info it worked if it ends with ok
npm info using [email protected]
npm info using [email protected]
npm info fetch http://registry.npmjs.org/mongoose/-/mongoose-1.0.7.tgz
npm info calculating sha1 /tmp/npm-1297199132405/1297199132406-0.7044695958029479/tmp.tgz
npm info shasum b3573930a22066fbf3ab745a79329d5eae75b8ae
npm ERR! Could not create /usr/local/lib/node/.npm/.cache/mongoose/1.0.7/package.tgz
npm ERR! Failed creating the tarball.
npm ERR! This is very rare. Perhaps the 'gzip' or 'tar' configs
npm ERR! are set improperly?
npm ERR!
npm ERR! couldn't pack /tmp/npm-1297199132405/1297199132406-0.7044695958029479/contents/package to /usr/local/lib/node/.npm/.cache/mongoose/1.0.7/package.tgz
npm ERR! Error installing [email protected]
npm ERR! Error: EACCES, Permission denied '/usr/local/lib/node/.npm/.cache/mongoose'
npm ERR! There appear to be some permission problems
npm ERR! See the section on 'Permission Errors' at
npm ERR!   http://github.com/isaacs/npm#readme
npm ERR! This will get better in the future, I promise.
npm not ok

所以它告訴我不應該使用sudo,如果我按照他們的建議那就行不通。

這導致了我上面的初步問題。


簡單的答案是,出於眾所周知的安全原因,Web服務器永遠不應該以root身份運行,因此這也適用於npm命令。

要重新開始,請刪除之前的Node.js和npm安裝以及這些文件/目錄:

mv ~/.npmrc       ~/.npmrc~prior
mv ~/.npm         ~/.npm~prior
mv ~/tmp          ~/tmp.~prior
mv ~/.npm-init.js ~/.npm-init.js~prior

解決方案:將Node.js(隨npm一起提供)安裝為NON root(無sudo)

直接從https://nodejs.org/en/download/下載源代碼

自己執行以下操作(Linux / OS X)

cd node-v8.1.2  # into expanded source dir

export NODE_PARENT=${HOME}/node-v8.1.2 # put this into your ~/.bashrc

隨意改變以上出口到任何適當的位置

./configure   --prefix=${NODE_PARENT}
make -j4   # for dual core ... use  -j8  for quad core CPU
make install

它將Node.js和npm的二進製文件以及它的模塊存儲庫放入$ NODE_PARENT,這是一個$ USER擁有的目錄,然後允許你自己發出後續的npm install xxx命令。

要獲取node和npm的二進製文件,請更改〜/ .bashrc中的PATH環境變量:

export PATH=${NODE_PARENT}/bin:${PATH}
export NODE_PATH=${NODE_PARENT}/lib/node_modules

然後將包安裝到該目錄(全局),而不是當前目錄(本地),總是傳入-g標誌(全局):

npm install -g someModule

注意 - 在任何時候你都不執行任何npm或與root / sudo相關的節點。





npm