Защита вашего приложения Node.js

По умолчанию Node.js сам по себе достаточно безопасен. Хотя, безусловно, есть вещи, на которые стоит обратить внимание. Например, если ваше веб-приложение на Node начинает становиться все более и более популярным, вам нужно все больше и больше думать о безопасности, чтобы обеспечить безопасность данных ваших пользователей. Увидев несколько вопросов о безопасности Node.js в Интернете за последние несколько недель, я подумал, что было бы полезно написать краткое руководство о том, что вы можете сделать для защиты своих приложений. Многие, если не все,

По умолчанию Node.js сам по себе достаточно безопасен. Хотя, безусловно, есть вещи, на которые стоит обратить внимание. Например, если ваше веб-приложение на Node начинает становиться все более и более популярным, вам нужно все больше и больше думать о безопасности, чтобы обеспечить безопасность данных ваших пользователей.

Увидев несколько вопросов о безопасности Node.js в Интернете за последние несколько недель, я подумал, что было бы полезно написать краткое руководство о том, что вы можете сделать для защиты своих приложений.

Многие, если не все, из приведенных здесь предложений действительно легко реализовать и реализовать, и в основном они относятся к самому Node или его модулям. Поэтому я не буду рассказывать о таких вещах, как шифрование или аутентификация пользователя , что немного выходит за рамки этой статьи. Многие из приведенных здесь советов будут сосредоточены на веб-фреймворках Node, поскольку они обычно наиболее уязвимы для атак.

Не запускайте код с Sudo

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

Вместо этого найдите основную причину проблемы и найдите способ ее обойти, не подвергая риску всю систему.

Так, например, если вам нужно открыть порт 80 для веб-службы, но вы не можете этого сделать, поскольку вы работаете не под root, вам следует вместо этого использовать прокси, например Nginx, для пересылки запросов с порта 80 на любой другой порт вашей службы. на самом деле работает.

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

Избегайте eval любой ценой

Хорошо, я признаю это, иногда может возникнуть соблазн сделать ваш код более динамичным, позволив ему выполнять произвольный JavaScript с помощью eval , но поверьте мне, это плохая идея.

Некоторые люди даже пытаются использовать его, когда им лень разбирать вводимые пользователем данные. В конце концов, движок JavaScript V8 действительно хорош для анализа таких вещей, как простые математические операции, поэтому было бы заманчиво использовать это в своих интересах:

 var result = eval('(13 + (2 * 23.249) / 0.981)'); 
 // result = 60.398572884811415 

Есть слишком много способов снова укусить вас. Если вы не являетесь экспертом и не знаете, как защитить себя от всех видов вредоносного кода JavaScript, просто избегайте этого.

Вот простой пример эксплойта:

 var userInput = req.body.userInput; // User entered 'process.exit()' 
 var answer = eval(userInput); // App quits here 

Запуск этого кода завершит работу вашего приложения, что приведет к отказу в обслуживании (DOS) для ваших пользователей.

Добавить / удалить заголовки HTTP

Существует довольно много HTTP-заголовков, которые могут как помочь вам, так и навредить вам. Правильное использование правильных - непростая задача.

Express по умолчанию добавляет X-Powered-By: Express , который на самом деле ничего не делает, кроме как сообщает потенциальным злоумышленникам, какой веб-фреймворк вы используете, и, следовательно, как его использовать на основе широко известных уязвимостей. Чем больше у них будет информации о вашем стеке технологий, тем больше у них будет способов атаковать его.

Вот тут-то и пригодится шлем . Helmet - это небольшой модуль для Node, который помогает защищать приложения Express / Connect, добавляя / удаляя различные заголовки HTTP.

Вы можете сделать что угодно, от включения HSTS до предотвращения атак с использованием кликджекинга . Это вещи, которые практически не требуют никакой работы с вашей стороны, но они могут изменить мир к лучшему. Так что, если вы создаете приложение Express, это не должно быть проблемой (и действительно, для любой веб-службы вы должны это сделать).

Используйте утилиты сканирования, такие как Retire.js

Не все программисты являются экспертами в области безопасности, и хотя вы должны делать все возможное, чтобы быть в курсе распространенных эксплойтов, таких как XSS или SQL-инъекция, знать их всех сложно.

