🚀

社内限定npxを実現する完全ガイド:Verdaccioと社内ネットワーク制限

に公開

社内限定npxを実現する完全ガイド:Verdaccioと社内ネットワーク制限

はじめに

企業内でJavaScriptツールやユーティリティを共有する際、セキュリティや知的財産保護の観点から社内限定でnpxコマンドを使用したいケースは少なくありません。本記事では、プライベートnpmレジストリ「Verdaccio」と社内ネットワーク制限を組み合わせて、安全かつ効率的な社内限定npx実行環境を構築する方法を解説します。

なぜ社内限定npxが必要なのか?

セキュリティとコンプライアンスの課題

公開npmレジストリを使用する際の主な課題:

  • 社外への情報漏洩リスク: 社内専用ツールのコードが外部に公開される危険性
  • サプライチェーン攻撃: 悪意のあるパッケージによる攻撃リスク
  • コンプライアンス要件: 多くの企業では社内ツールの社外公開が禁止されている

社内限定npxのメリット

  • セキュリティ強化: 社内でのみアクセス可能なレジストリによりリスクを低減
  • 知的財産の保護: 社内専用ツールやライブラリを安全に管理
  • バージョン管理の一元化: 社内標準のパッケージバージョンを強制可能
  • ネットワーク分離: 外部ネットワークへの依存を減らし、安定性向上

Verdaccioとは?

Verdaccioは、軽量でシンプルなプライベートnpmレジストリサーバーです。

主な特徴

  • オープンソース: MITライセンスで提供
  • キャッシング: パブリックレジストリのプロキシとしても機能
  • 認証・認可: 独自のユーザー管理とアクセス制御
  • Docker対応: コンテナ化して簡単にデプロイ可能
  • プラグイン拡張: 認証や保存方法などをカスタマイズ可能

システム構成

以下の構成要素で社内限定npx環境を実現します。

┌─────────────────────────────────────────────┐
│                  社内ネットワーク                │
│                                             │
│  ┌─────────┐        ┌──────────────────┐    │
│  │         │        │  Verdaccio       │    │
│  │ 開発者PC  │━━━━━━━▶│  プライベート      │    │
│  │         │        │  npmレジストリ     │    │
│  └─────────┘        └──────────────────┘    │
│        ▲                      │             │
│        │                      │             │
│        │                      ▼             │
│  ┌─────────┐        ┌──────────────────┐    │
│  │  CI/CD  │        │  ストレージ        │    │
│  │ パイプライン │        │ (パッケージ保存)   │    │
│  └─────────┘        └──────────────────┘    │
│                                             │
└───────────────────┬─────────────────────────┘
                    │
                    │ プロキシ (必要に応じて)
                    ▼
         ┌─────────────────────┐
         │  公開npmレジストリ    │
         │  (npmjs.com)       │
         └─────────────────────┘

実装手順

1. Verdaccioのインストールと設定

Dockerを使った簡単インストール

# Dockerでのインストール例
mkdir -p ~/verdaccio/conf ~/verdaccio/storage
cd ~/verdaccio

# Docker Composeファイル作成
cat > docker-compose.yml <<EOF
version: '3'
services:
  verdaccio:
    image: verdaccio/verdaccio:5
    container_name: verdaccio
    ports:
      - "4873:4873"
    volumes:
      - ./conf:/verdaccio/conf
      - ./storage:/verdaccio/storage
    environment:
      - VERDACCIO_PORT=4873
EOF

# 設定ファイル作成
cat > conf/config.yaml <<EOF
storage: /verdaccio/storage
auth:
  htpasswd:
    file: /verdaccio/conf/htpasswd
uplinks:
  npmjs:
    url: https://registry.npmjs.org/
packages:
  '@company/*':
    access: $authenticated
    publish: $authenticated
  '@*/*':
    access: $authenticated
    publish: $authenticated
    proxy: npmjs
  '**':
    access: $authenticated
    publish: $authenticated
    proxy: npmjs
logs:
  - {type: stdout, format: pretty, level: http}
EOF

# Dockerコンテナ起動
docker-compose up -d

ユーザー登録と認証

# ユーザー登録
npm adduser --registry http://localhost:4873

# 認証情報の確認
cat ~/.npmrc

2. 社内npxツールの作成とパブリッシュ

簡単な社内ツールの例

#!/usr/bin/env node
// company-tool.js

console.log('社内専用ツールが正常に実行されました!');
console.log('実行環境情報:');
console.log(`Node.js バージョン: ${process.version}`);
console.log(`プラットフォーム: ${process.platform}`);
console.log(`ホスト名: ${require('os').hostname()}`);

パッケージ化

# プロジェクト作成
mkdir -p @company/cli-tool
cd @company/cli-tool

# package.json作成
cat > package.json <<EOF
{
  "name": "@company/cli-tool",
  "version": "1.0.0",
  "description": "社内専用CLIツール",
  "bin": {
    "company-tool": "./company-tool.js"
  },
  "publishConfig": {
    "registry": "http://localhost:4873"
  },
  "private": true
}
EOF

