Vault의 transit secret engine은 Data 보안을 강화하기 위한 서비스로, Data를 암호화, 복호화하고 관리하는 데 사용됩니다. Application을 사용할 때, 중요한 Data를 transit을 통해 암호화하고 저장하여 보안을 강화할 수 있습니다. 또한 transit을 사용하여 Key의 동적 관리와 엑세스 제어를 실시간으로 수행할 수 있어, 보안성을 향상시키고 무결성을 유지할 수 있습니다.
vault secrets enable transit
transit secret engine을 사용하기 위해 활성화합니다.
vault write -f transit/keys/gweowe-key
Key Value
--- -----
allow_plaintext_backup false
auto_rotate_period 0s
deletion_allowed false
derived false
exportable false
imported_key false
keys map[1:1694656782]
latest_version 1
min_available_version 0
min_decryption_version 1
min_encryption_version 0
name gweowe-key
supports_decryption true
supports_derivation true
supports_encryption true
supports_signing false
type aes256-gcm96
keys의 값을 확인해보면 1:1694656782
가 생성되었음을 확인할 수 있습니다. 여기서 1:
는 Key의 버전을 의미합니다.
현재 min_decryption_version
의 값을 보면 1
이라고 되어있습니다. 이는 복호화 시 사용할 수 있는 Key의 최소 버전을 의미합니다. 지금처럼 값이 1
일 경우에는 1:1694656782
를 사용하여 복호화를 할 수 있지만, 값이 2
일 경우에는 버전 2부터 복호화를 할 수 있기 때문에 현재 만들어져있는 1:1694656782
로는 복호화를 할 수 없게 됩니다. 이 작업에서 버전 1은 삭제되는 것이 아니고 비활성화되는 개념이라고 이해하시면 됩니다.
transit에서 생성할 수 있는 key의 type은 다음과 같습니다. type=[type 명]
플래그를 추가하면 사용할 수 있습니다.
aes128-gcm96
aes256-gcm96
(default)chacha20-poly1305
ed25519
ecdsa-p256
ecdsa-p384
ecdsa-p521
rsa-2048
rsa-3072
rsa-4096
hmac
managed_key
참조 : https://developer.hashicorp.com/vault/docs/secrets/transit#key-types
vault list transit/keys
Keys
----
gweowe-key
transit Key가 제대로 생성되었는지 확인합니다.
vault write transit/encrypt/gweowe-key plaintext=$(echo "Vault Secret Data" | base64)
Vault Secret Data
라는 문구를 base64로 인코딩하여 암호화합니다. transit을 사용하여 암호화를 하려면 필수적으로 base64로 인코딩 된 데이터의 값이 입력되어야 합니다.
Key Value
--- -----
ciphertext vault:v1:xeAwLouujA0Zd01e1kpuz5a71jo4diWVrtN1k30o2Ly4Rhtr0tkaLas5hyZCjw==
key_version 1
암호화 된 Data의 구조는 vault:[Key의 버전]:[암호문]
으로 되어있습니다. Vault는 이 데이터를 내부에 직접 저장하지 않습니다. 그러므로, 복호화 시에는 해당 값을 Vault에 다시 제공해야 합니다. 이 기능을 실무에서 사용하려면 Application을 활용하여 DB같은 저장소에 넣어주는 것을 권장합니다.
만약 Application을 사용하여 테스트하고 싶다면 아래 링크에서 확인해보시기를 바랍니다. (Hashicorp 이규석님께서 개발하신 Application 입니다.)
참조 : https://github.com/Great-Stone/vault-spring-boot-transit-demo
vault write transit/decrypt/gweowe-key ciphertext=[ciphertext 입력]
암호화된 Data를 Vault의 transit을 이용하여 다시 복호화를 진행합니다.
Key Value
--- -----
plaintext VmF1bHQgU2VjcmV0IERhdGEK
복호화 되어 plaintext가 출력되었습니다. 암호화할때 base64로 인코딩했던 것과 마찬가지로 복호화된 내용을 base64로 디코딩해야 합니다.
echo VmF1bHQgU2VjcmV0IERhdGEK | base64 -d
Vault Secret Data
복호화가 되어 처음 입력했던 값이 출력되었습니다.
vault write -f transit/keys/gweowe-key/rotate
gweowe-key를 Rotate합니다.
transit에서 Rotate는 새로운 버전의 transit Key를 만드는 작업입니다.
Key Value
--- -----
allow_plaintext_backup false
auto_rotate_period 0s
deletion_allowed false
derived false
exportable false
imported_key false
keys map[1:1694656782 2:1694659408]
latest_version 2
min_available_version 0
min_decryption_version 1
min_encryption_version 0
name gweowe-key
supports_decryption true
supports_derivation true
supports_encryption true
supports_signing false
type aes256-gcm96
keys의 값을 확인해보면 2:1694659408
라는 버전 2의 transit Key가 생성되었음을 확인할 수 있습니다.
vault write transit/encrypt/gweowe-key plaintext=$(echo "Vault Secret Data2" | base64)
Key Value
--- -----
ciphertext vault:v2:cbYM2wUxqclSYXW8AQ4orQ9Gr0htPtJV2M3ymCwWzqCJnJzdTGHXyVhBs7KQk6Q=
key_version 2
Rotate되어 ciphertext
의 값이 v2
로, key_version
의 값이 2
로 변경되었음을 확인하실 수 있습니다. 이는 버전 2 transit Key로 암호화 되었음을 의미합니다.
vault write transit/keys/gweowe-key/config min_decryption_version=2
min_decryption_version
값을 수정하여 복호화할 수 있는 transit Key의 최소 버전을 2로 지정했습니다.
Key Value
--- -----
allow_plaintext_backup false
auto_rotate_period 0s
deletion_allowed false
derived false
exportable false
imported_key false
keys map[2:1694659408]
latest_version 2
min_available_version 0
min_decryption_version 2
min_encryption_version 0
name gweowe-key
supports_decryption true
supports_derivation true
supports_encryption true
supports_signing false
type aes256-gcm96
keys
의 값을 보면 버전 2만 존재하고 있는 것을 확인하실 수 있습니다. 이제 버전 2 미만의 transit Key는 복호화할 수 없습니다.
vault write transit/decrypt/gweowe-key ciphertext=[버전 1 transit Key로 암호화한 ciphertext 입력]
Error writing data to transit/decrypt/gweowe-key: Error making API request.
URL: PUT http://127.0.0.1:8200/v1/transit/decrypt/gweowe-key
Code: 400. Errors:
* ciphertext or signature version is disallowed by policy (too old)
버전 1 transit Key가 비활성화 상태이기 때문에 에러가 발생하는 것을 확인할 수 있습니다.
vault write transit/keys/gweowe-key/config min_decryption_version=1
min_decryption_version
값을 수정하여 복호화할 수 있는 transit Key의 최소 버전을 1로 되돌렸습니다.
Key Value
--- -----
allow_plaintext_backup false
auto_rotate_period 0s
deletion_allowed false
derived false
exportable false
imported_key false
keys map[1:1694656782 2:1694659408]
latest_version 2
min_available_version 0
min_decryption_version 1
min_encryption_version 0
name gweowe-key
supports_decryption true
supports_derivation true
supports_encryption true
supports_signing false
type aes256-gcm96
keys
의 값을 보면 버전 1이 다시 나타난 것을 확인하실 수 있습니다.
vault write transit/decrypt/gweowe-key ciphertext=[버전 1 transit Key로 암호화한 ciphertext 입력]
Key Value
--- -----
plaintext VmF1bHQgU2VjcmV0IERhdGEK
복호화 되어 plaintext가 출력되었습니다.
echo VmF1bHQgU2VjcmV0IERhdGEK | base64 -d
Vault Secret Data
base64로 디코딩하여 plantext가 정상적으로 출력되었습니다.
Rewrap은 기존에 암호화된 데이터를 새로운 암호 키로 재암호화하는 기능을 말합니다. 이로써 데이터 보안을 강화하거나 암호 키를 주기적으로 교체할 때 유용하며, 기존 데이터 구조를 변경하지 않고 새로운 키로 데이터를 보호할 수 있습니다. Rewrap은 데이터를 안전하게 전환하고 업데이트하는 과정에서 매우 유용하게 사용됩니다.
vault write transit/rewrap/gweowe-key ciphertext=vault:v1:xeAwLouujA0Zd01e1kpuz5a71jo4diWVrtN1k30o2Ly4Rhtr0tkaLas5hyZCjw==
Key Value
--- -----
ciphertext vault:v2:CcuZxdISlR+gbmY3+ahEyr61iVVEcamk1b3ECGzzmPQqWd+8tRMkTagALyTQbw==
key_version 2
버전 1 transit Key가 Rewrap되어 버전 2 transit Key로 변경되었음을 확인할 수 있습니다.