Как для Node.js защитить process.env от чтения сторонними npm-пакетами?
Очень часто всякие настройки, например, подключение к базам данных, передаются как переменные окружения. Но любой сторонний скрипт может прочитать process.env. Как защититься от этого?
Cторонний скрипт может прочитать эти переменные и отправить себе: const env = JSON.stringify(process.env);
Хочется придумать способ не давать читать такие данные кому попало.
monochromer, в добавок к ответу Aves - используйте доверенные пакеты, а у недоверенных проверяйте исходники и форкайте.
А вообще - такие данные ничего не должны давать злоумышленнику. Та же база с конкретной парой логин-пароль должна иметь доступ только с определенных айпи, к примеру, и только на нужные ей базы и действия.
Alex Wells, а если у проекта 10 зависимостей, каждая их которых имеет 10 зависимостей, каждая из которых..., как проверить все эти исходники? Что если npm audit не поможет?
Alex Wells, Что значит "база должна иметь доступ с определенных айпи"? Грубо говоря, есть два сервера - на одном работает node-приложение, на другом - сервер базы данных и все, тут не супер-энтерпрайз. Node-приложение должно иметь доступ на все операции с данными. А как ограничивают действия?
monochromer, ну, у серверов статический ip, СУБД обычно поддерживают указание для пользователя его ip. Если правильный пользователь с правильным паролем входит с левого ip =401
monochromer, ну, собственно это и не есть супер-энтерпрайз. Любая SQL база так может, а монгой вообще нехрен себе забивать голову, имхо)) Но почему-то подозреваю, что и она тоже так может.
А на счет сервера с нодой - ну он же скорее всего и держит веб-сервер, а значит ему нужен статический айпи
jeruthadam, ну, предположение в том, что "доверенные" пакеты должны сами проверять пакеты, которые они используют, но да, другого выбора особо то и нет)
предположим в зависимости проекта попал зловредный скрипт evil.js
Свой прокси-репозиторий внешних пакетов + приватный репо для своего кода. Жестко фиксировать версии. Хранить package.lock в репозитории. Эти действия уже заметно уменьшают вероятность такого сценария. Ну и плюс серверы репозиториев умеют сканировать свои пакеты на наличие известных уязвимостей.
Ну и в контейнере свой код запускать, за основу контейнера опять же брать свой образ, а не какой-нить публичный ubuntu, и все это в приватном docker registry хранить.
jeruthadam, нет, не защищает. Он просто позволяет вместо ручного задания переменных в консоли занести их в файл. Обычно его используют, когда число переменных превышает 3-4 и есть большое число конфигураций - development, test, staging, production.