Sails.jsにおけるHelmetを用いたセキュリティヘッダーの実践的設定

Node.jsアプリケーションのセキュリティ強化:Sails.jsとHelmetの統合

Webアプリケーションのセキュリティは、ユーザー保護とデータ整合性を確保する上で不可欠です。特にリアルタイム機能を備えたMVCフレームワークであるSails.jsでは、適切なHTTPセキュリティヘッダーの設定が攻撃からの防御に大きく貢献します。本記事では、helmetミドルウェアを活用してSails.jsアプリに堅牢なセキュリティ機構を構築する方法を解説します。

主要なセキュリティリスクと対策

以下のような一般的な攻撃に対して、HTTPレスポンスヘッダーによる防御が有効です:

  • XSS(クロスサイトスクリプティング):外部スクリプトの実行を防止
  • クリックジャッキング:ページのiframe埋め込みをブロック
  • MIMEスニッフィング:意図しないコンテンツ型の解釈を抑制
  • プロトコル降格攻撃:HTTPS通信の強制により中間者攻撃を軽減

Sails.jsのセキュリティ基盤

Sailsは組み込みでいくつかのセキュリティ機能を提供しています。主な設定はconfig/security.jsに記述されます。

CORSの安全な許可設定

module.exports.security = {
  cors: {
    allRoutes: true,
    allowOrigins: [
      'https://example.com',
      'https://admin.example.com'
    ],
    allowCredentials: false,
    allowRequestHeaders: 'X-Requested-With,Content-Type,Authorization'
  }
};

CSRF保護の有効化

csrf: true

この設定により、POSTやPUTなどの変更操作に対して自動的にCSRFトークンの検証が行われます。

Helmetミドルウェアの導入

まずnpmでhelmetをインストールします。

npm install helmet --save

ミドルウェアとしての統合

config/http.jsファイル内にhelmetを登録し、実行順序を明示します。

module.exports.http = {
  middleware: {
    order: [
      'cookieParser',
      'session',
      'bodyParser',
      'compress',
      'poweredBy',
      'securityHeaders' // カスタムセキュリティミドルウェア
    ],

    securityHeaders: (function() {
      const helmet = require('helmet');
      return helmet({
        frameguard: { action: 'deny' },
        xssFilter: true,
        noSniff: true,
        hidePoweredBy: { setTo: 'PHP 8.0' }, // 情報隠蔽
        hsts: {
          maxAge: 31536000,
          includeSubDomains: true,
          preload: true
        }
      });
    })()
  }
};

カスタムCSPポリシーの設計

Content-Security-Policyは細かな制御が必要です。以下は典型的な開発・本番環境向けの分岐例です。

const cspDirectives = sails.config.environment === 'production'
  ? {
      defaultSrc: ["'self'"],
      scriptSrc: ["'self'", "'unsafe-eval'"],
      styleSrc: ["'self'", "'unsafe-inline'", 'https:'],
      imgSrc: ["'self'", 'data:', 'https:'],
      connectSrc: ["'self'", 'wss:'],
      objectSrc: ["'none'"],
      upgradeInsecureRequests: true
    }
  : {
      defaultSrc: ["'self'"],
      scriptSrc: ["'self'", "'unsafe-inline'", "'unsafe-eval'"],
      styleSrc: ["'self'", "'unsafe-inline'"],
      imgSrc: ["'self'", 'data:', '*']
    };

// helmet({ contentSecurityPolicy: { directives: cspDirectives } })

運用上の考慮点

セキュリティ設定は一歩間違うとアプリケーションの動作に影響を与えるため、以下の点に注意が必要です:

  • 段階的な適用:開発→ステージング→本番へと徐々に厳しくする
  • ログ監視:CSP違反報告をreport-uriまたはreport-toで収集
  • パフォーマンス影響:HSTSやCSPのキャッシュ期間を適切に設定

トラブルシューティング

代表的な問題とその解決策:

  • スタイルが適用されない → CSPに'unsafe-inline'の一時的追加で確認
  • 外部API呼び出しがブロックされる → connectSrcにドメインを追加
  • WebSocket接続失敗 → wssスキームをconnectSrcに含める

継続的なセキュリティ維持

セキュリティは一度設定すれば完了ではなく、定期的な見直しが必要です。依存関係の更新とともに、helmetのバージョンアップや新しい脅威への対応も検討すべきです。

タグ: Node.js Sails.js Helmet セキュリティヘッダー csp

6月21日 17:11 投稿