Разрешения
Разрешения можно использовать для управления тем, к каким системным ресурсам имеет доступ процесс Node.js и какие действия он может выполнять с этими ресурсами.
- Разрешения на уровне процесса управляют доступом процесса Node.js к ресурсам. Доступ к ресурсу можно полностью разрешить или запретить либо управлять связанными с ним действиями. Например, можно разрешить чтение файловой системы, запретив запись. Эта функция не защищает от вредоносного кода. Согласно политике безопасности Node.js, Node.js доверяет любому коду, который его просят выполнить.
Модель разрешений реализует подход «ремня безопасности», который предотвращает непреднамеренное изменение файлов или использование ресурсов доверенным кодом, если доступ к ним не был явно предоставлен. Она не обеспечивает гарантий безопасности при наличии вредоносного кода. Вредоносный код может обойти модель разрешений и выполнить произвольный код без ограничений, установленных этой моделью.
Если вы обнаружили потенциальную уязвимость безопасности, обратитесь к нашей политике безопасности.
Разрешения на уровне процесса
Модель разрешений
Модель разрешений Node.js — это механизм ограничения доступа к определённым ресурсам во время выполнения. API доступен при использовании флага --permission; после его включения доступ ко всем доступным разрешениям будет ограничен.
Доступные разрешения описаны в документации к флагу --permission.
При запуске Node.js с --permission будет ограничена возможность доступа к файловой системе через модуль fs, запуска процессов, использования node:worker_threads, использования нативных дополнений, использования WASI и включения инспектора среды выполнения.
$ 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'
} copy Доступ к запуску процессов и созданию потоков Worker можно разрешить с помощью флагов --allow-child-process и --allow-worker соответственно.
Чтобы разрешить нативные дополнения при использовании модели разрешений, укажите флаг --allow-addons. Для WASI используйте флаг --allow-wasi.
API среды выполнения
При включении модели разрешений с помощью флага --permission в объект process добавляется новое свойство permission. Это свойство содержит одну функцию:
permission.has(scope[, reference])
Вызов API для проверки разрешений во время выполнения (permission.has())
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 copy Разрешения файловой системы
По умолчанию модель разрешений ограничивает доступ к файловой системе через модуль node:fs. Она не гарантирует, что пользователи не смогут получить доступ к файловой системе другими способами, например через модуль node:sqlite.
Чтобы разрешить доступ к файловой системе, используйте флаги --allow-fs-read и --allow-fs-write:
$ node --permission --allow-fs-read=* --allow-fs-write=* index.js Hello world! copy
По умолчанию точки входа приложения включены в список разрешённых путей для чтения файловой системы. Например:
$ node --permission index.js copy
-
index.jsбудет включён в список разрешённых путей для чтения файловой системы
$ node -r /path/to/custom-require.js --permission index.js. copy
-
/path/to/custom-require.jsбудет включён в список разрешённых путей для чтения файловой системы. -
index.jsбудет включён в список разрешённых путей для чтения файловой системы.
Допустимые аргументы для обоих флагов:
-
*— чтобы разрешить все операции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/*.
Использование модели разрешений с npx
Если для выполнения скрипта Node.js вы используете npx, включить модель разрешений можно, передав флаг --node-options. Например:
npx --node-options="--permission" package-name copy
Это задаёт переменную окружения NODE_OPTIONS для всех процессов Node.js, запущенных командой npx, не затрагивая сам процесс npx.
Ошибка FileSystemRead при использовании npx
Приведённая выше команда, скорее всего, вызовет ошибку недопустимого доступа FileSystemRead, поскольку Node.js требуется доступ на чтение файловой системы, чтобы найти и выполнить пакет. Чтобы избежать этого:
-
Использование пакета, установленного глобально Предоставьте доступ на чтение к глобальному каталогу
node_modules, выполнив команду:npx --node-options="--permission --allow-fs-read=$(npm prefix -g)" package-name copy
-
Использование кэша
npxЕсли вы временно устанавливаете пакет или используете кэшnpx, предоставьте доступ на чтение к каталогу кэша npm:npx --node-options="--permission --allow-fs-read=$(npm config get cache)" package-name copy
Любые аргументы, которые обычно передаются в node (например, флаги --allow-*), также можно передать через флаг --node-options. Это позволяет легко настраивать разрешения по мере необходимости при использовании npx.
Ограничения модели разрешений
Перед использованием этой системы следует учитывать следующие ограничения:
- Модель не наследуется потоком Worker.
- При использовании модели разрешений будут ограничены следующие возможности:
- Нативные модули
- Дочерние процессы
- Потоки Worker
- Протокол инспектора
- Доступ к файловой системе
- WASI
- Модель разрешений инициализируется после настройки среды Node.js. Однако некоторые флаги, например
--env-fileили--openssl-config, предназначены для чтения файлов до инициализации среды. Поэтому на такие флаги правила модели разрешений не распространяются. То же относится к флагам V8, которые можно задать во время выполнения черезv8.setFlagsFromString. - При включённой модели разрешений движки OpenSSL нельзя запрашивать во время выполнения, что влияет на встроенные модули crypto, https и tls.
- При включённой модели разрешений нельзя загружать расширения, загружаемые во время выполнения, что влияет на модуль sqlite.
- Использование существующих дескрипторов файлов через модуль
node:fsпозволяет обойти модель разрешений.
Ограничения и известные проблемы
- Символические ссылки будут прослеживаться даже до расположений за пределами путей, для которых предоставлен доступ. Относительные символические ссылки могут открыть доступ к произвольным файлам и каталогам. Запуская приложения с включённой моделью разрешений, убедитесь, что в путях, для которых предоставлен доступ, нет относительных символических ссылок.
© 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-v22.x/docs/api/permissions.html