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のバージョンアップや新しい脅威への対応も検討すべきです。