
NPM 패키지를 안전하게 설치
보안에 중점을 둔 npm 설치 도구로, 새로 손상된 패키지로부터 프로젝트를 보호합니다.
npm 패키지에 대한 공급망 공격은 증가하는 위협입니다. 공격자는 때때로 합법적인 패키지를 손상시킵니다:
이러한 공격은 종종 갑작스럽게 발생합니다. 어제는 안전했던 패키지가 오늘 손상될 수 있습니다. safe-npm은 최소 기간(기본 90일) 동안 공개적으로 사용 가능했던 패키지 버전만 설치하여 사용자를 보호합니다. 이는 보안 커뮤니티가 악성 릴리스를 발견하고 보고할 시간을 제공하여 프로젝트에 도달하기 전에 차단합니다.
safe-npm install을 실행하면 다음을 수행합니다:
package.json 또는 명령줄 인수에서 종속성을 읽습니다예를 들어 react@^18을 지정하고 어제 악성 [email protected]이 게시된 경우, safe-npm은 대신 최소 90일 된 최신 버전을 설치합니다.
# Install globally
npm install -g @dendronhq/safe-npm
# Now you can use it anywhere
safe-npm install
# Clone and build
git clone <repository-url>
cd safe-npm
npm install
npm run build
# Link the binary globally
npm link
# Use the minimum age of 90 days (default)
safe-npm install
# Or specify your own minimum age
safe-npm install --min-age-days 120
# Install packages directly with version constraints
safe-npm install react@^18 lodash@^4.17.0
# These will be filtered to only use versions at least 90 days old
safe-npm install express --min-age-days 60
# Preview which versions would be installed without actually installing
safe-npm install --dry-run
--min-age-days <n>기본값: 90
패키지 버전이 설치되기 전에 게시된 최소 일수입니다.
예시: --min-age-days 120은 패키지가 최소 4개월 이상이어야 함을 의미합니다.
조정 시점:
--ignore <pkg1,pkg2>연령 요구 사항을 우회하는 쉼표로 구분된 패키지 목록입니다. 이러한 패키지는 여전히 semver 범위를 따르지만 최소 연령은 무시합니다.
예시: --ignore typescript,@types/node
사용 시점:
--strict어떤 종속성이라도 연령 요구 사항을 충족하는 버전으로 확인될 수 없으면 오류와 함께 종료합니다.
예시: safe-npm install --strict
사용 시점:
--dev / --prod-onlypackage.json에서 처리할 종속성을 제어합니다.
예시:
safe-npm install --dev - devDependencies만 설치safe-npm install --prod-only - 프로덕션 종속성만 설치사용 시점:
--strategy <direct|overrides>기본값: direct
safe-npm이 확인된 버전을 설치하는 방법:
direct - npm install package@version을 사용하여 확인된 버전을 직접 설치합니다.
overrides - 확인된 버전을 package.json의 overrides 필드에 기록한 다음 npm install을 실행합니다.
--registry <url>기본값: https://registry.npmjs.org
대체 npm 레지스트리를 지정합니다.
예시: --registry https://registry.company.com
사용 시점:
--dry-run변경하지 않고 설치될 내용을 표시합니다.
예시: safe-npm install --dry-run
사용 시점:
# Create a new project
mkdir my-project && cd my-project
npm init -y
# Install dependencies safely
safe-npm install express@^4 lodash
# This creates package-lock.json with versions at least 90 days old
# Check what versions would be installed with age requirements
safe-npm install --dry-run
# If you're happy, install them
safe-npm install
# In your CI pipeline, fail the build if any package can't meet age requirements
safe-npm install --strict --min-age-days 120
# Or allow newer packages for dev dependencies only
safe-npm install --prod-only --strict
# Need to urgently update a specific package? Add it to ignore list
safe-npm install --ignore package-with-critical-fix
프로젝트에는 실행할 수 있는 테스트 스위트가 포함되어 있습니다:
npm test
자동화된 테스트를 위해 픽스처를 사용하여 레지스트리 응답을 모킹할 수 있습니다:
export SAFE_NPM_FIXTURES=/path/to/fixtures.json
safe-npm install
픽스처 파일에는 각 패키지에 대한 npm 레지스트리 응답을 반영하는 JSON이 포함되어야 합니다.
실제 시나리오:
popular-lib이 신뢰할 수 있는 개발자가 유지 관리합니다[email protected]을 게시합니다^5.0.0을 사용하는 프로젝트는 즉시 악성 버전을 설치하게 됩니다4.9.0(90일 이상 전의 최신 버전)을 계속 사용하게 됩니다보안은 절충에 관한 것입니다. safe-npm은 갑작스러운 공급망 손상에 대한 보호를 위해 최첨단 업데이트를 희생합니다. 이는 심층 방어 전략의 한 계층이며, 다음을 포함해야 합니다:
npm audit)ISC