[Vault] transit을 활용한 Data 암호화 (Ubuntu)

gweowe·2023년 9월 20일
0

transit은 무엇인가?

Vault의 transit secret engine은 Data 보안을 강화하기 위한 서비스로, Data를 암호화, 복호화하고 관리하는 데 사용됩니다. Application을 사용할 때, 중요한 Data를 transit을 통해 암호화하고 저장하여 보안을 강화할 수 있습니다. 또한 transit을 사용하여 Key의 동적 관리와 엑세스 제어를 실시간으로 수행할 수 있어, 보안성을 향상시키고 무결성을 유지할 수 있습니다.

Vault 서버 설정

1. transit 활성화

vault secrets enable transit

transit secret engine을 사용하기 위해 활성화합니다.

2. transit Key 생성

vault write -f transit/keys/gweowe-key
Output :
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

3. transit Key 생성 확인

vault list transit/keys
Output :
Keys
----
gweowe-key

transit Key가 제대로 생성되었는지 확인합니다.

transit을 사용한 Data 암호화 및 복호화

1. Data 암호화

vault write transit/encrypt/gweowe-key plaintext=$(echo "Vault Secret Data" | base64)

Vault Secret Data 라는 문구를 base64로 인코딩하여 암호화합니다. transit을 사용하여 암호화를 하려면 필수적으로 base64로 인코딩 된 데이터의 값이 입력되어야 합니다.

Output :
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

2. Data 복호화

vault write transit/decrypt/gweowe-key ciphertext=[ciphertext 입력]

암호화된 Data를 Vault의 transit을 이용하여 다시 복호화를 진행합니다.

Output :
Key          Value
---          -----
plaintext    VmF1bHQgU2VjcmV0IERhdGEK

복호화 되어 plaintext가 출력되었습니다. 암호화할때 base64로 인코딩했던 것과 마찬가지로 복호화된 내용을 base64로 디코딩해야 합니다.

echo VmF1bHQgU2VjcmV0IERhdGEK | base64 -d
Output :
Vault Secret Data

복호화가 되어 처음 입력했던 값이 출력되었습니다.

transit Key 버전 관리

1. transit Key Rotate

vault write -f transit/keys/gweowe-key/rotate

gweowe-key를 Rotate합니다.

transit에서 Rotate는 새로운 버전의 transit Key를 만드는 작업입니다.

Output :
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가 생성되었음을 확인할 수 있습니다.

2. Rotate된 transit Key로 암호화

vault write transit/encrypt/gweowe-key plaintext=$(echo "Vault Secret Data2" | base64)
Output :
Key            Value
---            -----
ciphertext     vault:v2:cbYM2wUxqclSYXW8AQ4orQ9Gr0htPtJV2M3ymCwWzqCJnJzdTGHXyVhBs7KQk6Q=
key_version    2

Rotate되어 ciphertext의 값이 v2로, key_version의 값이 2로 변경되었음을 확인하실 수 있습니다. 이는 버전 2 transit Key로 암호화 되었음을 의미합니다.

3. 복호화 최소 버전 수정

vault write transit/keys/gweowe-key/config min_decryption_version=2

min_decryption_version 값을 수정하여 복호화할 수 있는 transit Key의 최소 버전을 2로 지정했습니다.

Output :
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 입력]
Output :
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로 되돌렸습니다.

Output :
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 입력]
Output :
Key          Value
---          -----
plaintext    VmF1bHQgU2VjcmV0IERhdGEK

복호화 되어 plaintext가 출력되었습니다.

echo VmF1bHQgU2VjcmV0IERhdGEK | base64 -d
Output :
Vault Secret Data

base64로 디코딩하여 plantext가 정상적으로 출력되었습니다.

transit Key Rewrap

Rewrap은 기존에 암호화된 데이터를 새로운 암호 키로 재암호화하는 기능을 말합니다. 이로써 데이터 보안을 강화하거나 암호 키를 주기적으로 교체할 때 유용하며, 기존 데이터 구조를 변경하지 않고 새로운 키로 데이터를 보호할 수 있습니다. Rewrap은 데이터를 안전하게 전환하고 업데이트하는 과정에서 매우 유용하게 사용됩니다.

1. 버전 1 transit Key Rewrap

vault write transit/rewrap/gweowe-key ciphertext=vault:v1:xeAwLouujA0Zd01e1kpuz5a71jo4diWVrtN1k30o2Ly4Rhtr0tkaLas5hyZCjw==
Output :
Key            Value
---            -----
ciphertext     vault:v2:CcuZxdISlR+gbmY3+ahEyr61iVVEcamk1b3ECGzzmPQqWd+8tRMkTagALyTQbw==
key_version    2

버전 1 transit Key가 Rewrap되어 버전 2 transit Key로 변경되었음을 확인할 수 있습니다.

profile
정리하는 공간

0개의 댓글