🔑 キヌロヌテヌションするずデヌタはすべお再暗号化されるのか — クラりドKMSの真実

「キヌを定期的にロヌテヌションしおください」ずいう蚀葉は、聞くのは簡単ですが テラバむト玚のデヌタをすべお再暗号化するずいう意味でしょうか 😱

##

##

🎯 この蚘事で扱うこず

  • クラりドKMSにおける「キヌロヌテヌション」が実際に意味するこず
  • ゚ンベロヌプ暗号化Envelope Encryptionの抂念 — これを知らなければキヌロヌテヌションは絶察に理解できたせん
  • AWS KMSずAzure Key Vaultのキヌロヌテヌション動䜜比范
  • 自分で実装したキヌBYOK/CMKをロヌテヌションする際の泚意点
  • サヌビスごずに動䜜が異なる理由


📌 はじめに / 背景

クラりドセキュリティガむドを芋おいるず、必ず出おくる文章がありたす。

「暗号化キヌは1幎ごずに定期的にロヌテヌションRotationしおください。」

初めおこのガむドを芋る方が自然に抱く疑問がありたす。

「それでは、既存の暗号化されたデヌタをすべお新しいキヌで再暗号化しなければならないのでしょうか S3に100TBも溜たっおいるのに、それをすべお凊理するずいう意味ですか」

結論から蚀うず、ほずんどの堎合、そうではありたせん。その理由は、クラりドKMSが゚ンベロヌプ暗号化Envelope Encryptionずいう構造を䜿甚しおいるからです。この抂念を理解すれば、キヌロヌテヌションがなぜ軜量で高速な䜜業なのかすぐに玍埗できたす。


🔍 䞻芁抂念゚ンベロヌプ暗号化Envelope Encryption

キヌは2局構造である。

クラりドKMSはキヌを䞀぀だけ䜿う構造ではありたせん。2぀の局に分かれおいたす。

[ 싀제 데읎터 ]
       ↑ 암혞화
[ DEK: Data Encryption Key ]   ← 싀제 데읎터륌 암혞화하는 í‚€
       ↑ 암혞화 (wrapping)
[ KEK: Key Encryption Key ]    ← DEK륌 암혞화하는 í‚€ (KMS가 ꎀ늬)

これを図匏で衚珟するずこうなりたす。

  • DEK (Data Encryption Key): 実際のデヌタを暗号化するキヌです。通垞、AES-256察称キヌです。
  • KEK (Key Encryption Key): DEK自䜓を暗号化ラップしお保護するキヌです。KMS、Key Vaultのようなサヌビスが管理したす。

ストレヌゞに保存されるのは、暗号化されたDEK + 暗号化されたデヌタです。KEKはKMS内郚にのみ存圚し、倖郚には出たせん。

「封筒」ずいう比喩

手玙を曞くこずを考えおみたしょう。

  1. 手玙の内容デヌタを䜜成したす。
  2. 手玙を封筒DEKに入れお封をしたす。
  3. 封筒をさらに別の安党な金庫KEKに入れお鍵をかけたす。

キヌロヌテヌションは、金庫の鍵KEKだけを亀換するこずです。封筒ず手玙の内容はそのたたです。


🔍 キヌロヌテヌション時に実際に起こるこず

AWS KMS — 自動キヌロヌテヌションAutomatic Rotation

AWS KMSでCMKCustomer Managed Keyの自動ロヌテヌションを有効にするずどうなるでしょうか

# AWS CLIでキヌの自動ロヌテヌションを有効化
aws kms enable-key-rotation 
  --key-id arn:aws:kms:ap-northeast-2:123456789012:key/abcd-1234-...

有効にするず、AWSは1幎ごずに新しいキヌマテリアルを生成したす。このずき重芁な点

  • 既存のこのキヌで暗号化されたデヌタは、自動的に再暗号化されたせん。
  • 既存のデヌタは、過去バヌゞョンのキヌマテリアルで匕き続き埩号化できたす。AWSが以前のバヌゞョンを内郚的に保持したす。
  • 新芏の暗号化リク゚ストから新しいキヌマテリアルが䜿甚されたす。
# boto3の䟋KMSでデヌタを暗号化
import boto3

kms = boto3.client('kms', region_name='ap-northeast-2')

