Spec-Zone.ru › Node.js 12 LTS

Политики

Устойчивость: 1 - Экспериментальная

Node.js содержит экспериментальную поддержку создания политик при загрузке кода.

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

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

Включение

Флаг --experimental-policy может использоваться для включения функций политик при загрузке модулей.

После его установки все модули должны соответствовать файлу манифеста политики, переданному в флаг:

node --experimental-policy=policy.json app.js

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

Для предотвращения вмешательства в файлы политики на диске, целостность самого файла политики может быть обеспечена с помощью --policy-integrity. Это позволяет запустить node и проверить содержимое файла политики, даже если файл изменен на диске.

node --experimental-policy=policy.json --policy-integrity="sha384-SggXRQHwCG8g+DktYYzxkXRIkTiEYWBHqev0xnpCxYlqMBufKZHAHQM3/boDaI/0" app.js

Функции

Поведение при ошибке

При сбое проверки политики Node.js по умолчанию выводит ошибку. Возможно изменить поведение при ошибке на одно из нескольких вариантов, определив поле «onerror» в манифесте политики. Доступны следующие значения для изменения поведения:

  • "exit": немедленно завершит процесс. Никакой код очистки не будет выполнен.
  • "log": запишет ошибку в месте возникновения сбоя.
  • "throw": вызовет ошибку JS в месте возникновения сбоя. Это значение по умолчанию.
{
  "onerror": "log",
  "resources": {
    "./app/checked.js": {
      "integrity": "sha384-SggXRQHwCG8g+DktYYzxkXRIkTiEYWBHqev0xnpCxYlqMBufKZHAHQM3/boDaI/0"
    }
  }
}

Проверка целостности

Файлы политики должны использовать проверки целостности с использованием строк Subresource Integrity, совместимых с атрибутом integrity браузера integrity attribute, связанным с абсолютными URL-адресами.

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

Пример файла политики, который разрешит загрузку файла checked.js:

{
  "resources": {
    "./app/checked.js": {
      "integrity": "sha384-SggXRQHwCG8g+DktYYzxkXRIkTiEYWBHqev0xnpCxYlqMBufKZHAHQM3/boDaI/0"
    }
  }
}

Каждый ресурс, указанный в манифесте политики, может иметь один из следующих форматов для определения его расположения:

  1. Строка относительного URL к ресурсу из манифеста, например ./resource.js, ../resource.js, или /resource.js.
  2. Полная строка URL-адреса ресурса, например file:///resource.js.

При загрузке ресурсов весь URL-адрес должен совпадать, включая параметры поиска и фрагмент хэша. ./a.js?b не будет использоваться при попытке загрузить ./a.js и наоборот.

Для генерации строк целостности можно использовать скрипт, например, printf "sha384-$(cat checked.js | openssl dgst -sha384 -binary | base64)".

Целостность может быть задана как логическое значение true для принятия любого тела ресурса, что может быть полезно для разработки локально. Не рекомендуется в рабочей среде, так как это позволит считать допустимым непредвиденное изменение ресурсов.

Перенаправление зависимостей

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

{
  "builtins": [],
  "resources": {
    "./app/checked.js": {
      "dependencies": {
        "fs": true,
        "os": "./app/node_modules/alt-os"
      }
    }
  }
}

Зависимости индексируются по запрошенному строковому спецификатору и имеют значения либо true, либо строку, указывающую на модуль, который будет разрешён.

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

Если значение перенаправления равно true, будут использоваться стандартные алгоритмы поиска модуля.

Если значение перенаправления — строка, она будет разрешена относительно манифеста, а затем немедленно использована без поиска.

Любой строковый спецификатор, который require() и не указан в зависимостях, приведёт к ошибке согласно политике.

Перенаправление не предотвратит доступ к API через методы, такие как прямой доступ к require.cache и/или через module.constructor, которые позволяют загружать модули. Перенаправление политики затрагивает только спецификаторы require(). Для блокирования доступа к API через переменные требуются другие методы.

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

Пример: Исправленная зависимость

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

const original = require('fn');
module.exports = function fn(...args) {
  console.time();
  try {
    return new.target ?
      Reflect.construct(original, args) :
      Reflect.apply(original, this, args);
  } finally {
    console.timeEnd();
  }
};

© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v12.x/docs/api/policy.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API