Как повысить безопасность приложений Node.js

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

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

1. Проверяйте введенные пользователем данные

Атаки на основе инъекций на протяжении многих лет снова и снова попадали в OWASP (Открытый проект безопасности веб-приложений) и SANS Top 25 CWE (Common Weakness Enumeration).

Соответственно, атаки на основе инъекций могут принимать разные формы; XSS, SQL-инъекции, инъекция заголовка хоста и инъекция команд ОС — вот несколько примеров таких атак.

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

Например, поле номера телефона должно принимать допустимый формат только с определенными цифрами и специальными символами.

2. Использование обратного прокси-сервера для повышения уровня безопасности

Разрешение доступа к веб-приложению через обратный прокси-сервер обеспечивает дополнительный уровень для фильтрации запросов до того, как они достигнут веб-приложения. Однако мы можем настроить этот уровень только для того, чтобы разрешить прием определенного количества запросов и гарантировать, что сервер не будет перегружен запросами.

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

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
 
server {
    location /login/ {
        limit_req zone=mylimit;
        
        proxy_pass http://my_upstream;
    }
}

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

3. Управление секретами приложений

Управление конфиденциальными секретами, такими как строки подключения к базе данных, ключи API и учетные данные, является обязательным в любом приложении. Поэтому мы должны любой ценой предотвратить хранение этих секретов в кодовой базе и использовать стандартные методы для их хранения.

Например, переменные среды в операционной системе могут хранить эту конфиденциальную информацию, и мы можем использовать Node.js для вызова этих переменных среды.

Однако бывают случаи, когда приложению требуется более одной инстанции переменной. В настоящее время лучшим способом управления секретами является использование пакета dotenv.

Библиотека dotenv имеет более 22 миллионов загрузок NPM в неделю, и вы можете легко установить ее с помощью npm или Yarn следующим образом:

# NPM
npm install dotenv

# Yarn
yarn add dotenv

Затем создайте файл .env в корне проекта и определите все секреты в этом файле.

host=awdoij3225kjbasd 
USERNAME=topsecret 
PASSWORD=definitelynotasecret

Наконец, вы можете потребовать и использовать эти секреты в приложении, как показано ниже:

require('dotenv').config();

db.connect({
  host: process.env.DB_HOST,
  username: process.env.DB_USER,
  password: process.env.DB_PASS
})

Самое главное, не забудьте включить файлы .env в файл .gitignore, чтобы предотвратить их отправку в репозиторий Git.

4. Использование заголовков ответа HTTP

Заголовок HTTP состоит из имени без учета регистра, за которым следует двоеточие (:), а затем его значение.

strict-transport-security:max-age=63072000
x-frame-options:DENY

Веб-серверы используют заголовки ответа HTTP для передачи дополнительной информации об ответе. Но они не связаны с содержанием сообщения. Эти заголовки HTTP указывают браузерам выполнять определенные операции или обрабатывать ответ в определенных режимах.

Теперь давайте посмотрим, как мы можем использовать эти заголовки HTTP для повышения безопасности приложений.

Строгая безопасность транспорта HTTP

Мы можем использовать заголовок ответа HTTP Strict Transport Security, чтобы гарантировать, что браузер использует только безопасное соединение HTTPS для взаимодействия с приложением. Этот заголовок HTTP-ответа помогает защититься от таких атак, как взлом файлов cookie и понижение версии протокола.

Strict-Transport-Security: max-age=31536000 ; includeSubDomains

Параметры X-Frame

Заголовок X-Frame Options предотвращает атаки кликджекинга, предписывая браузеру отображать содержимое внутри фреймов. Следующие параметры доступны с этим конкретным заголовком ответа HTTP:

X-Frame-Options: deny
X-Frame-Options: sameorigin
X-Frame-Options: allow-from: CUSTOM_DOMAIN

X-Content-Type-Options

Заголовок X-Content-Type-Options предотвратит изменение браузерами типов MIME, объявленных в заголовках Content-Type. Этот заголовок позволяет вам избежать прослушивания типов MIME, говоря, что типы MIME настроены преднамеренно.

X-Content-Type-Options: nosniff

5. Ведение журнала и мониторинг на стороне сервера

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

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

В следующем примере показано, как мы можем написать описательное сообщение журнала.

Incorrect Description: Service Failed, Not Working

Correct Description: Application worker service failed due to insufficient disk space, ensure that adequate disk space is available and restart the Application worker service.

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

Захват или хранение конфиденциальной информации в журналах приложений не рекомендуется. Это нарушение основных требований соответствия приложений, таких как PCI, GDPR и т. д. Однако могут быть сценарии, когда нам необходимо регистрировать такую ​​информацию. В таких случаях рекомендуется маскировать конфиденциальную информацию перед ее сбором и записью в журналы.

6. Использование линтеров безопасности, перехватывающих уязвимости в коде

Линтеры кода помогают разработчикам выявлять различные проблемы в коде перед компиляцией. Они могут обнаруживать наиболее распространенные проблемы и заставлять разработчиков следовать рекомендациям.

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

Создавайте компонуемые веб-приложения

Не создавайте веб-монолиты. Используйте Bit для создания и компоновки несвязанных программных компонентов — в ваших любимых фреймворках, таких как React или Node. Создавайте масштабируемые и модульные приложения с мощными и приятными возможностями разработки.

Перенесите свою команду в Bit Cloud, чтобы совместно размещать и совместно работать над компонентами, а также значительно ускорить, масштабировать и стандартизировать разработку в команде. Начните с компонуемых интерфейсов, таких как Design System или Micro Frontends, или исследуйте компонуемый сервер. Попробуйте →

Узнать больше









Не создавайте веб-монолиты. Используйте Bit для создания и компоновки несвязанных программных компонентов — в ваших любимых фреймворках, таких как React или Node. Создавайте масштабируемые и модульные приложения с мощными и приятными возможностями разработки.

Перенесите свою команду в Bit Cloud, чтобы совместно размещать и совместно работать над компонентами, а также значительно ускорить, масштабировать и стандартизировать разработку в команде. Начните с компонуемых интерфейсов, таких как Design System или Micro Frontends, или исследуйте компонуемый сервер. Попробуйте →

Узнать больше