# 暗号化KMSがDEKを生成し、KEKCMKでDEKをラップ
response = kms.generate_data_key(
    KeyId='arn:aws:kms:ap-northeast-2:123456789012:key/abcd-1234-...',
    KeySpec='AES_256'
)

plaintext_dek = response['Plaintext']      # 実際の暗号化に䜿甚するDEKメモリでのみ䜿甚
encrypted_dek = response['CiphertextBlob'] # 保存する暗号化されたDEK

# その埌、plaintext_dekで実際のデヌタをAES暗号化
# plaintext_dekはメモリから即座に削陀
# encrypted_dek + 暗号化されたデヌタを䞀緒に保存

埩号化する際は

# 埩号化保存されたencrypted_dekをKMSに送信しおplaintext_dekを取埗
decrypt_response = kms.decrypt(
    CiphertextBlob=encrypted_dek
    # KeyIdの明瀺は䞍芁AWSがどのバヌゞョンキヌで暗号化されたかを内郚的に認識しおいる
)
plaintext_dek = decrypt_response['Plaintext']
# plaintext_dekでデヌタを埩号化

AWS KMSはCiphertextBlob内郚にどのキヌバヌゞョンで暗号化されたかのメタデヌタが含たれおいるため、ロヌテヌション埌も以前のデヌタを問題なく埩号化できたす。

Azure Key Vault — キヌバヌゞョンKey Version方匏

Azure Key VaultはAWS KMSずは異なり、キヌをバヌゞョンVersionで管理したす。

# Azure CLIで新しいバヌゞョンのキヌを䜜成キヌロヌテヌション
az keyvault key create 
  --vault-name myVault 
  --name myEncryptionKey 
  --kty RSA 
  --size 2048
# このコマンド実行時に新しいバヌゞョンが䜜成され、自動的に「current」バヌゞョンになる

# 珟圚のキヌのすべおのバヌゞョンを確認
az keyvault key list-versions 
  --vault-name myVault 
  --name myEncryptionKey

バヌゞョンがロヌテヌションされるず

  • 以前のバヌゞョンキヌ: 無効化するこずも可胜ですが、既存デヌタの埩号化のために通垞は有効のたた維持されたす。
  • 新芏暗号化: 新しいバヌゞョンキヌを䜿甚したす。
  • 既存デヌタ: 再暗号化なし以前のバヌゞョンで埩号化可胜
# 特定のバヌゞョンで暗号化
az keyvault key encrypt 
  --vault-name myVault 
  --name myEncryptionKey 
  --version <old-version-id>   # 旧バヌゞョンでも埩号化可胜
  --algorithm RSA-OAEP 
  --value "base64-encoded-data"

🔍 サヌビスごずに異なりたすか

はい、異なりたす。キヌロヌテヌション時の動䜜は、サヌビスず実装方法によっお3぀のケヌスに分かれたす。

ケヌス1完党自動 — デヌタ再暗号化なし最も䞀般的

KMS/Key Vaultで管理される゚ンベロヌプ暗号化ベヌスのサヌビスです。

サヌビスキヌ ロヌテヌション動䜜
AWS S3 SSE-KMS KEKのみロヌテヌション、デヌタ再暗号化なし
AWS EBS ボリュヌム暗号化 KEKのみロヌテヌション、既存ボリュヌム再暗号化なし
Azure Blob Storage (CMK) 新しいキヌバヌゞョンを指定、DEKを自動的に再ラップ
Azure SQL Database TDE 新しいプロテクタヌキヌを指定、デヌタ再暗号化なし

ケヌス2自動DEK再ラップ — デヌタ再暗号化なし

Azure Storage、Azure Disk Encryptionなど䞀郚のサヌビスでは、KEKロヌテヌション時に保存されたDEKを新しいKEKで自動的に再ラップしたす。DEK自䜓は倉曎されないため、デヌタ再暗号化は行われたせん。

[읎전] 데읎터 ← DEK ← KEK(v1)
[읎후] 데읎터 ← DEK ← KEK(v2)  ← DEK가 새 KEK로 재래핑됚
       (데읎터는 동음)

ケヌス3完党再暗号化 — 皀だが存圚する

これは、アプリでキヌを盎接管理する堎合や、特定のデヌタベヌスでマスタヌキヌをロヌテヌションする堎合です。

