Skip to content

권한

권한은 Node.js 프로세스가 접근할 수 있는 시스템 리소스 또는 해당 리소스로 수행할 수 있는 작업을 제어하는 데 사용할 수 있습니다.

  • 프로세스 기반 권한은 Node.js 프로세스의 리소스 접근을 제어합니다. 리소스에 대한 접근을 완전히 허용하거나 거부할 수 있으며, 관련된 작업을 제어할 수도 있습니다. 예를 들어, 파일 시스템 읽기는 허용하면서 쓰기는 거부할 수 있습니다. 이 기능은 악성 코드로부터 보호하지 않습니다. Node.js 보안 정책에 따르면, Node.js는 실행 요청을 받은 코드를 신뢰합니다.

권한 모델은 "안전 벨트" 접근 방식을 구현하여 신뢰할 수 있는 코드가 실수로 파일을 변경하거나 명시적으로 부여되지 않은 리소스를 사용하는 것을 방지합니다. 악성 코드가 있는 경우 보안을 보장하지 않습니다. 악성 코드는 권한 모델을 우회하여 권한 모델에서 부과한 제한 없이 임의의 코드를 실행할 수 있습니다.

잠재적인 보안 취약점을 발견하면 보안 정책을 참조하십시오.

프로세스 기반 권한

권한 모델

[안정적: 2 - 안정적]

안정적: 2 안정성: 2 - 안정적.

Node.js 권한 모델은 실행 중에 특정 리소스에 대한 접근을 제한하는 메커니즘입니다. API는 활성화 시 사용 가능한 모든 권한에 대한 접근을 제한하는 --permission 플래그 뒤에 있습니다.

사용 가능한 권한은 --permission 플래그에 의해 문서화됩니다.

--permission으로 Node.js를 시작하면 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 플래그를 사용하십시오.

런타임 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/ - /tmp/ 폴더에 대한 FileSystemWrite 접근을 허용합니다.
  • --allow-fs-read=/tmp/ --allow-fs-read=/home/.gitignore - /tmp/ 폴더 /home/.gitignore 경로에 대한 FileSystemRead 접근을 허용합니다.

와일드카드도 지원됩니다.

  • --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/\*.

권한 모델 제약 조건

이 시스템을 사용하기 전에 알아야 할 제약 조건이 있습니다.

  • 모델은 하위 노드 프로세스나 워커 스레드로 상속되지 않습니다.

  • 권한 모델을 사용할 때 다음 기능이 제한됩니다.

    • 네이티브 모듈
    • 하위 프로세스
    • 워커 스레드
    • 검사기 프로토콜
    • 파일 시스템 액세스
    • WASI
  • 권한 모델은 Node.js 환경이 설정된 후에 초기화됩니다. 그러나 --env-file 또는 --openssl-config와 같은 특정 플래그는 환경 초기화 전에 파일을 읽도록 설계되었습니다. 결과적으로 이러한 플래그는 권한 모델의 규칙을 따르지 않습니다. v8.setFlagsFromString을 통해 런타임에 설정할 수 있는 V8 플래그에도 동일하게 적용됩니다.

  • 권한 모델이 활성화된 경우 런타임에 OpenSSL 엔진을 요청할 수 없으며, 이는 내장 crypto, https 및 tls 모듈에 영향을 미칩니다.

  • 권한 모델이 활성화된 경우 런타임 로드 가능 확장 기능을 로드할 수 없으며, 이는 sqlite 모듈에 영향을 미칩니다.

  • node:fs 모듈을 통해 기존 파일 디스크립터를 사용하면 권한 모델을 우회합니다.

제한 사항 및 알려진 문제

  • 심볼릭 링크는 액세스 권한이 부여된 경로 세트 외부의 위치로도 따라갑니다. 상대 심볼릭 링크를 통해 임의의 파일 및 디렉토리에 액세스할 수 있습니다. 권한 모델을 활성화한 상태로 애플리케이션을 시작할 때는 액세스 권한이 부여된 경로에 상대 심볼릭 링크가 포함되지 않도록 해야 합니다.