# ツールスクリプト作成
cat > company-tool.js <<EOF
#!/usr/bin/env node
console.log('社内専用ツールが正常に実行されました!');
console.log('実行環境情報:');
console.log(\`Node.js バージョン: \${process.version}\`);
console.log(\`プラットフォーム: \${process.platform}\`);
console.log(\`ホスト名: \${require('os').hostname()}\`);
EOF

# 実行権限付与
chmod +x company-tool.js

# パブリッシュ
npm publish

3. 社内ネットワーク制限の実装

ファイアウォール設定例

# 社内IPレンジからのみVerdaccioへのアクセスを許可
sudo iptables -A INPUT -p tcp --dport 4873 -s 192.168.0.0/16 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 4873 -j DROP

# 設定の永続化(Ubuntu/Debian)
sudo apt-get install iptables-persistent
sudo netfilter-persistent save

リバースプロキシ (Nginx) による制限

# /etc/nginx/conf.d/verdaccio.conf
server {
    listen 80;
    server_name npm.internal.company.com;

    location / {
        proxy_pass http://localhost:4873/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        # IPアドレスによるアクセス制限
        allow 192.168.0.0/16;  # 社内IPレンジ
        deny all;              # その他は拒否
    }
}

4. クライアント側の設定

.npmrcによる設定

# グローバル設定
npm config set @company:registry http://npm.internal.company.com

# または、プロジェクト毎の設定 (.npmrc)
echo "@company:registry=http://npm.internal.company.com" > .npmrc

社内CA証明書の設定(HTTPS利用時)

# NodeJSに社内CA証明書を登録
npm config set cafile /path/to/company-ca.pem

運用と保守

CI/CDとの連携

GitLab CI例

# .gitlab-ci.yml
publish-npm-package:
  stage: deploy
  script:
    - npm config set @company:registry http://npm.internal.company.com
    - npm config set //npm.internal.company.com/:_authToken "${NPM_TOKEN}"
    - npm publish
  only:
    - tags

バックアップ戦略

# ストレージディレクトリの定期バックアップ
0 2 * * * tar -czf /backup/verdaccio-$(date +\%Y\%m\%d).tar.gz /path/to/verdaccio/storage

モニタリングと監査

# アクセスログの監視
tail -f /path/to/verdaccio/logs/access.log | grep "npm publish"

# パッケージ監査
npm audit --registry http://npm.internal.company.com

セキュリティ強化策

1. HTTPS化

# config.yaml
https:
  key: /path/to/server.key
  cert: /path/to/server.crt
  ca: /path/to/ca.pem

2. 2要素認証の導入

Verdaccioの認証プラグインを使って2FAを実装できます。

# 2FA認証プラグインのインストール
npm install -g verdaccio-2fa
# config.yaml
auth:
  htpasswd:
    file: ./htpasswd
  verdaccio-2fa:
    enabled: true
    rulesForPackages:
      '@company/*': true # 社内パッケージに2FA必須

3. パッケージ署名と検証

# パッケージ署名
npm publish --sign

# クライアント側での検証設定
npm config set verify-signatures true

トラブルシューティング

よくある問題と解決策

  1. 認証エラー

    • .npmrcの設定確認
    • Verdaccioのhtpasswdファイルを確認
    • npm login --registry http://npm.internal.company.com で再ログイン
  2. パッケージが見つからない

    • キャッシュクリア: npm cache clean --force
    • uplinks設定の確認
    • ネットワーク接続性確認
  3. npxコマンドが動作しない

    • NPMのバージョン確認: npm -v(バージョン7以上推奨)
    • グローバル設定を確認: npm config list
    • パスの設定確認

応用例:特定環境でのみ実行可能なnpxコマンド

環境変数による制限

#!/usr/bin/env node
// company-tool.js

// 環境チェック
const allowedNetworks = ['192.168.0.', '10.0.0.'];
const { networkInterfaces } = require('os');
const nets = networkInterfaces();
let isAllowed = false;

// 社内IPチェック
Object.keys(nets).forEach(name => {
  nets[name].forEach(net => {
    if (net.family === 'IPv4') {
      allowedNetworks.forEach(prefix => {
        if (net.address.startsWith(prefix)) {
          isAllowed = true;
        }
      });
    }
  });
});

if (!isAllowed) {
  console.error('このツールは社内ネットワークでのみ実行可能です。');
  process.exit(1);
}

// メイン処理
console.log('社内専用ツールが正常に実行されました!');

ホスト名による制限

const { hostname } = require('os');
const allowedDomains = ['.internal.company.com', '.company.local'];

let isAllowed = false;
allowedDomains.forEach(domain => {
  if (hostname().endsWith(domain)) {
    isAllowed = true;
  }
});

if (!isAllowed) {
  console.error('このツールは許可されたホストでのみ実行可能です。');
  process.exit(1);
}

まとめ

社内限定npx実行環境を構築するためのポイント:

  1. Verdaccioによるプライベートnpmレジストリの構築
  2. 社内ネットワーク制限によるアクセス制御
  3. 認証と認可の適切な設定
  4. CI/CDパイプラインとの連携
  5. セキュリティ対策の実施

これらの施策を組み合わせることで、セキュアで使いやすい社内限定のJavaScriptツール環境を実現できます。社内開発者の生産性向上とセキュリティリスクの低減を両立させましょう。

参考リンク


この記事がお役に立ちましたら、いいね��やコメントをいただけると嬉しいです!

Discussion