Разрешения
Разрешения можно использовать для контроля доступа процесса 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 и включать инспектор времени выполнения будет ограничена.
$ 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
Разрешение доступа к порождению процесса и созданию рабочих потоков можно выполнить с помощью --allow-child-process
и --allow-worker
соответственно.
Чтобы разрешить собственные дополнения при использовании модели разрешений, используйте флаг --allow-addons
. Для WASI используйте флаг --allow-wasi
.
Runtime 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
File System Permissions
Модель разрешений по умолчанию ограничивает доступ к файловой системе через модуль 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/*
.
Ограничения модели разрешений
Перед использованием этой системы необходимо знать следующие ограничения:
Модель не наследуется дочерним процессом узла или рабочим потоком.
При использовании модели разрешений следующие функции будут ограничены:
- 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
обходит модель разрешений.
Ограничения и известные проблемы
- Символические ссылки будут отслеживаться даже в местоположения за пределами набора путей, к которым был предоставлен доступ. Относительные символические ссылки могут разрешить доступ к произвольным файлам и каталогам. При запуске приложений с включенной моделью разрешений необходимо убедиться, что никакие пути, к которым был предоставлен доступ, не содержат относительных символических ссылок.