npm-레지스트리-방화벽

구글링이 안되서 제가 직접 작성했습니다.


안톤골럽 / 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개의 공용 복제본을 항상 대안으로 사용할 수 있습니다.
  • https://registry.yarnpkg.com
  • https://registry.npmmirror.com
  • https://r.cnpmjs.org
  • https://skimdb.npmjs.com/registry
  • https://registry.npm.taobao.org

  • 이 안정성 수준이 충분하지 않으면 레지스트리를 하나 더 쉽게 실행할 수 있습니다.
  • sonatype-nexus
  • verdaccio.org

  • 보안 위험



    모든 코드가 제대로 작동하지 않을 수 있습니다. 오류 또는 악의로 인해. 대부분의 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

    좋은 웹페이지 즐겨찾기