Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

Denoのセキュリティに関する仕組みの紹介 (toranoana.deno #23)

Avatar for uki00a uki00a
December 17, 2025

Denoのセキュリティに関する仕組みの紹介 (toranoana.deno #23)

Avatar for uki00a

uki00a

December 17, 2025
Tweet

More Decks by uki00a

Other Decks in Programming

Transcript

  1. minimumDependencyAge pnpm におけるminimumReleaseAge に相当する仕組みです (Deno v2.5.5 で導入) { "minimumDependencyAge": {

    // 公開されてから最低でも1 日 (=1440 分) 以上経過しているバージョンのみをインストールします "age": 1440, // `minimumDependencyAge` の適用を除外したいパッケージを指定します "exclude": ["npm:@my-company/some-package"] } }
  2. パーミッションシステム # (1) あらゆる処理を許可 - セキュリティの観点では推奨されない $ deno run -A

    main.ts # (2) 一部の処理を許可 $ deno run --allow-net --allow-read --allow-env main.ts # (3) allowlist によりアクセス対象のリソースを限定 $ deno run --allow-net=127.0.0.1 \ --allow-read=data,config \ --allow-env=FOO,BAR \ main.ts
  3. パーミッションセット deno.json 内でパーミッションのセットを定義できます (Deno v2.5 で 追加) { "permissions": {

    "default": { "net": true }, "benchmark": { "net": ["127.0.0.1:6379"], "env": { "ignore": true }, "write": ["tmp"] } } }
  4. パーミッションセット 定義したパーミッションセットは --permission-set ( -P ) オプション によって適用できます。 # (1)

    `permissions.default` を適用します $ deno run --permission-set server.ts # (2) こちらも同様に`permissions.default` を適用します $ deno run -P worker.ts # (3) `permissions.benchmark` を適用します $ deno run --permission-set=benchmark benchmark.ts
  5. --ignore-* Deno v2.6 で --ignore-read と --ignore-env オプションが追加 $ cat

    main.js console.info("HOME", Deno.env.get("HOME")); console.info("FOO", Deno.env.get("FOO")); $ FOO=1 deno run --allow-env --ignore-env=HOME main.js HOME undefined FOO 1 $ FOO=1 deno run --ignore-env main.js HOME undefined FOO undefined
  6. deno approve-scripts pnpm における pnpm approve-builds 相当のコマンド (Deno v2.6 で追加)

    # (1) ライフサイクルスクリプトを提供するパッケージをインストール $ deno install npm:[email protected] npm:[email protected] ... ╭ Warning │ │ Ignored build scripts for packages: │ npm:[email protected] │ │ Run "deno approve-scripts" to run build scripts. ╰─ # (2) ライフサイクルスクリプトの実行を許可するパッケージを指定 $ deno approve-scripts ? Select which packages to approve lifecycle scripts for (<space> to select, ..., enter to accept, <Ctrl-c> to cancel) ❯ • npm:[email protected] ◦ npm:[email protected]
  7. deno approve-scripts deno approve-scripts を実行すると、 allowScripts が更新されます。 # (3) `deno

    approve-scripts` によって`deno.json` が更新されます $ cat deno.json | jq 'pick(.allowScripts)' { "allowScripts": { "allow": [ "npm:[email protected]" ], "deny": [ "npm:[email protected]" ] } }
  8. DENO_AUDIT_PERMISSIONS アプリケーションが要求したパーミッションの一覧がJSON Lines 形式 で指定したファイルへ記録されます (Deno v2.5 で追加) # (1)

    `DENO_AUDIT_PERMISSIONS` にパスを指定してDeno を実行 $ DENO_AUDIT_PERMISSIONS=permissions.jsonl deno run -A main.js # (2) 指定されたパスに要求されたパーミッション情報が記録されます $ jq 'pick(.permission, .value)' --compact-output permissions.jsonl {"permission":"read","value":"README.md"} {"permission":"write","value":"README.md"} {"permission":"read","value":"Makefile"} {"permission":"write","value":"Makefile"}
  9. おまけ deno.json の設定は難しい... パーミッションフラグの安全な指定方法 ( --allow-all は避ける、極 力 allowlist を指定する、など)

    minimumDependencyAge の設定がまだあまり認知されていなさそう deno.lock の無効化は避けた方が良い ( "lock": false )
  10. おまけ deno.json の Linter を作ってみました (jsr:@uki00a/deno-json-lint) $ deno run --allow-read=deno.json

    jsr:@uki00a/deno-json-lint deno.json: [require-minimum-dependency-age] `minimumDependencyAge` should be configured deno.json:2:11: [require-lockfile] A lockfile should be enabled deno.json:4:23: [ban-allow-all] --allow-all/-A should not be used deno.json:5:27: [require-allow-list] An allow list should be specified for --allow-read deno.json:8:32: [ban-allow-all] `all: true` should not be used もしご興味があればぜひ試してみてください!