レジストリファイアウォール


私はそれをGoogleすることができなかったので、私は私自身を書きました:


アントワンボルブ / レジストリファイアウォール


NPMレジストリプロキシのオンザフライフィルタリング


動機


セキュリティと法的リスクを緩和する.
オープンソースは現代のソフトウェア開発に不可欠である.According to various estimates , 結果のコードベースの少なくとも60 %は、オープンリポジトリ、ライブラリとパッケージで構成されています.成長し続ける.Synopsys OSSRA 2021 report アプリケーションの98 %がオープンソースコンポーネントを持っていることを発見.
しかし、オープンは無料を意味しません.価格はあなたが取るリスクです:
  • 有効
  • セキュリティ
  • 合法性/ライセンス
  • JS宇宙の文脈でこれらの問題を考えましょう.

    有効性リスク


    JSパッケージは様々な方法で配布されています.メソッドにかかわらず、任意のPKGマネージャによって解決される2つのエントリータイプだけです.
    "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コードが公開される前に確認されないことを常に覚えておくことも重要です.
    これらの2つの状況は時々危険な事件を引き起こすcolors.js or node-ipc .
    独立した監査プロセスは高価な、時間がかかるので、新しいPKGバージョンを使用する前に遅延を設定するだけでは効果的な対策かもしれません.

    法的危険


    ライセンス契約はその瞬間の属性である.husky-5 ). 新しいバージョンの未使用の使用は、法的で財政的な結果を持っているかもしれません.したがって、自動化されたライセンスチェックは、CI/CDパイプラインまたはレジストリの独自の機能の一部である必要があります.

    主な特徴

  • 述語によるリモートパッケージへのアクセスを制限しますname , org , version ( semver range ), license , dateRange , username , age .
  • 複数の設定port/context-path/rules 組み合わせは、必要な.

  • Expressjs -インスパイアサーバーの実装.
  • がない.文字通りゼロ.
  • 要件


    ノード.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"}}
        ]
      }
    ]
    
    
    放医研
    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