ARTICLE

FastAPIマルチテナント基盤の認証情報暗号化パターン【2026年版】— Fernet×広告5社連携×鍵ローテーションの実装ガイド

2026/9/16 (更新: 2026/9/1)

SHARE

FastAPIマルチテナント基盤の認証情報暗号化パターン。Fernet×広告5社連携×鍵ローテーションの実装【2026年版】

Fa

FastAPIマルチテナント基盤の認証情報暗号化パターン【2026年版】— Fernet×広告5社連携×鍵ローテーションの実装ガイド

ARTICLE株式会社renue
renue

株式会社renue

2026/9/16 公開2026/9/1 更新

AI導入・DXの悩みをプロに相談してみませんか?

AIやDXに関する悩みがありましたら、お気軽にrenueの無料相談をご利用ください。 renueのAI支援実績、コンサルティングの方針や進め方をご紹介します。

広告運用プラットフォーム(Google Ads/Meta/TikTok/X/LINE)のAPI連携を社内ツールに組み込む際、最大の設計課題が「顧客ごとのアクセストークン/リフレッシュトークン/デベロッパートークンをどう保管するか」だ。平文でDBに置けば事故一発で全顧客のアカウントが危険にさらされる。本記事ではマルチテナント基盤で一般的に採用されるFernet対称鍵暗号 + SQLAlchemy型変換レイヤーによる認証情報永続化パターンを、実装コードと共に解説する。

なぜ「平文でDBに保存」がダメなのか

  • DB漏洩即破滅: MySQLダンプ1つで全顧客のAPIアカウントが第三者に使える状態になる
  • バックアップ拡散: 定期バックアップ・レプリカ・開発環境コピーに平文が残る
  • ログ混入リスク: クエリログやstr(model)で平文が吐き出される事故
  • 開発者の過剰権限: アプリ開発者が本番DBを覗けると、顧客の広告アカウントを閲覧できてしまう
  • コンプライアンス: プライバシーマーク/ISMS/SOC2 監査で「暗号化していない」は即指摘

一方で「KMS/Vaultを1発導入」は中小SaaSには重すぎる。本記事のゴールは「Pythonのcryptographyライブラリだけで、重厚なインフラ追加なしに」認証情報を安全に永続化する現実解を提示することだ。

Fernet: 何を選んで何を捨てるか

Fernetはcryptographyライブラリが提供する対称鍵認証付き暗号化スキームだ。内部的にはAES-128-CBC + HMAC-SHA256で構成されている。

特性Fernetの採用
アルゴリズムAES-128-CBC + HMAC-SHA256 (認証付き暗号)
鍵長32バイト(256ビット) URL-safe base64
IV暗号化ごとにランダム生成(自動)
トークン形式version + timestamp + IV + ciphertext + HMAC
改ざん検知あり(HMAC)
鍵ローテーションMultiFernetで複数鍵同時対応可

選ばなかった選択肢

  • 自前AES実装: IVとHMACの実装ミスが命取り — 選ばない
  • MySQL AES_ENCRYPT関数: 鍵がSQLログに漏れる・ECBモードで弱い
  • Azure Key Vault直接: 各リクエストでKMSコール発生=コスト/レイテンシ増
  • pgp_sym_encrypt (PostgreSQL): MySQL環境では使えない

レイヤー1: 極小のcipherラッパー(30行)

認証情報暗号化のコア実装は驚くほどシンプルで、実用上30行で十分だ。

設計上の勘所

  • None透過: Noneが来たらNoneを返す — DBのNULLableカラムと整合
  • 鍵は毎回settingsから取る: 将来KMS経由で動的取得に置き換えやすい
  • InvalidTokenをValueErrorにラップ: 呼び出し側の例外処理を薄くできる
  • UTF-8固定: 日本語文字列(account_name等)も暗号化対象になるため明示
  • モジュールレベル関数で提供: クラス化するほどの状態がない — Fernetインスタンスはステートレス

レイヤー2: 鍵生成とsettings配置

Fernet鍵の生成は1コマンドで済む。

これを専用の環境変数として設定する。

環境別の鍵管理戦略

環境鍵の保管場所配布方法
ローカル開発.env.local (gitignore)1Password等で共有
CIGitHub Actions Secrets組織管理者のみアクセス
ステージングAzure Key Vault → App Service環境変数Managed Identity経由
本番Azure Key Vault → App Service環境変数限定ロールのみ閲覧可

重要なのは環境ごとに別の鍵を使うこと。本番の鍵で暗号化したデータを開発環境にコピーしても復号できない設計にすると、バックアップからの情報漏洩リスクを最小化できる。

レイヤー3: 複数広告プラットフォームをまたぐ共通利用

この暗号化ヘルパーの真価は「5広告プラットフォームで同一パターンを使い回せる」点だ。Google Ads/Meta/TikTok/X/LINE Adsそれぞれに別実装を書く必要がない。

Meta/TikTok/X/LINEのルーターも全く同じ共通の復号ヘルパーを通すパターン。読みやすさと監査性が両立する。

保存時のパターン(create/update)

認証情報カラムは常に共通の暗号化ヘルパーを通す。識別用のaccount_name等は平文という使い分けが実運用で重要になる(検索・UI表示で必要)。

レイヤー4: SQLAlchemy TypeDecoratorで完全自動化(発展形)

暗号化・復号の呼び出しを書き忘れると致命的な事故になる。発展形としてSQLAlchemy TypeDecoratorで暗号化を型レベルに埋め込む設計がある。

