Infrastructure
AWS KMS μμ보기
2026-04-04

Key Management Service
μνΈνμλ λ°λμ ν€κ° νμν©λλ€. κ·Έλ°λ° μ΄ ν€λ₯Ό μ΄λμ 보κ΄νκ³ κ³μ κ°μ?
μμ€μ½λμ νλμ½λ©νκ±°λ μλ² νμΌ μμ€ν μ μ μ₯νλ λ°©λ²μ κ°λ¨νμ§λ§, μλ²κ° λ«λ¦¬λ μκ° ν€λ ν¨κ» μ μΆλ©λλ€. μνΈνλ₯Ό μ무리 μ ν΄λμμ΄λ ν€κ° μ μΆλλ©΄ μ무 μλ―Έκ° μμ΅λλ€. κ²°κ΅ "ν€λ₯Ό μμ νκ² λ³΄κ΄νλ κ²" μμ²΄κ° νλμ λ¬Έμ κ° λ©λλ€.
AWS Key Management Service(KMS)λ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν μλΉμ€μ λλ€. ν€ μ체λ₯Ό AWSμ μ μ© νλμ¨μ΄ 보μ λͺ¨λ(HSM)μ 보κ΄νκ³ , νμν λλ§ μνΈν/볡νΈν μμ²μ 보λ΄λ λ°©μμΌλ‘ λμν©λλ€. KMSμ HSMμ FIPS 140-3 Level 3 μΈμ¦μ λ°μ μ₯λΉμ΄λ©°, KMS ν€μ μλ³Έ ν€ μ¬λ£(key material)λ μ΄ HSM λ°μΌλ‘ μ λ λκ°μ§ μμ΅λλ€.
λ΄ν¬ μνΈν
KMSμ ν΅μ¬ μμ΄λμ΄λ "ν€λ‘ ν€λ₯Ό κ°μΈλ" λ΄ν¬ μνΈν(Envelope Encryption)μ λλ€.
KMS ν€(λ§μ€ν° ν€)λ‘ μ§μ λ°μ΄ν°λ₯Ό μνΈννλ κ²μ΄ μλλΌ, λ°μ΄ν° ν€λ₯Ό λ³λλ‘ μμ±ν λ€ κ·Έ λ°μ΄ν° ν€λ‘ μ€μ λ°μ΄ν°λ₯Ό μνΈννκ³ , λ°μ΄ν° ν€ μ체λ KMS ν€λ‘ μνΈννμ¬ λ³΄κ΄νλ ꡬ쑰μ λλ€. μ΄λ¦ κ·Έλλ‘, λ΄ν¬ μμ λ΄ν¬κ° λ€μ΄μλ μ μ λλ€.
μνΈν κ³Όμ
1. KMSμ GenerateDataKeyλ₯Ό μμ²νλ©΄, KMSλ νλ¬Έ λ°μ΄ν° ν€μ μνΈνλ λ°μ΄ν° ν€ λ κ°μ§λ₯Ό λ°νν©λλ€.
2. μ ν리μΌμ΄μ μ νλ¬Έ λ°μ΄ν° ν€λ‘ λ°μ΄ν°λ₯Ό μνΈνν©λλ€.
3. μνΈνκ° λλλ©΄ νλ¬Έ λ°μ΄ν° ν€λ₯Ό λ©λͺ¨λ¦¬μμ μ¦μ μμ ν©λλ€.
4. μ΄νμλ μνΈνλ λ°μ΄ν° ν€μ μνΈνλ λ°μ΄ν°λ§ μ μ₯ν©λλ€.
볡νΈν κ³Όμ
1. μ μ₯ν΄λ μνΈνλ λ°μ΄ν° ν€λ₯Ό KMSμ 보λ λλ€.
2. KMSκ° μ΄λ₯Ό 볡νΈννμ¬ νλ¬Έ λ°μ΄ν° ν€λ₯Ό λ°νν©λλ€.
3. μ΄ νλ¬Έ λ°μ΄ν° ν€λ‘ λ°μ΄ν°λ₯Ό 볡νΈνν©λλ€.
4. 볡νΈνκ° λλλ©΄ λ€μ νλ¬Έ λ°μ΄ν° ν€λ₯Ό μμ ν©λλ€.
async function decryptFile(inputPath, outputPath) {
const data = fs.readFileSync(inputPath);
// 1. μ μ₯λ νμΌμμ μνΈνλ λ°μ΄ν° ν€, IV, μνΈλ¬Έ λΆλ¦¬
const encryptedDataKey = data.subarray(0, 184); // CiphertextBlob κΈΈμ΄
const iv = data.subarray(184, 200);
const encrypted = data.subarray(200);
// 2. KMSμ μνΈνλ λ°μ΄ν° ν€μ 볡νΈν μμ²
const { Plaintext } = await kms.decrypt({
CiphertextBlob: encryptedDataKey,
}).promise();
// 3. 볡νΈνλ λ°μ΄ν° ν€λ‘ νμΌ λ³΅νΈν
const decipher = crypto.createDecipheriv('aes-256-cbc', Plaintext, iv);
const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);
// 4. νλ¬Έ λ°μ΄ν° ν€ λ©λͺ¨λ¦¬μμ μ κ±°
Plaintext.fill(0);
fs.writeFileSync(outputPath, decrypted);
}μ΄ κ΅¬μ‘°μμ μ ν리μΌμ΄μ μ λ§μ€ν° ν€μ μλ³Έμ μ ν μ μ μμ΅λλ€. KMSμλ λ°μ΄ν° ν€μ μμ±κ³Ό 볡νΈν μμ²λ§ λ³΄λΌ λΏ, μ€μ λ°μ΄ν°μ μ볡νΈνλ λ‘컬μμ μνλ©λλ€.
λ°λΌμ μλ²κ° ν΄νΉλμ΄ μνΈνλ λ°μ΄ν° ν€μ μνΈνλ λ°μ΄ν°κ° λͺ¨λ μ μΆλλλΌλ, KMS ν€μ λν IAM κΆνμ΄ μμΌλ©΄ 볡νΈνκ° λΆκ°λ₯ν©λλ€.
KMS ν€μ μ’ λ₯
KMS ν€λ κ΄λ¦¬ 주체μ λ°λΌ μΈ κ°μ§λ‘ λλ©λλ€. μ΄λ€μ μ μ΄ μμ€μ΄ λμμλ‘ λμ λΉμ©μ΄ λ°μνκ³ , νΈμμ±μ΄ λμμλ‘ μ μ΄ λ²μκ° μ€μ΄λλ νΈλ μ΄λμ€νλ₯Ό κ°μ΅λλ€.
κ³ κ° κ΄λ¦¬ν ν€ (Customer Managed Key)
μ¬μ©μκ° μ§μ μμ±νκ³ κ΄λ¦¬νλ ν€μ λλ€. ν€ μ μ± , IAM μ μ± , κΆν λΆμ¬(Grant) λ±μ ν΅ν΄ μμ ν μ μ΄κ° κ°λ₯νλ©°, νμ±ν/λΉνμ±ν, μλ νμ μ€μ , μμ μμ½ λ±μ ν μ μμ΅λλ€. CloudTrailμ ν΅ν μ¬μ© κ°μ¬λ κ°λ₯ν©λλ€. μλ³ μκΈκ³Ό μ¬μ©λ κΈ°λ° μκΈμ΄ λ°μν©λλ€.
AWS κ΄λ¦¬ν ν€ (AWS Managed Key)
AWS μλΉμ€κ° μ¬μ©μ κ³μ μ μλμΌλ‘ μμ±νλ ν€μ λλ€. `alias/aws/s3`, `alias/aws/ebs`μ κ°μ΄ `aws/` μ λμ¬κ° λΆμ λ³μΉμ κ°μ§λλ€. μμ± λ³κ²½μ΄ λΆκ°λ₯νκ³ , ν΄λΉ AWS μλΉμ€μ 컨ν μ€νΈμμλ§ μ¬μ©ν μ μμ΅λλ€. μ° 1ν μλ νμ μ΄ νμμ΄λ©°, μλ³ μκΈμ μκ³ μ¬μ© μκΈλ§ λ°μν©λλ€.
AWS μμ ν€ (AWS Owned Key)
AWS μλΉμ€κ° λ΄λΆμ μΌλ‘ μμ νκ³ κ΄λ¦¬νλ λ€μ€ κ³μ μ© ν€μ λλ€. μ¬μ©μ κ³μ μ μ‘΄μ¬νμ§ μμΌλ©°, λ©νλ°μ΄ν° μ‘°νλ κ°μ¬κ° λΆκ°λ₯ν©λλ€. μμ 무λ£μ΄λ©° λ³λμ μ€μ μμ΄ κΈ°λ³Έμ μΌλ‘ μ¬μ©λ©λλ€.
μ μ₯ λ°μ΄ν° μνΈν (Encryption at Rest)
S3λ RDS κ°μ μλΉμ€μμ KMSλ₯Ό ν΅ν μνΈνλ μ μ₯ λ°μ΄ν° μνΈν(Encryption at Rest), μ¦ μ€ν λ¦¬μ§ λ 벨μ μνΈνλ₯Ό μλ―Έν©λλ€. λ°μ΄ν°κ° λμ€ν¬μ μ°μ¬μ§λ μμ μ μνΈνλκ³ , μ½μ λ μλμΌλ‘ 볡νΈνλ©λλ€. μ ν리μΌμ΄μ μ μ₯μμλ ν¬λͺ (transparent)νκ² λμνμ¬ λ³λμ μνΈν μ½λκ° νμ μμ΅λλ€.
S3μ κ²½μ°
κ°μ²΄λ₯Ό μ λ‘λνλ©΄ S3κ° λ΄λΆμ μΌλ‘ KMSμ λ°μ΄ν° ν€λ₯Ό μμ²νμ¬ μνΈννκ³ , λ€μ΄λ‘λν λλ KMSμ 볡νΈνλ₯Ό μμ²νμ¬ νλ¬Έ λ°μ΄ν°λ₯Ό λ°νν©λλ€. μνΈνλ λ°μ΄ν° ν€λ S3 κ°μ²΄μ λ©νλ°μ΄ν°μ ν¨κ» μ μ₯λλ―λ‘, λ€μ΄λ‘λ μ S3κ° μ΄λ₯Ό κΊΌλ΄μ΄ KMSμ 볡νΈνλ₯Ό μμ²νλ κ³Όμ μ΄ μλμΌλ‘ μ΄λ£¨μ΄μ§λλ€.
RDSμ κ²½μ°
KMS μνΈνλ₯Ό νμ±ννλ©΄ DB μΈμ€ν΄μ€μ EBS λ³Όλ₯¨, μλ λ°±μ , μ€λ μ·, Read Replica, λ‘κ·Έκ° λͺ¨λ λμ€ν¬ λ 벨μμ μνΈνλ©λλ€. DB μμ§ λ΄λΆμ 쿼리 κ²°κ³Όλ λ©λͺ¨λ¦¬ μμ λ°μ΄ν°κ° μνΈνλλ κ²μ΄ μλλΌ, 물리μ μ€ν 리μ§μ κΈ°λ‘λλ λ°μ΄ν°κ° μνΈνλλ κ²μ λλ€.
ν κ°μ§ μ£Όμν μ μ, RDS μΈμ€ν΄μ€μ μ μ©λ KMS ν€λ μ§μ λ³κ²½ν μ μλ€λ κ²μ λλ€. λ³κ²½μ΄ νμν κ²½μ° μ€λ μ·μ μμ±ν λ€ μ KMS ν€λ‘ 볡μ¬νκ³ , ν΄λΉ μ€λ μ·μμ μ μΈμ€ν΄μ€λ₯Ό 볡μνλ λ°©μμ μ¬μ©ν΄μΌ ν©λλ€.
λ°©μ΄ λ²μ
μ΄λ¬ν μ μ₯ λ°μ΄ν° μνΈνλ λμ€ν¬ νμ·¨, EBS μ€λ μ· μ μΆ λ± λ¬Όλ¦¬μ μ κ·Ό μνμΌλ‘λΆν° λ°μ΄ν°λ₯Ό 보νΈν©λλ€. λ€λ§ λ€μκ³Ό κ°μ μνμ λ°©μ΄ λ²μμ ν¬ν¨λμ§ μμ΅λλ€.
- IAM κΆνμ΄ μλ μ¬μ©μμ μ μμ μΈ λ°μ΄ν° μ‘°ν
- SQL Injection κ°μ μ ν리μΌμ΄μ λ 벨 곡격
- λ€νΈμν¬ λμ² (μ΄λ TLSκ° λ΄λΉ)
μ μ₯ λ°μ΄ν° μνΈνλ§μΌλ‘ λͺ¨λ 보μ μνμ΄ ν΄κ²°λλ κ²μ΄ μλλΌλ μ μ μΈμνλ κ²μ΄ μ€μν©λλ€.
CloudTrailμ ν΅ν κ°μ¬
CloudTrailμ AWS κ³μ μμ± μ μλμΌλ‘ νμ±νλλ©°, KMSμ λν κ΄λ¦¬ μ΄λ²€νΈ(CreateKey, ScheduleKeyDeletion λ±)λ λ³λ μ€μ μμ΄ κΈ°λ³Έμ μΌλ‘ 90μΌκ° κΈ°λ‘λ©λλ€. AWS μ½μμ CloudTrail μ΄λ²€νΈ κΈ°λ‘μμ μ΄λ²€νΈ μμ€λ₯Ό `kms.amazonaws.com`μΌλ‘ νν°λ§νλ©΄ μ‘°νν μ μμ΅λλ€.
λ€λ§ Encrypt, Decrypt , GenerateDataKeyκ°μ λ°μ΄ν° μ΄λ²€νΈλ κΈ°λ³Έμ μΌλ‘ μ½μμ μ΄λ²€νΈ κΈ°λ‘μ νμλμ§ μμ΅λλ€. S3 λ€μ΄λ‘λλ§λ€ Decryptκ° νΈμΆλλ κ²μ²λΌ, μ΄λ° μμ
μ λΉλκ° λ§€μ° λμ μ μκΈ° λλ¬Έμ
λλ€. λ°μ΄ν° μ΄λ²€νΈκΉμ§ κΈ°λ‘νλ €λ©΄ CloudTrail μΆμ μ λ³λλ‘ μμ±νκ³ KMS λ°μ΄ν° μ΄λ²€νΈ λ‘κΉ
μ νμ±νν΄μΌ ν©λλ€. μ΄ κ²½μ° S3 μ μ₯ λΉμ©κ³Ό CloudTrail λ°μ΄ν° μ΄λ²€νΈ μκΈμ΄ μΆκ°λ‘ λ°μν©λλ€.
ν€ μλ νμ
KMS ν€μ μλ νμ μ μνΈν μκ³ λ¦¬μ¦μ λ°κΎΈλ κ²μ΄ μλλΌ, ν€ μ¬λ£λ§ μ κ²μΌλ‘ κ΅μ²΄νλ κ²μ λλ€.
ν€ IDλ κ·Έλλ‘ μ μ§λλ©°, μλ‘ μνΈνν λλ μ΅μ ν€ μ¬λ£λ₯Ό μ¬μ©νκ³ , κΈ°μ‘΄ λ°μ΄ν°λ₯Ό 볡νΈνν λλ ν΄λΉ λ°μ΄ν°λ₯Ό μνΈννλ μμ μ ν€ μ¬λ£λ₯Ό KMSκ° μλμΌλ‘ μ νν©λλ€. λ°λΌμ μλ νμ μ νμ±ννλλΌλ μ ν리μΌμ΄μ μ½λλ₯Ό λ³κ²½ν νμκ° μμ΅λλ€.
"ν€κ° νμ λλ©΄ κ³Όκ±° λ°μ΄ν°λ₯Ό λͺ» μ½λ κ±° μλκ°?"λΌλ κ±±μ μ νμ§ μμλ λ©λλ€. KMSκ° κ³Όκ±° ν€ μ¬λ£λ₯Ό λͺ¨λ 보κ΄νκ³ μμΌλ©°, 볡νΈν μ μ΄λ€ ν€ μ¬λ£λ₯Ό μ¬μ©ν΄μΌ νλμ§λ₯Ό μλμΌλ‘ νλ¨ν©λλ€.