programing

npm은 루트로 실행하지 않는 것을 어떻게 / 왜 권장합니까?

javaba 2021. 1. 15. 19:09
반응형

npm은 루트로 실행하지 않는 것을 어떻게 / 왜 권장합니까?


간단히 말해서 ...

우선, npm 이 루트가 아닌 사용자로만 실행되어야한다고 제안하는 이유는 무엇입니까? 내가보기 엔 다른 모든 패키지 관리자 (즉 믿지 apt, yum, gem, pacman)는 sudo를 필요에 대한 잘못된 것입니다.

둘째, 내가 그들의 제안을 따를 때 (그리고 npm install루트가 아닌 사용자로 실행 하면) 작동하지 않을 것입니다 (루트가 아닌 사람은 / usr / local / lib에 대한 권한이 없기 때문입니다). 그들의 제안을 어떻게 따릅니 까? chown -R $USER /usr/local/lib에게 아주 나쁜 생각처럼 보이기 때문에 나는하지 않을 것이다 .

전체 설명 ...

(README의 지침)을 통해 npm설치 curl http://npmjs.org/install.sh | sudo sh했습니다.

실행할 때 sudo npm install mongoosenpm은 루트로 실행하지 말라고 알려줍니다.

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를 사용해서는 안된다는 것을 알려주고 그들의 제안을 따르면 작동하지 않습니다.

위의 초기 질문으로 이어집니다.


실제로 npm은 루트로 실행 하지 않는 것이 좋습니다. 더 이상은 아닙니다.

질문을했을 때와 거의 같은시기에 변경되었습니다. 다음은 2011 년 2 월 7 일 README의 모습입니다. "npm과 함께 sudo를 사용하는 것은 매우 권장하지 않습니다. 누구나 무엇이든 게시 할 수 있으며 패키지 설치는 임의의 스크립트를 실행할 수 있습니다." 나중에 "옵션 4 : HOLY COW NOT RECOMMENDED !! 모든 작업에 항상 sudo를 사용할 수 있으며,이 작업에 제정신이 아니라는 경고는 무시할 수 있습니다."로 자세히 설명되었습니다 .

참조 : https://github.com/isaacs/npm/tree/7288a137f3ea7fafc9d4e7d0001a8cd044d3a22e#readme

이제 실제로 권장되는 npm 설치 기술로 간주됩니다 .

단순 설치-하나의 명령으로 npm을 설치하려면 다음을 수행하십시오.

컬 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'를 사용하는 것은 일반적으로 개인 데이터에 액세스 할 수없는 다른 사용자로 실행하지 않는 한 일반적으로 덜 위험하지 않습니다.

You should use HTTPS connections if available to download such scripts so you could at least verify who you are talking to, and even then I wouldn't run it without reading first. Unfortunately npmjs.org has a self-signed certificate so it doesn't really help in this case.

Fortunately npm is available on GitHub that has a valid SSL certificate and from where you can download it using secure connection. See: github.com/isaacs/npm for details. But make sure that the npm itself doesn't use insecure connections to download the files that it downloads - there should be an option in npm config.

Hope it helps. Good luck!


The simple answer is web servers should never be run as root for well known security reasons, so this goes for npm commands as well.

To start fresh, remove prior Node.js and npm installs as well as these files/directories:

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

Solution: Install Node.js (which comes with npm) as NON root (no sudo)

Download Source Code directly from https://nodejs.org/en/download/

Execute the below as yourself (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

Feel free to change above export to whatever location is appropriate

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

which puts the binaries for Node.js and npm as well as its modules repository into $NODE_PARENT, a $USER owned dir which then allows you to issue subsequent npm install xxx commands as yourself.

To reach the binaries for node and npm alter your PATH environment variables in your ~/.bashrc:

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

Then to install packages into that directory (global), as opposed to the current directory (local) always pass in the -g flag (global):

npm install -g someModule

NOTE - at no time are you executing anything npm or node related as root / sudo.


Another reason for not installing NPM packages under root is that it will cause you to face file access problem with packages that are using node-gyp (ex: node-sass) because it builds C++ libs and those are not in the local node_modules folder.

ReferenceURL : https://stackoverflow.com/questions/4938592/how-why-does-npm-recommend-not-running-as-root

반응형