この設計だとアプリケーションコード側は暗号化の存在を意識しない。SELECT時に自動復号、INSERT/UPDATE時に自動暗号化される。ただしLIKE検索や完全一致検索ができなくなる副作用があるため、検索対象のカラムには使わない。

レイヤー5: 鍵ローテーション(MultiFernet)

「鍵は半年〜1年で交換する」のがセキュリティベストプラクティスだ。FernetはMultiFernetで複数鍵を同時に扱えるため、ダウンタイムゼロの鍵交換が可能。

鍵ローテーションの5段階フロー

  1. 新鍵生成: Fernetの鍵生成機能で新鍵を作る
  2. MultiFernetに追加: [new_key, old_key]の順で両方サポート状態に
  3. rewrap バッチ: 既存DB行を順次読み出し→復号→新鍵で再暗号化して更新
  4. 旧鍵除去: 全件rewrap完了後、旧鍵を環境変数から削除
  5. MultiFernet撤去: 単一鍵運用に戻す

rewrap処理は深夜メンテ枠で回し、進捗はログに記録しておくと安心だ。

よくある設計ミスと対策

ミス影響対策
鍵をgit管理リポジトリ全体が危険.gitignore + pre-commit hook
鍵を全環境共通開発DBコピーから本番漏洩環境別鍵 + 定期ローテ
鍵をログに出力ログ基盤経由で漏洩ロガーのredact設定
復号結果をキャッシュメモリダンプで漏洩必要な時だけ復号・破棄
exception messageに平文エラー監視SaaS経由で漏洩exceptionは汎用メッセージのみ

KMS/Vaultに移行する判断基準

本記事のFernet + env_varパターンは「スタートアップ〜中規模SaaS」に最適解だが、以下の状況ではAzure Key Vault / AWS KMS / HashiCorp Vault への移行を検討すべき。

  • SOC2 Type 2/ISO 27001取得が必要: 鍵管理の監査ログが要求される
  • 開発者が50人を超えた: 鍵配布の人間リスクが無視できない
  • マルチリージョン展開: リージョンごとに鍵管理が必要
  • Hardware Security Module要件: FIPS 140-2等のコンプラ要件がある
  • 自動ローテーションを組み込みたい: MultiFernet手運用は限界がある

まとめ

  1. 30行のFernetラッパーで広告5社分の認証情報を統一パターンで暗号化できる
  2. None透過 + UTF-8固定 + InvalidToken→ValueErrorラップでAPIが綺麗になる
  3. 環境別鍵で開発DBコピーからの情報漏洩を防ぐ
  4. TypeDecorator発展形で暗号化を型に埋め込み、実装ミスをゼロにする
  5. MultiFernetでダウンタイムゼロ鍵ローテーションを実現
  6. KMS/Vault移行判断はスケール/コンプラ要件を基準に

あわせて読みたい

AI活用のご相談はrenueへ

renueは自社開発のAIツールを自社運用するAIコンサルティングファームです。

→ 詳細を見る

SHARE

FAQ

よくある質問

一般的には半年〜1年に1回が目安です。社員の離職時/セキュリティインシデント発生時には即座に実施します。鍵世代をDB上で管理し、新旧鍵が共存する期間に既存データを段階的に再暗号化する設計が運用負荷を抑えます。

効きません。Fernet暗号化は同じ平文でも毎回異なる暗号文になる(IVランダム)ため、完全一致検索もできません。検索が必要なカラム(account_name等)は平文で別カラムに保持します。

AWS環境ならKMS Client-Side Encryption、Azure環境ならKey Vault + Managed HSM、全部入りならHashiCorp Vault Transit Engineが選択肢です。ただし初期導入コストと運用複雑度を考慮すると、中小SaaSではまずFernetで始めるのが現実的です。

主に、Fernet(AES-128-CBC+HMAC-SHA256)、AWS KMS/Azure Key Vault/HashiCorp Vault、対称鍵/非対称鍵、データ暗号化キー(DEK)/鍵暗号化キー(KEK)の階層構造、エンベロープ暗号化、鍵ローテーション戦略、テナント別キー分離、Audit Log、Identity Federation、ChatOpsによる障害連絡、AIによる支援を活用したセキュリティチェック、AgentOps、データガバナンス、外部AIパートナー連携、社員教育、KPIモニタリング、などです。

主に、CISOガバナンスと暗号化標準の文書化、AIによる支援を活用した監査ログ・異常検知、SRE/プラットフォームエンジニアリングとの連携(KMS・HSM・MLOps)、AIエージェントによる鍵ローテーション・コンプライアンス検証、AgentOps、ChatOpsによる障害・通知連絡、データガバナンス(鍵・認証情報・PII)、外部AIパートナー(KMSベンダー)との連携、社員教育、コンプライアンス監査(SOC 2・ISO 27001)、KPIモニタリング、PDCAサイクル、です。

AI導入・DXの悩みをプロに相談してみませんか?

AIやDXに関する悩みがありましたら、お気軽にrenueの無料相談をご利用ください。 renueのAI支援実績、コンサルティングの方針や進め方をご紹介します。

関連記事

AI導入・DXの悩みをプロに相談してみませんか?

AIやDXに関する悩みがありましたら、お気軽にrenueの無料相談をご利用ください。renueのAI支援実績、コンサルティングの方針や進め方をご紹介します。

無料資料をダウンロード