Skip to content

Разрешения

Разрешения можно использовать для контроля доступа процесса Node.js к системным ресурсам или действий, которые процесс может выполнять с этими ресурсами.

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

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

Если вы обнаружите потенциальную уязвимость безопасности, обратитесь к нашей Политике безопасности.

Разрешения на основе процесса

Модель разрешений

[Stable: 2 - Stable]

Stable: 2 Стабильность: 2 - Стабильно.

Модель разрешений Node.js - это механизм ограничения доступа к определенным ресурсам во время выполнения. API доступен за флагом --permission, который, если он включен, ограничит доступ ко всем доступным разрешениям.

Доступные разрешения документированы флагом --permission.

При запуске Node.js с --permission возможность доступа к файловой системе через модуль fs, порождать процессы, использовать node:worker_threads, использовать собственные дополнения, использовать WASI и включать инспектор времени выполнения будет ограничена.

bash
$ node --permission index.js

Error: Access to this API has been restricted
    at node:internal/main/run_main_module:23:47 {
  code: 'ERR_ACCESS_DENIED',
  permission: 'FileSystemRead',
  resource: '/home/user/index.js'
}

Разрешение доступа к порождению процесса и созданию рабочих потоков можно выполнить с помощью --allow-child-process и --allow-worker соответственно.

Чтобы разрешить собственные дополнения при использовании модели разрешений, используйте флаг --allow-addons. Для WASI используйте флаг --allow-wasi.

Runtime API

При включении модели разрешений с помощью флага --permission в объект process добавляется новое свойство permission. Это свойство содержит одну функцию:

permission.has(scope[, reference])

API вызов для проверки разрешений во время выполнения (permission.has())

js
process.permission.has('fs.write'); // true
process.permission.has('fs.write', '/home/rafaelgss/protected-folder'); // true

process.permission.has('fs.read'); // true
process.permission.has('fs.read', '/home/rafaelgss/protected-folder'); // false

File System Permissions

Модель разрешений по умолчанию ограничивает доступ к файловой системе через модуль node:fs. Она не гарантирует, что пользователи не смогут получить доступ к файловой системе другими способами, например, через модуль node:sqlite.

Чтобы разрешить доступ к файловой системе, используйте флаги --allow-fs-read и --allow-fs-write:

bash
$ node --permission --allow-fs-read=* --allow-fs-write=* index.js
Hello world!

Допустимые аргументы для обоих флагов:

  • * - Разрешить все операции FileSystemRead или FileSystemWrite соответственно.
  • Пути, разделенные запятыми (,), чтобы разрешить только соответствующие операции FileSystemRead или FileSystemWrite соответственно.

Пример:

  • --allow-fs-read=* - Разрешит все операции FileSystemRead.
  • --allow-fs-write=* - Разрешит все операции FileSystemWrite.
  • --allow-fs-write=/tmp/ - Разрешит доступ FileSystemWrite к папке /tmp/.
  • --allow-fs-read=/tmp/ --allow-fs-read=/home/.gitignore - Разрешает доступ FileSystemRead к папке /tmp/ и пути /home/.gitignore.

Также поддерживаются подстановочные знаки:

  • --allow-fs-read=/home/test* разрешит доступ на чтение ко всему, что соответствует подстановочному знаку. Например: /home/test/file1 или /home/test2

После передачи символа подстановочного знака (*) все последующие символы будут игнорироваться. Например: /home/*.js будет работать аналогично /home/*.

При инициализации модели разрешений она автоматически добавляет подстановочный знак (*), если указанный каталог существует. Например, если /home/test/files существует, он будет рассматриваться как /home/test/files/*. Однако, если каталог не существует, подстановочный знак не будет добавлен, и доступ будет ограничен /home/test/files. Если вы хотите разрешить доступ к папке, которая еще не существует, обязательно явно включите подстановочный знак: /my-path/folder-do-not-exist/*.

Ограничения модели разрешений

Перед использованием этой системы необходимо знать следующие ограничения:

  • Модель не наследуется дочерним процессом узла или рабочим потоком.

  • При использовании модели разрешений следующие функции будут ограничены:

    • Native modules
    • Child process
    • Worker Threads
    • Inspector protocol
    • File system access
    • WASI
  • Модель разрешений инициализируется после настройки среды Node.js. Однако некоторые флаги, такие как --env-file или --openssl-config, предназначены для чтения файлов до инициализации среды. В результате такие флаги не подпадают под действие правил модели разрешений. То же самое относится и к флагам V8, которые можно установить во время выполнения через v8.setFlagsFromString.

  • OpenSSL engines нельзя запросить во время выполнения, когда включена модель разрешений, что влияет на встроенные модули crypto, https и tls.

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

  • Использование существующих дескрипторов файлов через модуль node:fs обходит модель разрешений.

Ограничения и известные проблемы

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