Skip to main content

Запускайте Node.js как пользователь без полномочий root

Объяснение в один абзац

Согласно "Принципу наименьших привилегий" пользователь/процесс должен иметь доступ только к необходимой информации и ресурсам. Предоставление злоумышленнику корневого доступа открывает целый новый мир вредоносных идей, таких как маршрутизация трафика на другие серверы. На практике большинству приложений Node.js не требуется root-доступ и они не запускаются с такими привилегиями. Однако есть два распространенных сценария, которые могут подтолкнуть к использованию root:

  • чтобы получить доступ к привилегированному порту (например, порту 80), Node.js должен работать от имени пользователя root
  • Контейнеры Docker по умолчанию запускаются с правами root(!). Веб-приложениям Node.js рекомендуется прослушивать непривилегированные порты и полагаться на обратный прокси-сервер, такой как nginx, для перенаправления входящего трафика с порта 80 на приложение Node.js. При создании образа Docker приложения с высокой степенью защиты должны запускать контейнер с другим пользователем без полномочий root. Большинство Docker-кластеров (например, Swarm, Kubernetes) позволяют декларативно устанавливать контекст безопасности

Пример кода - Создание образа Docker без полномочий root

FROM node:latest

COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
USER node
CMD ["node", "server.js"]



Цитата из блога: "По умолчанию Docker запускает контейнер от имени root"

Из репозитория docker-node eyalzek:

По умолчанию Docker запускает контейнер с правами root, который внутри контейнера может представлять проблему безопасности. Вы хотели бы запускать контейнер как непривилегированный пользователь, где это возможно. Изображения узла предоставляют пользователю узла для такой цели. Затем Docker Image может быть запущен с пользователем узла следующим образом: "-u 'node'"



Цитата из блога: "Злоумышленник будет полностью контролировать вашу машину"

Из блога "Don't run Node.js as root" Olivier Lalonde:

Действительно, если вы используете свой сервер от имени root и он будет взломан из-за уязвимости в вашем коде, злоумышленник будет иметь полный контроль над вашей машиной. Это означает, что злоумышленник может уничтожить весь ваш диск или еще хуже. С другой стороны, если ваш сервер работает с разрешениями обычного пользователя, злоумышленник будет ограничен этими разрешениями.



Цитата из блога: "Если вам нужно запустить приложение на порту 80 или 443, вы можете сделать переадресацию портов"

Из блога "Developing Secure Node.js Applications  - A Broad Guide" Deepal Jayasekara:

Никогда не запускайте Node.js от имени root. Запуск node.js от имени root ухудшит ситуацию, если злоумышленник каким-то образом получит контроль над вашим приложением. В этом случае злоумышленник также получит права root, что может привести к катастрофе. Если вам нужно запустить приложение на порту 80 или 443, вы можете выполнить переадресацию портов с помощью iptables или разместить внешний прокси-сервер, такой как nginx или apache, который направляет запрос из порта 80 или 443 в ваше приложение.