Skip to content

Разрешения

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

  • Разрешения на основе процесса [/api/permissions#process-based-permissions] управляют доступом процесса Node.js к ресурсам. Ресурс может быть полностью разрешен или запрещен, или могут быть управляемы действия, связанные с ним. Например, чтение файловой системы может быть разрешено, а запись запрещена. Эта функция не защищает от вредоносного кода. В соответствии с Политикой безопасности Node.js, Node.js доверяет любому коду, который ему предложено запустить.

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

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

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

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

[Стабильно: 2 - Стабильно]

Стабильно: 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'
}

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

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

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

Разрешения файловой системы

Модель разрешений по умолчанию ограничивает доступ к файловой системе через модуль 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/\*.

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

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

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

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

    • Собственные модули
    • Дочерние процессы
    • Потоки Worker
    • Протокол инспектора
    • Доступ к файловой системе
    • WASI
  • Модель разрешений инициализируется после настройки среды Node.js. Однако некоторые флаги, такие как --env-file или --openssl-config, предназначены для чтения файлов до инициализации среды. В результате такие флаги не подчиняются правилам модели разрешений. То же самое относится к флагам V8, которые могут быть установлены во время выполнения с помощью v8.setFlagsFromString.

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

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

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

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

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