こんにちは。Node.jsの世界へようこそ。
あなたは今、Node.jsという強力なエンジンを手に入れようとしています。Node.jsはJavaScriptをブラウザの外で動かすための魔法の杖ですが、その力ゆえに「何でもできてしまう」というリスクを内包しています。
今日お話しするのは、Node.js v20から導入された「パーミッションモデル」です。これをマスターすれば、あなたの書いたコードが暴走したり、悪意ある外部パッケージにPCを乗っ取られたりするリスクを劇的に減らすことができます。これは単なるセキュリティ対策ではなく、「信頼できるコードを書くためのプロの作法」です。
—
1. なぜ「パーミッションモデル」が必要なのか?
従来のNode.jsは、実行ユーザーと同じ権限をすべて持っていました。つまり、`npm install` で入れたパッケージが、あなたのPCにある秘密鍵(SSHキーなど)を勝手に読み取り、外部へ送信しても、Node.jsはそれを「プログラムの正当な動作」として止めることができなかったのです。
「パーミッションモデル」は、「必要な場所だけ、必要な権限を与える」というサンドボックス(砂場)的な考え方です。これを使うと、プログラムは許可された場所(ディレクトリやネットワーク)以外には一切アクセスできなくなります。
—
2. 環境構築と動作確認:まずは「素のNode.js」を知る
Node.jsがインストールされていない場合は、[公式サイト](https://nodejs.org/)から「LTS(長期サポート版)」をダウンロードしてください。
ターミナルを開き、以下のコマンドでバージョンを確認しましょう。
Node.jsが正しくインストールされているか確認
node -v
期待値: v20.x.x 以上 (パーミッションモデルはv20から実験的機能として導入されています)
次に、検証用のプロジェクトフォルダを作り、テストコードを用意します。
実験用コード:`app.js` の作成
// fsモジュールを読み込み、ファイルの中身を読もうとする
const fs = require(‘node:fs’);
try {
// 秘密のファイル(仮定)を読み込もうとする
const data = fs.readFileSync(‘/etc/passwd’, ‘utf8’);
console.log(‘読み込み成功!:’, data.substring(0, 50));
} catch (err) {
console.error(‘エラー発生:’, err.message);
}
—
3. パーミッションモデルの真髄:`–allow-fs-read` を使う
では、このプログラムを「制限付き」で動かしてみましょう。
通常の実行(許可なし)
node app.js
これだと、OSの重要なファイルにアクセスできてしまいます。
セキュアな実行(許可付き)
ここで、`–experimental-permission` と `–allow-fs-read` を指定します。
特定のディレクトリ以外は読み取り禁止にして実行
node –experimental-permission –allow-fs-read=./ app.js
何が起きるか?
実行すると、Node.jsは `/etc/passwd` へのアクセスを検知し、`EPERM: operation not permitted` というエラーを返して処理を停止します。これがあなたのアプリを守る防壁です。
- `–experimental-permission`: セキュリティ機能を有効化するスイッチ
- `–allow-fs-read=./`: 「このプロジェクトフォルダ内だけは読み取っていいよ」という許可設定
—
4. プロ現場で活かす「最小権限の原則」
実務において、この設定は「ランタイム・ガバナンス」として機能します。例えば、Webサーバーを構築する際、以下のように設定するのがプロの設計です。
必要な場所だけ許可し、他をすべて遮断する最強の設定例
node –experimental-permission \
–allow-fs-read=/var/www/app/public \
–allow-fs-write=/var/www/app/logs \
–allow-net=api.myservice.com \
server.js
この設定の素晴らしい点は、「もし開発者が誤ってコード内に脆弱性を残しても、攻撃者は指定したディレクトリ以外を見ることができず、外部への通信も許可されたAPI以外には行えない」という点です。
—
5. 最後に:なぜこれを学ぶべきか
初心者のうちは「動けばいい」と考えがちです。しかし、今日あなたが学んだこの「パーミッションモデル」を最初から意識できているエンジニアは、「設計の質」が圧倒的に違います。
- 安全なコード: 外部パッケージの不審な挙動をランタイムレベルでブロックできる。
- デバッグのしやすさ: どこで何にアクセスしようとしたのかが明確になり、予期せぬIOを防げる。
- 安心感: CI/CDパイプラインや本番環境で、「このアプリはここ以外には触らない」という証明書を持っているようなもの。
まずは、自分の小さなスクリプトで `–allow-fs-read` を試してみてください。自分のプログラムが「何をしようとしているか」をコントロールできるようになったとき、あなたはもう「Node.jsを使わされている人」から「Node.jsを使いこなす設計者」へ進化しています。
さあ、次はどの権限を制限してみますか? 開発効率と安全性を両立させる旅は、まだ始まったばかりです。