59

要するに...

まず第一に、なぜnpmはそれが非ルートとしてのみ実行されるべきであると示唆するのですか?私は、他のすべてのパッケージマネージャー( apt、、、)がsudoを要求するのは間違っていると信じています。yumgempacman

次に、私が彼らの提案に従うと(そしてnpm install非ルートとして実行すると)、それは機能しません(非ルートには/ usr / local / libへのアクセス許可がないため)。彼らの提案に従うにはどうすればよいですか?それは私にはchown -R $USER /usr/local/lib非常に悪い考えのように思われるので、私は行きません。

完全な説明...

(READMEの説明)を介して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!

しかし、npm install mongoosesudoを使用せずに実行すると、次のようになります。

npm info it worked if it ends with ok
npm info using npm@0.2.17
npm info using node@v0.4.0-pre
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 mongoose@1.0.7
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を使用するべきではないことを示しており、彼らの提案に従えば機能しません。

これが上記の私の最初の質問につながります。

4

3 に答える 3

50

実際、npmはrootとして実行しないことを推奨していません。まあ、もうありません。

それはあなたがあなたの質問をしたのとほぼ同時に変わった。2011年2月7日のREADMEの外観は次のとおりです。「npmでsudoを使用することはお勧めしません。誰でも何でも公開でき、パッケージのインストールでは任意のスクリプトを実行できます。」後で詳しく説明します。「オプション4:HOLY COWは推奨されません!!すべてにsudoを常に使用でき、これを行うのは非常識だという非常に不快な警告を無視できます。」

参照:https ://github.com/isaacs/npm/tree/7288a137f3ea7fafc9d4e7d0001a8cd044d3a22e#readme

現在、これは実際にnpmをインストールするための推奨される手法と見なされています。

簡単なインストール-1つのコマンドでnpmをインストールするには、次のようにします。

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

参照:https ://github.com/isaacs/npm/tree/99f804f43327c49ce045ae2c105995636c847145#readme

私のアドバイスは、基本的にこれを意味するので、決してそれをしないことです:

  1. ローカルDNS(またはDNS応答をスプーフィングしたりDNSキャッシュをポイズニングしたりする人)がnpmjs.orgのIPアドレスであると言っていることを確認してください
  2. ポート80でそのIP(または自分のIPだと言う人)を使用して安全でないTCPに接続する
  3. 適切なホストにパケットを配信するために、通信する必要があると思われるルーター(またはDHCP応答を提供した人が通信する必要があると言った人)を信頼します。
  4. 透過的なキャッシングプロキシの別のレイヤーを通過する可能性があります
  5. あなたとTCP接続のもう一方の端との間の他のすべてのネットワークを信頼する
  6. 誰とつながっているのかわからない
  7. 指を交差させる
  8. 検証なしで安全でないHTTPを介してinstall.shスクリプトを要求する
  9. そして、あなたが話している人から返されたものは何でも、それが何であるかをチェックすることさえせずに、あなたのマシン上で最大の特権で実行します。

ご覧のとおり、これは実際には文字通り、検証なしで安全でない接続を介してインターネットからスクリプトを要求した後に取得したものにルートシェルを与える誇張ではありません。ここで問題が発生する可能性のあるものは少なくとも5つあり、いずれも攻撃者がマシンを完全に制御する可能性があります。

  1. DHCPスヌーピング
  2. ARPスプーフィング
  3. DNSキャッシュポイズニング
  4. DNS応答のなりすまし
  5. TCPセッションハイジャック

また、「sudo sh」の代わりに「sh」を使用しても、個人データにアクセスできない別のユーザーとして実行しない限り、通常はリスクが少なくなることにも注意してください。通常はそうではありません。

そのようなスクリプトをダウンロードするために利用可能な場合はHTTPS接続を使用する必要があります。そうすれば、少なくとも誰と話しているのかを確認できます。それでも、最初に読んでいないと実行できません。残念ながら、npmjs.orgには自己署名証明書があるため、この場合はあまり役に立ちません。

幸い、npmは有効なSSL証明書を持つGitHubで利用でき、そこから安全な接続を使用してダウンロードできます。詳細については、github.com / isaacs/npmを参照してください。ただし、npm自体が安全でない接続を使用してダウンロードするファイルをダウンロードしないようにしてください。npmconfigにオプションがあるはずです。

それが役に立てば幸い。幸運を!

于 2011-02-15T02:42:42.903 に答える
21

簡単な答えは、よく知られているセキュリティ上の理由から、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ルート(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が所有するディレクトリであり、後続のnpminstallxxxコマンドを自分で発行できます。

nodeとnpmのバイナリに到達するには、〜/.bashrcのPATH環境変数を変更します。

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

次に、現在のディレクトリ(ローカル)ではなく、そのディレクトリ(グローバル)にパッケージをインストールするには、常に-gフラグ(グローバル)を渡します。

npm install -g someModule

注-root/sudoとして関連するnpmまたはノードを実行することはありません。

于 2014-04-07T03:25:10.040 に答える
2

ルートの下にNPMパッケージをインストールしないもう1つの理由は、C ++ライブラリをビルドし、ローカルnode_modulesフォルダーにないため、node-gyp(例:node-sass)を使用しているパッケージでファイルアクセスの問題が発生することです。

于 2018-08-24T01:09:48.300 に答える