Чтобы исправить это, вы должны попробовать использовать такие инструменты, как Retire.js, который сканирует ваше приложение Node на наличие зависимостей, содержащих уязвимости.

Например, Ember.js имеет определенную уязвимость XSS в нескольких разных версиях ( CVE-2014-0046 ), каждая из которых проверяется Retire.js. При выполнении на retire в каталоге вашего проекта, он будет сравнить пакеты в node_modules в общедоступное хранилище уязвимостей и сообщить вам , какие из зависимостей являются небезопасными.

Во многих из этих пакетов слишком много уязвимостей, чтобы проверить себя, поэтому лучше позволить подобному инструменту сделать это за вас.

Вы можете легко сделать это частью своего рабочего процесса, интегрировав его с Grunt или Gulp, благодаря предоставленным плагинам. Подробности в README.

Другой вариант - просто запустить его в prepublish предварительной публикации, которая будет запущена до того, как npm отправит ваш пакет в репозиторий. Просто добавьте что-то вроде этого в свой package.json :

 { 
 "name": "myProject", 
 "version": "0.0.1", 
 "scripts": { 
 "prepublish": "retire", 
 } 
 } 

Будьте осторожны с модулем child_process

Как eval , используя spawn и exec из child_process модуля может быть очень полезным, но и очень опасно. Любой пользовательский ввод, который проникает в эти команды, может означать, что ваша система будет довольно быстро взломана (особенно если вы запускаете свое приложение с помощью sudo!).

Например, Image Magick - очень популярный инструмент командной строки для отображения, преобразования и редактирования изображений. В наши дни так много веб-приложений, использующих изображения, Image Magick часто используется в фоновом режиме для таких вещей, как обрезка и изменение размера. Чтобы использовать этот инструмент с Node, вы можете увидеть такой код:

 child = child_process.exec('convert ' + imageFilename + ' ' + imageFilename + '.bmp', ['-depth', '24'], function(err, stdout, stderr) { 
 console.log('Done'); 
 }); 

Это может выглядеть безобидным, но с тщательно созданным imageFilename вы можете выполнить любой код, который хотите, в оболочке.

exec следует использовать только в том случае, если он не зависит от ввода пользователя или если аргументы сильно обработаны. Еще лучше, проверьте npm на наличие библиотеки, которая является оболочкой для инструмента командной строки. Обычно они создаются с учетом такого рода безопасности или, по крайней мере, имеют больше внимания к коду, чтобы проверить наличие проблем. Для Image Magick доступно несколько модулей, например gm .

Понять уязвимости

Многие уязвимости в веб-приложениях относятся ко всем службам, независимо от используемого языка программирования и фреймворка. Хотя то, как вы атакуете эти службы, может отличаться в зависимости от используемого стека технологий. Чтобы лучше защитить себя, вам действительно нужно узнать, как работают эти эксплойты.

К счастью для вас, OWASP составляет список из 10 основных рисков для веб-приложений. Просмотрите их, а затем проведите тщательный анализ своего веб-сайта, чтобы узнать, применимы ли какие-либо из них к вам.

Еще лучше, проверьте NodeGoat , который представляет собой развертываемый веб-сайт, созданный OWASP и предназначенный для того, чтобы научить вас определять эти риски конкретно в приложениях Node. Нет лучшего способа изучить эти концепции, чем делать это самостоятельно.

Предлагаемое руководство проведет вас через все риски и покажет конкретные примеры того, как использовать уязвимости и защищаться от них. Например, вот видео, предоставленное OWASP, демонстрирующее, как внедрить JavaScript с помощью веб-формы:

Больше информации

Безопасность узлов - большая тема, поэтому было бы неразумно пытаться охватить все это здесь. Если вы хотите получить более подробную информацию, я бы посоветовал прочитать еще несколько ресурсов, например:

Заключение

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

К счастью, вы не единственный, кто сталкивается с этими проблемами, а это означает, что существует множество инструментов и ресурсов, созданных другими, чтобы помочь вам быстро и легко защитить свои приложения. Просто найдите время, чтобы найти NPM, задать вопросы на форумах или даже нанять эксперта. Однозначно стоит потраченных денег и времени!

Какими еще способами вы защищаете свои Node-приложения? Дайте нам знать об этом в комментариях!

comments powered by Disqus