Как/почему npm не рекомендуется запускать как root?

Короче...

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

Во-вторых, когда я следую их предложению (и запускаю npm install как не-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 [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, а затем не работает, если я последую их предложению.

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

Ответ 1

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

Он изменился примерно в то же время, когда вы задали свой вопрос. Так выглядит README 7 февраля 2011 года: "Использование sudo с npm очень не рекомендуется. Любой может публиковать что угодно, а установки пакетов могут запускать произвольные скрипты". Это было объяснено позже более подробно как "Вариант 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

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

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

Как вы можете видеть, это действительно буквально без преувеличения, предоставляя корневой оболочке все, что вы получаете после запроса script из Интернета по небезопасному соединению без какой-либо проверки. Существует не менее 5 различных вещей, которые могут пойти не так, как здесь, любой из которых может привести к тому, что атакующий получает полный контроль над вашей машиной:

  • Подмена DHCP
  • ARP spoofing
  • Отравление кэша DNS
  • Подмена DNS-ответа
  • Захват сеанса TCP

Также обратите внимание, что использование "sh" вместо "sudo sh" обычно не менее опасно, если вы не запускаете его как другого пользователя, который не имеет доступа к вашим личным данным, что обычно не так.

Вы должны использовать HTTPS-соединения, если они доступны для загрузки таких скриптов, чтобы вы могли хотя бы проверить, с кем вы разговариваете, и даже тогда я не буду запускать его, не прочитав сначала. К сожалению, npmjs.org имеет самозаверяющий сертификат, поэтому в этом случае он действительно не помогает.

К счастью, npm доступен в GitHub, который имеет действительный сертификат SSL и откуда его можно загрузить с помощью безопасного соединения. См. Подробности: github.com/isaacs/npm. Но убедитесь, что сама npm не использует небезопасные подключения для загрузки загружаемых файлов - в конфигурации npm должна быть опция.

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

Ответ 2

Простым ответом является то, что веб-серверы никогда не должны запускаться как root для известных причин безопасности, поэтому это также относится к командам npm.

Чтобы начать новый, удалите предыдущий Node.js и npm installs, а также эти файлы/каталоги:

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 (no 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, измените переменные среды PATH в ~/.bashrc:

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

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

npm install -g someModule

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