鍵ローテーションとは
鍵ローテーション(Key Rotation)は、使用中の暗号鍵を定期的に新しい鍵に置き換えるセキュリティプラクティスです。これにより、鍵が漏洩した場合の影響を限定し、暗号解読のリスクを軽減します。
鍵ローテーションのメリット:
- 被害範囲の限定:鍵漏洩時に影響を受けるデータを限定
- コンプライアンス対応:PCI DSS、HIPAAなどの規制要件を満たす
- 暗号解読リスクの軽減:同一鍵での暗号化データ量を制限
- 鍵管理プロセスの確認:ローテーション作業を通じて手順を検証
ローテーションの種類
自動ローテーション
KMSなどのサービスが自動的に鍵を更新します。人為的ミスを防ぎ、確実にローテーションが実行されます。
# AWS KMSでの自動ローテーション有効化
aws kms enable-key-rotation --key-id 1234abcd-12ab-34cd-56ef-1234567890ab
# ローテーション状態の確認
aws kms get-key-rotation-status --key-id 1234abcd-12ab-34cd-56ef-1234567890ab
手動ローテーション
新しい鍵を生成し、アプリケーションを更新して新しい鍵を使用するよう切り替えます。より細かい制御が可能ですが、運用負荷が高くなります。
AIエンジニアとしての実体験
AIサービスのAPIキーのローテーションを自動化するシステムを構築しました。HashiCorp Vaultを使用して、アプリケーションを再起動せずに鍵を更新できる仕組みを実装しました。
# Vaultを使用した動的シークレット取得
import hvac
class SecretManager:
def __init__(self):
self.client = hvac.Client(url='https://vault.example.com')
self.client.token = os.environ['VAULT_TOKEN']
self._cache = {}
self._last_refresh = 0
def get_api_key(self, key_name: str) -> str:
# TTLに基づいてキャッシュを更新
if self._should_refresh():
secret = self.client.secrets.kv.v2.read_secret_version(
path=f'api-keys/{key_name}'
)
self._cache[key_name] = secret['data']['data']['value']
self._last_refresh = time.time()
return self._cache.get(key_name)
def _should_refresh(self) -> bool:
# 5分ごとに更新
return time.time() - self._last_refresh > 300
自社サーバー運用への応用
推奨ローテーション間隔
| 鍵の種類 | 推奨間隔 | 備考 |
|---|---|---|
| マスター鍵(KEK) | 1年 | AWS KMSは自動で年次ローテーション |
| データ暗号化鍵(DEK) | 30-90日 | アプリケーション依存 |
| APIキー | 90日 | PCI DSS要件 |
| TLS証明書 | 90日 | Let's Encryptの有効期限 |
| SSH鍵 | 1年 | ユーザー退職時は即座に無効化 |
ダウンタイムなしのローテーション
古い鍵と新しい鍵を一定期間併用することで、サービス停止なしにローテーションできます。
# 複数バージョンの鍵をサポート
def decrypt_with_fallback(encrypted_data: bytes, key_versions: list) -> bytes:
for key in key_versions:
try:
return decrypt(encrypted_data, key)
except DecryptionError:
continue
raise DecryptionError("No valid key found")
関連ブログ記事
📝 関連記事
最新動向(2026年)
自動ローテーションの標準化
主要クラウドサービスでは、ほとんどの鍵タイプで自動ローテーションがデフォルトまたは推奨設定になっています。
ゼロダウンタイムローテーション
Kubernetesのシークレット管理やサービスメッシュと連携し、アプリケーションを再起動せずに鍵を更新する仕組みが普及しています。
トラブル事例と対策
⚠️ ローテーション後のデータ復号失敗
問題:古い鍵で暗号化されたデータが復号できなくなる
対策:鍵バージョン管理を実装し、古いバージョンでの復号をサポート
⚠️ キャッシュされた古い鍵の使用
問題:アプリケーションが古い鍵をキャッシュし続ける
対策:TTLベースのキャッシュ更新、またはイベント駆動での鍵リロード
