日々のいろいろ

npm設定(min-release-ageとignore-scripts)についてしらべてみた

投稿日: 2026/4/1

概要

GMO Flatt Securityのこちらのブログにて記載されている対策にある、
npmの設定についての調査・記載です。

対象者

  • 今回はnpmパッケージ開発者向けではなく、公開npmパッケージをインストールして利用する開発者向けです。

.npmrcファイルによる環境設定

npm設定用のファイルです。

プロジェクト単位、ユーザー単位(ディレクトリ)での設定が可能です。

設定内容

.npmrc

ignore-scripts=true
min-release-age=7

1. min-release-age=7

指定された日数が経過しているバージョンをnpmがインストールします。

ライブラリのバージョンを固定していない場合、リリース日に関わらず最新バージョンをダウンロードしてしまうので、

侵害されたライブラリのダウンロードへのリスク低減策になります。

また、後述のignore-scrptsより迅速に、まず第一の対策としての導入としても効果的です。

指定日条件に合致するバージョンがない場合は、エラーになるようです。

参考:https://docs.npmjs.com/cli/v11/using-npm/config#min-release-age

2. ignore-scripts=true

package.json内のスクリプトの実行を制御する設定です。

悪意あるマルウェアのダウンロードさせるスクリプトの無効化が期待されます。

これは自身のpackage.jsonに関わらず、依存関係にあるライブラリのpackage.jsonに含まれるスクリプトも無視されます。

後述しますが、副作用が強いので設定導入には要確認です。

「npm install」コマンドの場合

実行時に自動で実行される以下スクリプト(Life Cycle Operation Order)すべてが無視されます。

  • preinstall
  • install
  • postinstall
  • prepublish
  • preprepare
  • prepare
  • postprepare

検証

以下のようなpackage.jsonファイルを作成します。

{
  "name": "npm-test",
  "version": "1.0.0",
  "scripts": {
    "preinstall": "echo PREINSTALL",
    "install": "echo INSTALL",
    "postinstall": "echo POSTINSTALL",
    "prepublish": "echo PREPUBLISH",
    "preprepare": "echo PREPREPARE",
    "prepare": "echo PREPARE",
    "postprepare": "echo POSTPREPARE"
  },
  "author": "shutx"
}

「npm install」実行したところ、明示的に定義した、自動実行スクリプトが正常に実行されたことがわかります。

node ➜ /workspaces/npm-test $ npm install

> npm-test@1.0.0 preinstall
> echo PREINSTALL

PREINSTALL

> npm-test@1.0.0 install
> echo INSTALL

INSTALL

> npm-test@1.0.0 postinstall
> echo POSTINSTALL

POSTINSTALL

> npm-test@1.0.0 prepublish
> echo PREPUBLISH

PREPUBLISH

> npm-test@1.0.0 preprepare
> echo PREPREPARE

PREPREPARE

> npm-test@1.0.0 prepare
> echo PREPARE

PREPARE

> npm-test@1.0.0 postprepare
> echo POSTPREPARE

POSTPREPARE

up to date, audited 1 package in 234ms

found 0 vulnerabilities

次に.npmrcファイルを作成し、ignore-scriptsを有効にします

ignore-scripts=true

「npm config list」コマンドで、設定が効いてるか確認します

node ➜ /workspaces/npm-test $ npm config list
; "global" config from /usr/local/etc/npmrc

prefix = "/usr/local/share/npm-global"

; "project" config from /workspaces/npm-test/.npmrc

ignore-scripts = true

; node bin location = /usr/local/bin/node
; node version = v24.14.0
; npm local prefix = /workspaces/npm-test
; npm version = 11.9.0
; cwd = /workspaces/npm-test
; HOME = /home/node
; Run `npm config ls -l` to show all defaults.

再度「npm install」を実行すると、スクリプトはなにも実行されていないことがわかります。

node ➜ /workspaces/npm-test $ npm install

up to date, audited 1 package in 212ms

found 0 vulnerabilities

これはpackage-lock.jsonを使う、「npm ci」でも同様の結果でした。

「npm restart」コマンドの場合は、
実行時に自動で実行される以下スクリプトのうち、「restart」スクリプトのみ実行されます

  • prerestart
  • restart
  • postrestart

「restart」スクリプトは実行される理由については、ドキュメントに以下のように記載があります。
同様に、「npm run」コマンドで特定のスクリプトを指定する場合もignore-scripts設定は効かないようです。

Note that commands explicitly intended to run a particular script, such as npm start, npm stop, npm restart, npm test, and npm run-script will still run their intended script if ignore-scripts is set
npm start、npm stop、npm restart、npm test、npm run-script など、特定のスクリプトを実行することを明示的に意図したコマンドは、ignore-scripts が設定されている場合でも、対象のスクリプトを実行します

注意点

  • ignore-scriptsは強力ゆえに、正規のライブラリのインストール時のスクリプトも無視してしまうという副作用があります。
    たとえば、prismaのpackage.jsonでは「preinstall」スクリプトが定義されていますが、ignore-scripts設定で無視されます。
"scripts": {
    // 一部抜粋
    "preinstall": "node scripts/preinstall-entry.js"
}

XやGitHub上で見かけるignore-scripts設定は.npmrcに書くべきという意見については、CI/CDで正常動作が保証できる基盤があるという前提の上で、かなりセキュリティリスクを低減できると考えます。

いずれにせよ、ignore-scriptsの設定は事前の入念な調査・検証が必要になります。

参考:

コメント

0

まだコメントがありません

コメントするMarkdown不要
0 / 1500 文字