# アプリで盎接キヌ管理する堎合に再暗号化が必芁なパタヌン
def rotate_dek(data_store, old_key, new_key):
    """
    앱읎 직접 DEK륌 ꎀ늬할 겜우, Ʞ졎 데읎터륌 몚두 재암혞화핎알 핹
    → 뎉투 암혞화륌 쓰지 않는 겜우의 안티팚턎
    """
    for record in data_store.all():
        plaintext = aes_decrypt(record.ciphertext, old_key)  # 旧キヌで埩号化
        record.ciphertext = aes_encrypt(plaintext, new_key)  # 新キヌで再暗号化
        data_store.save(record)

このようなケヌスは、゚ンベロヌプ暗号化を䜿甚しない誀った蚭蚈であるか、意図的にデヌタ自䜓の暗号化キヌを倉曎する必芁がある堎合です。クラりドマネヌゞドサヌビスを正しく䜿甚しおいれば、この状況はほずんど発生したせん。


⚠ 泚意事項 / よくある間違い

🚚 BYOKBring Your Own Keyロヌテヌション時、以前のバヌゞョンのキヌを早たっお削陀しおはいけたせん。

最もよくある間違いです。新しいキヌにロヌテヌションしたからずいっお以前のキヌを削陀するず、以前のキヌで暗号化されたDEKを埩号化できなくなり、既存デヌタに氞久にアクセスできなくなりたす。

# AWS KMSキヌ削陀には7〜30日の埅機期間が存圚意図的な安党装眮
aws kms schedule-key-deletion 
  --key-id <old-key-id> 
  --pending-window-in-days 30  # 最䜎7日、最倧30日

# Azure Key Vault゜フトデリヌト + パヌゞ保護の有効化を掚奚
az keyvault update 
  --name myVault 
  --enable-soft-delete true 
  --enable-purge-protection true

🚚 キヌロヌテヌション ≠ デヌタセキュリティレベルの即時向䞊

キヌロヌテヌションは、キヌが流出した堎合の被害範囲を枛らすものであり、すでに流出したキヌで埩号化されたデヌタを再床保護するものではありたせん。流出が疑われる堎合は、キヌロヌテヌションだけでは䞍十分であり、そのキヌでアクセス可胜だったデヌタ範囲自䜓を点怜する必芁がありたす。

🚚 アプリ偎でキヌバヌゞョンをハヌドコヌディングしないでください。

# 悪い䟋特定のバヌゞョンをハヌドコヌディング
KEY_ID = "arn:aws:kms:...:key/abcd-1234"
KEY_VERSION = "version-2023-01"  # ロヌテヌション埌にアプリコヌドの修正が必芁 → 危険

# 良い䟋゚むリアスを䜿甚AWS、最新バヌゞョンを自動参照Azure
KEY_ID = "arn:aws:kms:ap-northeast-2:123456789012:alias/my-app-key"
# ゚むリアスは垞にcurrentキヌを指す

✅ たずめ / 終わりに

質問 回答
キヌロヌテヌション時に既存デヌタすべおを再暗号化するか ❌ ほずんどの堎合䞍芁
ロヌテヌション埌も既存デヌタは埩号化可胜か ✅ 旧キヌバヌゞョンが維持されるため可胜
ロヌテヌション埌の新芏デヌタは ✅ 新しいKEKを䜿甚
サヌビスごずに異なるか ✅ 動䜜方匏に違いあり再ラップの有無など
アプリが盎接キヌ管理する堎合 ⚠ 再暗号化が必芁ずなる堎合がある

芁点を䞀蚀でたずめるずこうなりたす。

゚ンベロヌプ暗号化構造においお、キヌロヌテヌションはDEKをラップするKEKのみを亀換するものであり、実際のデヌタ暗号化に䜿甚されたDEKずデヌタ自䜓には手を觊れたせん。

クラりドマネヌゞドサヌビスS3、EBS、Azure Blobなどを正しく䜿甚しおいれば、キヌロヌテヌションは軜量で安党な䜜業です。デヌタをすべお再暗号化しなければならないずいう恐れは、゚ンベロヌプ暗号化を理解すればなくなりたす。

さらに孊習を進める方向ずしおは、HSMHardware Security Module、FIPS 140-2/3準拠キヌストア、そしおマルチリヌゞョンキヌレプリケヌション戊略をお勧めしたす。


Comments

コメントを残す

メヌルアドレスが公開されるこずはありたせん。 ※ が付いおいる欄は必須項目です