Skip to content

⚙️ 環境変数・セキュリティ設定の完全セットアップ #5

Description

@tocie

概要

環境変数の管理、Firebaseセキュリティルール、OpenAI APIキーの設定など、セキュリティ関連の設定を完全にセットアップする。

前提条件

  • Firebase プロジェクト初期化完了
  • 認証基盤セットアップ完了

タスク一覧

1. 環境変数管理の完全セットアップ

  • .env ファイルの作成(ローカル開発用)
  • .env.example ファイルの作成(テンプレート)
  • .gitignore に機密ファイルの追加確認
  • 本番環境用環境変数の設定計画

2. Firebase Security Rules の実装

  • firestore.rules ファイルの作成
  • @keio.jp ドメイン制限ルールの実装
  • ユーザー権限管理ルールの実装
  • Security Rules のテスト実行

3. OpenAI Moderation API 準備

  • OpenAI API キーの取得確認
  • Firebase Functions での API統合準備
  • 環境変数でのAPI キー管理
  • 投稿監視機能の設計

4. セキュリティ設定の確認

  • firebase-adminsdk.json の適切な管理
  • CORS設定の確認
  • Firebase プロジェクト権限の確認
  • 開発/本番環境の分離確認

環境変数設定

.env ファイル構成

# Firebase Configuration
FIREBASE_API_KEY=AIzaSy...
FIREBASE_AUTH_DOMAIN=kcc-syllabus.firebaseapp.com
FIREBASE_PROJECT_ID=kcc-syllabus
FIREBASE_STORAGE_BUCKET=kcc-syllabus.appspot.com
FIREBASE_MESSAGING_SENDER_ID=123456789
FIREBASE_APP_ID=1:123:web:abc

# OpenAI Configuration
OPENAI_API_KEY=sk-...

# Development Settings
ENVIRONMENT=development
DEBUG_MODE=true

.env.example ファイル

# Firebase Configuration (Get from Firebase Console)
FIREBASE_API_KEY=your_api_key_here
FIREBASE_AUTH_DOMAIN=your_project.firebaseapp.com
FIREBASE_PROJECT_ID=your_project_id
FIREBASE_STORAGE_BUCKET=your_project.appspot.com
FIREBASE_MESSAGING_SENDER_ID=your_sender_id
FIREBASE_APP_ID=your_app_id

# OpenAI Configuration (Get from OpenAI Platform)
OPENAI_API_KEY=sk-your_openai_key_here

# Development Settings
ENVIRONMENT=development
DEBUG_MODE=true

Firestore Security Rules

完全なSecurity Rules実装

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // Helper Functions
    function isAuthenticated() {
      return request.auth \!= null;
    }
    
    function isKeioUser() {
      return isAuthenticated() && 
             request.auth.token.email.matches('.*@keio.jp');
    }
    
    function isOwner(userId) {
      return isKeioUser() && request.auth.uid == userId;
    }
    
    // Users Collection
    match /users/{userId} {
      allow read, write: if isOwner(userId);
      allow create: if isKeioUser() && 
                    request.auth.uid == userId &&
                    validateUserData();
    }
    
    // Subjects Collection (Read Only)
    match /subjects/{subjectId} {
      allow read: if isKeioUser();
      allow write: if false; // Only admin can write
    }
    
    // Posts Collection
    match /posts/{postId} {
      allow read: if isKeioUser();
      allow create: if isKeioUser() && 
                    request.auth.uid == resource.data.userId &&
                    validatePostData();
      allow update, delete: if isKeioUser() && 
                           request.auth.uid == resource.data.userId;
      
      // Likes Subcollection
      match /likes/{userId} {
        allow read: if isKeioUser();
        allow write: if isOwner(userId);
      }
    }
    
    // Data Validation Functions
    function validateUserData() {
      let data = request.resource.data;
      return data.keys().hasAll(['email', 'createdAt']) &&
             data.email is string &&
             data.createdAt is timestamp;
    }
    
    function validatePostData() {
      let data = request.resource.data;
      return data.keys().hasAll(['title', 'content', 'postType', 'subjectId', 'userId']) &&
             data.title is string &&
             data.content is string &&
             data.postType in ['question', 'answer', 'review'] &&
             data.subjectId is string &&
             data.userId is string;
    }
  }
}

OpenAI Moderation API 統合準備

Firebase Functions での実装準備

// functions/src/moderation.ts
import { Configuration, OpenAIApi } from 'openai';

const configuration = new Configuration({
  apiKey: process.env.OPENAI_API_KEY,
});

export const moderateContent = async (text: string) => {
  const openai = new OpenAIApi(configuration);
  const response = await openai.createModeration({
    input: text,
  });
  return response.data.results[0];
};

セキュリティチェックリスト

  • 機密情報が .gitignore されている
  • 環境変数が適切に設定されている
  • Firebase Security Rules が適切に設定されている
  • OpenAI API キーが安全に管理されている
  • 開発環境と本番環境が分離されている
  • CORS設定が適切である
  • 認証トークンが適切に検証されている

本番環境設定

Firebase Functions 環境変数

firebase functions:config:set openai.api_key="sk-..."
firebase functions:config:set app.environment="production"

GitHub Actions Secrets (将来的に)

  • FIREBASE_SERVICE_ACCOUNT_KEY
  • OPENAI_API_KEY
  • FIREBASE_PROJECT_ID

Acceptance Criteria

  • 環境変数が適切に管理されている
  • .env.example が提供されている
  • Firebase Security Rules が動作する
  • @keio.jp 制限が Security Rules レベルで実装されている
  • OpenAI API キーが設定されている(テスト可能)
  • セキュリティテストが通過する
  • 機密情報がGitに含まれていない

テスト項目

  • Security Rules シミュレーターでのテスト
  • 非@keio.jpユーザーのアクセス拒否確認
  • 環境変数読み込みの確認
  • OpenAI API の接続テスト

参照

次のステップ

Issue #6: Angular Material UI設計とテーマ設定

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions