ãããŒã宿çã«ããŒããŒã·ã§ã³ããŠãã ããããšããèšèã¯ãèãã®ã¯ç°¡åã§ããâŠãã©ãã€ãçŽã®ããŒã¿ããã¹ãŠåæå·åãããšããæå³ã§ããããïŒ ð±
##

##
ð¯ ãã®èšäºã§æ±ãããš
- ã¯ã©ãŠã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å éšã«ã®ã¿ååšããå€éšã«ã¯åºãŸããã
ãå°çããšããæ¯å©
æçŽãæžãããšãèããŠã¿ãŸãããã
- æçŽã®å 容ïŒããŒã¿ïŒãäœæããŸãã
- æçŽãå°çïŒDEKïŒã«å ¥ããŠå°ãããŸãã
- å°çãããã«å¥ã®å®å šãªé庫ïŒ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æºæ ããŒã¹ãã¢ããããŠãã«ããªãŒãžã§ã³ããŒã¬ããªã±ãŒã·ã§ã³æŠç¥ããå§ãããŸãã
ã³ã¡ã³ããæ®ã