Как / почему npm рекомендует не работать от имени пользователя root? - PullRequest
53 голосов
/ 09 февраля 2011

Короче ...

Прежде всего, почему npm предполагает, что он должен работать только без полномочий root? Я очень не верю, что любой другой менеджер пакетов (apt, yum, gem, pacman) не подходит для требования sudo.

Во-вторых, когда я следую их предложению (и запускаю npm install как не-root), он не будет работать (потому что не-root не имеет разрешения на / usr / local / lib). Как мне следовать их предложению? Я не собираюсь chown -R $USER /usr/local/lib, потому что это кажется мне очень плохой идеей.

Полное описание ...

Я установил npm через curl http://npmjs.org/install.sh | sudo sh (инструкция в их README).

Когда я запускаю 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 mongoose без sudo, я получаю следующее:

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, а затем не работает, если я последую их совету.

Что приводит к моим начальным вопросам выше.

Ответы [ 3 ]

50 голосов
/ 15 февраля 2011

На самом деле, npm не рекомендует не запускаться от имени пользователя root. Ну, не больше.

Он изменился примерно в то же время, когда вы задали свой вопрос. Вот как README выглядел 7 февраля 2011 года: «Использование sudo с npm очень не рекомендуется. Любой может публиковать что угодно, а при установке пакетов могут запускаться произвольные сценарии». Это было объяснено позже более подробно. as "Вариант 4: СВЯТАЯ КОРОВА НЕ РЕКОМЕНДУЕТСЯ !! Вы можете просто использовать sudo все время для всего и игнорировать невероятно неприятные предупреждения, говорящие вам, что вы сошли с ума за это."

См .: https://github.com/isaacs/npm/tree/7288a137f3ea7fafc9d4e7d0001a8cd044d3a22e#readme

Теперь это на самом деле считается рекомендуемой техникой установки npm:

Простая установка - чтобы установить npm одной командой, сделайте следующее:

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

См .: https://github.com/isaacs/npm/tree/99f804f43327c49ce045ae2c105995636c847145#readme

Мой совет: никогда не делайте этого , потому что это в основном означает:

  1. выясните, что локальный DNS (или кто-либо другой подделывает ответ DNS или отравляет кеш DNS), является IP-адресом npmjs.org
  2. соединяется с незащищенным TCP с этим IP (или с тем, кто говорит, что это его IP) через порт 80
  3. доверяйте маршрутизатору, с которым, по вашему мнению, вы должны поговорить (или любой, кто дал вам ответ DHCP, сказал, что вы должны поговорить) для доставки пакетов на нужный хост
  4. возможно пройти через другой слой прозрачного кеширующего прокси
  5. доверяйте всем другим сетям между вами и другим концом TCP-соединения
  6. точно не знаю, с кем вы связаны
  7. скрестите пальцы
  8. запрос сценария install.sh по небезопасному HTTP без какой-либо проверки
  9. и затем запустите все, что было возвращено тем, с кем вы говорите, с максимальными привилегиями на вашем компьютере, даже не проверяя, что это такое.

Как вы можете видеть, это действительно, буквально, без преувеличения, давая root shell to все, что вы получаете после запроса сценария из Интернета по небезопасному соединению с нет подтверждения вообще . Здесь есть по крайней мере 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 должна быть опция.

Надеюсь, это поможет. Удачи!

20 голосов
/ 07 апреля 2014

Ответ прост: веб-серверы никогда не должны запускаться с правами 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 самостоятельно.

Чтобы получить доступ к двоичным файлам для узла и npm, измените переменные среды PATH в вашем ~ / .bashrc:

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

Затем для установки пакетов в этот каталог (глобальный), в отличие от текущего каталога (локального), всегда передают флаг -g (глобальный):

npm install -g someModule

ПРИМЕЧАНИЕ - вы ни разу не выполняете ничего npm или узла, связанного с root / sudo.

2 голосов
/ 24 августа 2018

Другая причина , а не установки пакетов NPM под root - это то, что вы столкнетесь с проблемой доступа к файлам с пакетами, которые используют node-gyp (например, node-sass), потому что он собирает библиотеки C ++ и они не находятся в локальной папке node_modules.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...