Разрешения
Разрешения можно использовать для управления тем, к каким системным ресурсам имеет доступ процесс 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 и включения инспектора среды выполнения.
$ 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'
}
2
3
4
5
6
7
8
Разрешить доступ к порождению процесса и созданию потоков 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
2
3
4
5
Разрешения файловой системы
Модель разрешений по умолчанию ограничивает доступ к файловой системе через модуль node:fs
. Она не гарантирует, что пользователи не смогут получить доступ к файловой системе другими способами, например, через модуль node:sqlite
.
Чтобы разрешить доступ к файловой системе, используйте флаги --allow-fs-read
и --allow-fs-write
:
$ node --permission --allow-fs-read=* --allow-fs-write=* index.js
Hello world!
2
Допустимые аргументы для обоих флагов:
*
— для разрешения всех операций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
обходит модель разрешений.
Ограничения и известные проблемы
- Символические ссылки будут следовать даже в места за пределами набора путей, к которым предоставлен доступ. Относительные символические ссылки могут обеспечить доступ к произвольным файлам и каталогам. При запуске приложений с включенной моделью разрешений необходимо убедиться, что ни один из путей, к которым предоставлен доступ, не содержит относительных символических ссылок.