Skip to content

Security: SilentMalachite/SummaryWriterApp

Security

docs/SECURITY.md

セキュリティガイド

本ドキュメントでは、SummaryWriterAppのセキュリティ機能と設定方法について説明します。

実装済みセキュリティ機能

1. 認証システム

API Key認証

すべてのAPI エンドポイント(/api/text/api/history/api/statsなど)とWebSocket接続には認証が必要です。

使用方法:

# HTTPリクエストの例
curl -H "X-API-Key: your-api-key" http://localhost:8080/api/text

# WebSocket接続の例(JavaScriptクライアント)
const ws = new WebSocket('ws://localhost:8080/textHub');
ws.onopen = function() {
    // 接続後、最初のメッセージで認証
};

JWT認証(将来の拡張用)

JWT(JSON Web Token)ベースの認証も実装されており、より高度なセキュリティが必要な場合に使用できます。

トークン生成例:

import security.JWTService
import config.SecurityConfig

val config = SecurityConfig.fromEnvironment()
val token = JWTService.generateToken(config, "username")

2. CORS(Cross-Origin Resource Sharing)

異なるドメインからのアクセスを制御します。

デフォルト設定:

  • 許可されたホスト: localhost:3000, localhost:8080, 127.0.0.1:3000, 127.0.0.1:8080
  • 許可されたメソッド: GET, POST, PUT, DELETE, PATCH, OPTIONS
  • 許可されたヘッダー: Authorization, Content-Type, X-API-Key

カスタマイズ方法: 環境変数 ALLOWED_HOSTS でカンマ区切りのホストリストを指定:

export ALLOWED_HOSTS="myapp.com,api.myapp.com"

3. レート制限

DDoS攻撃や過度なリクエストを防ぐため、レート制限を実装しています。

制限:

  • グローバル: 100リクエスト/分
  • API エンドポイント: 30リクエスト/分
  • WebSocket接続: 10接続/分

4. WebSocketセキュリティ

  • マスキング有効化: masking = true でデータを保護
  • フレームサイズ制限: 最大1MB(DoS攻撃防止)
  • タイムアウト: 15秒のping/pongタイムアウト

5. エラーハンドリング

  • 内部エラーの詳細をクライアントに公開しない
  • すべての例外をログに記録(サーバーサイド)
  • ユーザーフレンドリーなエラーメッセージを返却

設定

環境変数

セキュリティ設定は環境変数で上書き可能です:

# サーバー設定
export PORT=8080
export HOST="0.0.0.0"

# JWT設定
export JWT_SECRET="your-super-secret-key-change-in-production"
export JWT_ISSUER="your-app-name"
export JWT_AUDIENCE="your-audience"

# API Key
export API_KEY="your-secure-api-key"

# CORS
export ALLOWED_HOSTS="localhost:3000,myapp.com"

設定ファイル

src/main/resources/application.conf でデフォルト値を設定できます:

ktor {
    deployment {
        port = 8080
        port = ${?PORT}
        host = "0.0.0.0"
        host = ${?HOST}
    }
}

security {
    jwt {
        secret = "change-this-secret-in-production"
        secret = ${?JWT_SECRET}
        issuer = "summary-writer-app"
        audience = "summary-writer-audience"
        realm = "SummaryWriterApp"
    }
    apiKey = "default-api-key-change-me"
    apiKey = ${?API_KEY}
}

ベストプラクティス

本番環境での推奨事項

  1. 強力なAPIキーを使用

    # 強力なランダムキーを生成
    openssl rand -base64 32
  2. JWT秘密鍵を変更

    • デフォルトの秘密鍵は絶対に使用しない
    • 最低256ビット(32文字以上)の秘密鍵を使用
  3. HTTPSを使用

    • リバースプロキシ(Nginx、Apache)でHTTPSを設定
    • すべてのHTTPトラフィックをHTTPSにリダイレクト
  4. 許可するホストを制限

    export ALLOWED_HOSTS="yourdomain.com"
  5. 定期的なセキュリティ監査

    • 依存関係の脆弱性スキャン
    • ログの監視
    • 不正アクセスの検出

開発環境での注意事項

  • デフォルトのAPIキーは開発専用です
  • 本番環境のAPIキーをコミットしない
  • .envファイルを.gitignoreに追加

セキュリティテスト

セキュリティ機能のテストを実行:

./gradlew test --tests SecurityConfigTest --tests SecurityTest

脆弱性の報告

セキュリティ上の問題を発見した場合は、GitHubのIssueではなく、プロジェクトメンテナーに直接連絡してください。

参考資料

There aren’t any published security advisories