Denoのパーミッションシステム
#Deno #セキュリティ
概要
Denoではファイルシステムやネットワーク、環境変数などに関する操作は、明示的に権限を与えない限り、実行することができません
Deno v1.46から短縮形式がサポート
パーミッションフラグ
--allow-read (-R)
ファイルシステムへの読み込みを許可します
--allow-write (-W)
ファイルシステムへの書き込みを許可します
--allow-net (-N)
ネットワークアクセスを許可します (Deno.connect/Deno.listen/fetch()など)
--allow-env (-E)
環境変数の参照を許可します
--allow-sys (-S)
システム情報を参照するAPIの実行を許可します
v1.26で導入されました
--allow-run
Deno.Commandによるサブプロセスの実行を許可します
LD_PRELOADなどのLD_から始まる環境変数またはDYLD_から始まる環境変数が設定されている場合は、--allow-allの指定が必要です (Deno v2から)
fix(permissions): disallow launching subprocess with LD_PRELOAD env var without full run permissions (#25221)
fix(permissions): disallow any LD_ or DYLD_ prefixed env var without full --allow-run permissions (#25271)
セキュリティのため、--allow-runに指定された実行可能ファイルはDenoの起動時に絶対パス形式で解釈された上で--deny-writeに自動で設定されます (Deno v2から)
(fix: lock down allow-run permissions more (#25370))
--allow-ffi
FFIやNode-APIの使用を許可します (DenoのFFIについて)
--allow-scripts
npmパッケージのライフサイクルスクリプトの実行を許可します (Denoのnpmパッケージサポート)
--allow-import (-I)
Deno v2から導入予定の新しいパーミッションフラグです (feat: add --allow-import flag (#25469))
--allow-all (-A)
権限を必要とするあらゆる機能の使用を許可します
--deny-*
各種--allow-*フラグと対になるフラグで、特定の権限を拒否することができます (例: --deny-read, --deny-write)
--deny-*フラグは--allow-*フラグよりも優先度が高く設定されています
code:shell
# 1. 全ての処理を許可します (--allow-all)
# 2. ただし、ファイルシステムへの書き込みは拒否します (--deny-write)
$ deno run --allow-all --deny-write main.js
パーミッションセット
Deno v2.5で導入された機能です
deno.jsonでパーミッションを定義することができます
code:deno.json
{
"permissions": {
"server": {
"net": "127.0.0.1:6379",
"read": true,
"env": true,
"write": "tmp"
}
}
}
code:shell
# (1) --permission-setで適用するパーミッションセットを指定できます (セット名を省略した場合、deno.jsonのpermissions.defaultという名前のパーミッションセットが適用されます)
$ deno run --permission-set=server server.ts
# (2) 以下のように省略も可能です
$ deno run -P=server server.ts
deno test/deno bench/deno compileの各コマンド向けのデフォルトパーミッションセットを定義することも可能です
code:json
{
"test": {
"permissions": {
"net": true,
"read": "tests",
"write": "tests/tmp"
}
}
}
code:shell
# deno.jsonで定義したtest.permissionsが適用されます
$ deno test -P
このパーミッションセット機能を--allow-runと併用する場合は注意が必要です
--allow-runによって悪意のあるプログラムの実行が許可されてしまった場合、意図せずdeno.jsonが書き換えられてしまい、必要以上の権限をDenoに与えてしまう可能性があります
--allow-runを使用する際は、必要最小限のプログラムの実行のみを許可しておくと、このリスクを軽減できます (--allow-run=foo,bar)
Permission Audit Logs
DENO_AUDIT_PERMISSIONS環境変数を設定することで、アプリケーションから要求されたパーミッションの一覧がファイルに記録されます