npm-레지스트리-방화벽
15319 단어 npmsecuritynodejavascript
안톤골럽 / npm-레지스트리-방화벽
즉석 필터링이 있는 npm 레지스트리 프록시
동기 부여
보안 및 법적 위험을 완화합니다.
오픈 소스는 최신 소프트웨어 개발에 필수적입니다. According to various estimates , 결과 코드베이스의 60% 이상이 개방형 저장소, 라이브러리 및 패키지로 구성됩니다. 그리고 계속 성장하고 있습니다. Synopsys OSSRA 2021 report는 애플리케이션의 98%에 오픈 소스 구성 요소가 있음을 발견했습니다.
그러나 개방이 무료를 의미하는 것은 아닙니다. 가격은 다음과 같은 위험을 감수하는 것입니다.
JS 유니버스의 맥락에서 이러한 문제를 고려해 봅시다.
가용성 위험
JS 패키지는 git repos, cdns 및 패키지 레지스트리와 같은 다양한 방식으로 배포됩니다. 방법에 관계없이 모든 pkg 관리자가 최종적으로 해결하는 항목 유형은 git-commit 포인터와 tarball 링크의 두 가지뿐입니다.
"dependencies": {
"yaf" : "git://github.com/antongolub/yarn-audit-fix.git#commit-hash",
"yaf2": "antongolub/yarn-audit-fix",
"yarn-audit-fix" : "*"
}
yaf2@antongolub/yarn-audit-fix:
version "9.2.1"
resolved "https://codeload.github.com/antongolub/yarn-audit-fix/tar.gz/706646bab3b4c7209596080127d90eab9a966be2"
dependencies:
"@types/find-cache-dir" "^3.2.1"
"@types/fs-extra" "^9.0.13"
"node_modules/yaf": {
"name": "yarn-audit-fix",
"version": "9.2.1",
"resolved": "git+ssh://[email protected]/antongolub/yarn-audit-fix.git#706646bab3b4c7209596080127d90eab9a966be2",
"license": "MIT",
"node_modules/yarn-audit-fix": {
"version": "9.2.1",
"resolved": "https://registry.npmjs.org/yarn-audit-fix/-/yarn-audit-fix-9.2.1.tgz",
"integrity": "sha512-4biFNP4ZLOHboB2cNVuhYyelTFR/twlfmGMQ2TgJgGRORMDM/rQdQqhJdVLuKvfdMLFEPJ832z6Ws5OoCnFcfA==",
"dependencies": {
따라서 미러링 구현은 기본적으로 매우 간단합니다. 대체 ssh/https 진입점에서 이러한 자산을 저장하고 노출하기만 하면 됩니다. 운 좋게도 이것은 이미 일어났습니다. JS 코드의 기본 저장소는 registry.npmjs.org 입니다. 그리고 최소 5개의 공용 복제본을 항상 대안으로 사용할 수 있습니다.
이 안정성 수준이 충분하지 않으면 레지스트리를 하나 더 쉽게 실행할 수 있습니다.
보안 위험
모든 코드가 제대로 작동하지 않을 수 있습니다. 오류 또는 악의로 인해. 대부분의 OSS 라이센스는 손해에 대한 책임을 배제한다는 점을 명심하십시오. oss 코드는 게시되기 전에 확인되지 않는다는 점을 항상 기억하는 것도 중요합니다.
이 두 가지 상황은 때때로 colors.js 또는 node-ipc과 같은 위험한 사건을 야기합니다.
독립적인 감사 프로세스는 비용이 많이 들고 시간이 많이 걸리므로 새 pkg 버전을 사용하기 전에 지연을 설정하는 것만으로도 효과적인 대책이 될 수 있습니다.
법적 위험
라이센스 계약은 순간의 속성입니다. 갑자기 변경되어 개발 프로세스에 영향을 미칠 수 있습니다(예: husky-5 ). 새 버전을 무단으로 사용하면 법적 및 재정적 결과를 초래할 수 있습니다. 따라서 자동화된 라이선스 확인은 CI/CD 파이프라인 또는 레지스트리 자체 기능의 일부여야 합니다.
주요 특징들
name
조합을 정의합니다. semver range - 영감을 받은 서버 구현.
익스프레스 요구 사항
Node.js >= 14
설치
# npm
npm i npm-registry-firewall
# yarn
yarn add npm-registry-firewall
용법
CLI
npm-registry-firewall /path/to/config.json
JS API
import {createApp} from 'npm-registry-firewall'
const app = createApp({
server: {
host: 'localhost',
port: 3001,
},
firewall: {
registry: 'https://registry.npmmirror.com',
rules: [
{
policy: 'allow',
org: '@qiwi'
},
{
policy: 'deny',
name: '@babel/*'
},
]
}
})
await app.start()
구성
{
"server": {
"host": "localhost", // Defaults to 127.0.0.1
"port": 3000, // 8080 by default
"secure": { // Optional. If declared serves via https
"cert": "ssl/cert.pem",
"key": "ssl/key.pem"
},
"base": "/", // Optional. Defaults to '/'
"healthcheck": "/health", // Optional. Defaults to '/healthcheck'. Pass null to disable
"keepAliveTimeout": 15000, // Optional. Defaults 61000
"headersTimeout": 20000, // Optional. Defaults 62000
"requestTimeout": 10000 // Optional. Defaults 30000
},
"firewall": {
"registry": "https://registry.npmmirror.com", // Remote registry
"entrypoint": "https://r.qiwi.com/npm", // Optional. Defaults to `${server.secure ? 'https' : 'http'}://${server.host}:${server.port}${route.base}`
"base": "/", // Optional. Defaults to '/'
"rules": [
{
"policy": "allow",
"org": "@qiwi"
},
{
"policy": "allow",
"name": ["@babel/*", "@jest/*", "lodash"] // string[] or "comma,separated,list". * works as .+ in regexp
},
{
"policy": "deny",
"name": "colors",
"version": ">= v1.4.0" // Any semver range: https://github.com/npm/node-semver#ranges
},
{
"policy": "deny",
"license": "dbad" // Comma-separated license types or string[]
},
{
"policy": "allow",
"username": ["sindresorhus", "isaacs"] // Trusted npm authors.
},
{
"policy": "allow",
"name": "d",
// `allow` is upper, so it protects `< 1.0.0`-ranged versions that might be omitted on next steps
"version": "< 1.0.0"
},
{
"policy": "deny",
// Checks pkg version publish date against the range
"dateRange": ["2010-01-01T00:00:00.000Z", "2025-01-01T00:00:00.000Z"]
},
{
"policy": "allow",
"age": 5 // Check the package version is older than 5 days. Like quarantine
}
]
}
}
다중 구성
// Array at the top level
[
// Two servers (for example, http and https) share the same preset
{
"server": [
{"port": 3001},
{"port": 3002},
],
"firewall": {
"registry": "https://registry.yarnpkg.com",
"rules": {"policy": "deny", "org": "@qiwi"}
}
},
// One server has a pair of separately configured endpoints
{
"server": {"port": 3003},
"firewall": [
{"base": "/foo", "registry": "https://registry.npmjs.org", "rules": {"policy": "deny", "org": "@qiwi"}},
{"base": "/bar", "registry": "https://registry.yarnpkg.com", "rules": {"policy": "deny", "org": "@babel"}}
]
}
]
.npmrc
registry=https://localhost:3000
strict-ssl=false
npm 보기
npm-registry-firewall % npm view d versions
[ '0.1.0', '0.1.1' ]
산출
$ node src/main/js/cli.js config.json
{"level":"INFO","timestamp":"2022-04-11T20:56:47.031Z","message":"npm-registry-firewall is ready for connections: https://localhost:3000"}
{"level":"INFO","timestamp":"2022-04-11T20:56:49.568Z","traceId":"44f21c050d8c6","clientIp":"127.0.0.1","message":"GET /d"}
{"level":"INFO","timestamp":"2022-04-11T20:56:50.015Z","traceId":"44f21c050d8c6","clientIp":"127.0.0.1","message":"HTTP 200 446ms"}
기여
버그 보고서, 기능 요청 또는 질문과 같은 문제를 자유롭게 여십시오.
PR 제안은 언제나 환영합니다. 이 저장소를 포크하고, 코드를 작성하고, 테스트를 하고, 변경 사항을 푸시하세요.
모든 피드백에 감사드립니다.
특허
MIT
Reference
이 문제에 관하여(npm-레지스트리-방화벽), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/antongolub/npm-registry-firewall-12ai텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)