Skip to content

セキュリティ標準

26.1. データ暗号化

26.1.1. 転送データ (In-Transit)

  • すべての外部通信はTLS 1.2以上を使用しなければなりません。
  • TLS 1.0、1.1は使用しません。
  • 内部サービス間通信もHTTPSを使用することを推奨します。

26.1.2. 保存データ (At-Rest)

  • データベースに保存される機密情報(パスワード、個人情報)は必ず暗号化します。
  • パスワードはBCryptアルゴリズムでハッシュ化します。平文での保存は絶対に許容しません。
java
@Bean
public PasswordEncoder passwordEncoder() {
  return new BCryptPasswordEncoder();
}
  • その他の機密データにはAES-256暗号化を適用します。

26.1.3. 禁止アルゴリズム

以下のアルゴリズムはセキュリティ上の脆弱性が判明しているため使用しません。

禁止アルゴリズム理由
MD5衝突攻撃に脆弱
SHA-1衝突攻撃に脆弱
DES鍵長が不十分
RC4多数の脆弱性

26.2. 認証および権限

26.2.1. Spring Security適用

  • すべてのバックエンドプロジェクトはSpring Securityを適用しなければなりません。
  • SecurityFilterChainをBeanとして登録し、セキュリティ設定を管理します。
java
@Configuration
@EnableWebSecurity
public class SecurityConfig {

  @Bean
  public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    return http
        .csrf(csrf -> csrf.disable())
        .sessionManagement(session ->
            session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
        .authorizeHttpRequests(auth -> auth
            .requestMatchers("/api/auth/**").permitAll()
            .requestMatchers("/api/admin/**").hasRole("ADMIN")
            .anyRequest().authenticated())
        .build();
  }
}

26.2.2. RBAC適用

  • ロールベースアクセス制御(RBAC)を適用しなければなりません。
  • 最小権限の原則に従います。ユーザーに必要最低限の権限のみを付与します。

26.2.3. セッション管理

  • REST APIはStateless方式を使用します。サーバー側のセッションは使用しません。
  • 認証トークン(JWT等)には適切な有効期限を設定します。

26.3. 入力検証

26.3.1. Bean Validation

すべてのAPIリクエストDTOにBean Validationアノテーションを適用します。

java
public record CreateUserRequest(
    @NotBlank(message = "名前は必須です。")
    @Size(max = 50, message = "名前は50文字以内でなければなりません。")
    String name,

    @NotBlank(message = "メールアドレスは必須です。")
    @Email(message = "正しいメールアドレス形式ではありません。")
    String email,

    @NotBlank(message = "パスワードは必須です。")
    @Size(min = 8, max = 100, message = "パスワードは8文字以上100文字以下でなければなりません。")
    String password
) {}

Controllerで @Valid を使用して検証をトリガーします。

java
@PostMapping("/users")
public ResponseEntity<UserResponse> createUser(@Valid @RequestBody CreateUserRequest request) {
  return ResponseEntity.status(HttpStatus.CREATED)
      .body(userService.createUser(request));
}

26.3.2. XSS防御

  • ユーザー入力をHTMLにレンダリングする際は必ずエスケープ処理を行います。
  • Vue.jsの二重中括弧()はデフォルトでエスケープを実行します。
  • v-html の使用は禁止します。やむを得ない場合はDOMPurify等のライブラリで浄化します。

26.3.3. SQL Injection防御

  • jOOQの型安全DSL APIを使用してパラメータバインディングを自動的に適用します。
  • jOOQ DSLを通じて記述されたクエリは自動的にprepared statementに変換され、SQL Injectionを防止します。
  • 文字列ベースのraw SQLは使用しません。
java
// 誤った例(文字列結合 — SQL Injectionリスク)
dsl.execute("SELECT * FROM users WHERE name = '" + name + "'");

// 正しい例(jOOQ DSL — 自動パラメータバインディング)
dsl.selectFrom(USERS)
    .where(USERS.NAME.eq(name))
    .fetch();

26.4. 依存関係セキュリティ

26.4.1. ツール適用

  • OWASP Dependency-CheckをMavenプラグインとして適用します。(Mavenビルド設定ドキュメント参照)
  • CVSSスコア7以上の脆弱性が検出された場合、ビルドを失敗させます。
  • セキュリティスキャンはCIパイプラインで定期的に実行します。

26.4.2. 依存関係アップデートポリシー

  • セキュリティ上の脆弱性が発見された依存関係は7日以内にパッチバージョンへアップデートします。
  • 定期的に(最低月1回)依存関係のバージョンを点検します。

26.5. シークレット管理

26.5.1. 禁止事項

  • ソースコードにパスワード、APIキー、トークン等を絶対にハードコーディングしてはなりません。
  • Git履歴にシークレットが含まれている場合、当該シークレットを直ちに無効化し再発行します。

26.5.2. 管理方法

環境管理方法
ローカル開発.env.local ファイル(Git非追跡)
CI/CDCircleCI Environment Variables / Context
プロダクション環境変数またはシークレットマネージャ

26.5.3. シークレット漏洩防止

  • .gitignore.env.local*.key*.pem 等を含めます。
  • CIでシークレットスキャンツール(例:git-secrets、gitleaks)を実行することを推奨します。

TIENIPIA QUALIFIED STANDARD