パーミッション

Deno はデフォルトで安全です。そのため、明示的に許可しない限り Deno モジュールはたとえばファイル、ネットワーク、環境変数にアクセスできません。セキュリティ上重要な領域や機能にアクセスするにはコマンドラインで Deno プロセスに権限を与えるパーミッションを使う必要があります。

次の例では、mod.ts がファイルシステムに読み取り専用のアクセス権限を持ちます。書き込みはできませんし、他のセキュリティ上重要な機能は実行できません。

deno run --allow-read mod.ts

パーミッション一覧

以下のパーミッションが利用できます。

  • -A, –allow-all すべてのパーミッションを許可します。セキュリティをすべて解除します
  • –allow-env 環境変数の取得や上書きなど、環境へのアクセスを許可します
  • –allow-hrtime 高分解能の時間計測を許可します。高分解能の時間はタイミングアタックやフィンガープリンティングに使うことができます
  • –allow-net=<allow-net> ネットワークアクセスを許可します。オプションで、許可するドメインのリストを与えるためにコンマ区切りのドメインリストを指定することができます
  • –allow-plugin プラグインのロードを許可します。–allow-plugin は不安定な機能なので注意してください
  • –allow-read=<allow-read> ファイルシステムの読み取りアクセスを許可します。 オプションとして、コンマ区切りのディレクトリやファイル名のリストをファイルシステムへのアクセス許可リストとして指定できます
  • –allow-run サブプロセスの実行を許可します。サブプロセスの実行はサンドボックス内で行われないため deno のプロセスと同じセキュリティ制約を受けません。そのため、使用時に警告が表示されます
  • –allow-write=<allow-write> ファイルシステムの書き込みアクセスを許可します。オプションとして、コンマ区切りのディレクトリやファイル名のリストをファイルシステムへのアクセス許可リストとして指定できます

許可リストのパーミッション

Deno ではいくつかのパーミッションに関して許可リストを使ってパーミッションの粒度を制御できます。

以下の例ではファイルシステムへのアクセスを制限するために /usr ディレクトリのみを許可リストに追加していますが、 プロセスが /etc ディレクトリのファイルにアクセスしようとして実行時に失敗しています。

$ deno run --allow-read=/usr https://deno.land/std@$STD_VERSION/examples/cat.ts /etc/passwd
error: Uncaught PermissionDenied: read access to "/etc/passwd", run again with the --allow-read flag
► $deno$/dispatch_json.ts:40:11
    at DenoError ($deno$/errors.ts:20:5)
    ...

今度は許可リストに /etc を追加して正しいパーミッションで実行し直してみます。

deno run --allow-read=/etc https://deno.land/std@$STD_VERSION/examples/cat.ts /etc/passwd

--allow-write の動作は --allow-read と同様です。

ネットワークアクセス

fetch.ts:

const result = await fetch("https://deno.land/");

以下はホストや URL を許可リストに指定する例です。

deno run --allow-net=github.com,deno.land fetch.ts

If fetch.ts tries to establish network connections to any other domain, the process will fail. fetch.ts が他のドメインにネットワーク接続を試みるとプロセスは失敗します。

任意のホストや URL とのネットワーク接続を許可することもできます。

deno run --allow-net fetch.ts