• Vault 서버는 sealed(봉인) 상태로 시작 → sealed(봉인) 상태는 저장된 정보를 어떤 경우에도 평문으로 볼 수 없음
  • Vault 데이터를 암호화하여 저장하기에, Unsealing(개봉) 전에는 거의 모든 작업이 불가능
  • 암호화 키로 데이터를 암호화하고, 암호화 키는 키링에 보관하여 데이터와 함께 저장
  • 키링은 마스터 키로 알려진 다른 암호화 키로 암호화
  • Vault는 데이터를 복호화하기 위하여 먼저 암호화 키를 마스터 키를 이용하여 복호화 → Unsealing(복호화)는 마스터 키에 접근하는 프로세스
  • 마스터 키도 다른 모든 데이터와 함께 저장되지만 또 다른 메커니즘인 봉인해제 키(unseal key)에 의해 암호화

1. 데이터는 키링의 암호화 키로, 암호화 키는 마스터 키로, 마스터 키는 봉인해제 키로 암호화

"봉인해제 키 → 마스터 키 → 암호화 키 → 데이터"

2. Shamir’s Secret Sharing 샤미르의 비밀 공유

  • 봉인해제 키는 샤미르의 비밀 공유 알고리즘을 사용하여 여러 조각으로 분할되어 생성 (RSA에 'S'의 그 Shamir)
  • 각 봉인해제 키는 분리된 공간에 저장할 것을 권장
  • 봉인해제 시에 각 키를 입력 받아 임계치 이상의 키가 입력이 되면 봉인해제
  • Vault에서는 기본 값으로 5개의 키가 생성이 되고, 3개의 키가 입력되면 봉인해제


Unsealing(봉인해제)

  • Unsealing는 아래의 과정 중 하나를 통하여 수행
    1. 터미널에서 vault operator unseal 명령을 입력 후 Unsealing 키를 차례로 입력
    2. Unseal API 호출
    3. WebUI에서 키를 차례로 입력
  • Unsealing 상태에서 다시 sealing 상태가 되는 경우는 아래 중 하나의 방법으로 수행
    1. Seal API 호출
    2. Vault 서버 재시작
    3. Vault 저장소에서 복구할 수 없는 오류가 발생


Sealing(봉인)

  • sealing API를 호출하면 메모리에 있는 마스터 키가 폐기 → sealing 상태가 되면 vault를 사용하기 위해서 Unsealing 과정이 필요
  • sealing에는 루트 권한이 있는 단일 작업자만 필요
  • 침입이 감지되었을 때 Vault 데이터를 빠르게 잠가 피해를 최소화 가능


Vault server 초기화할 때 unseal key 발행

  • key-shares → 발행되는 unseal key 개수
  • key-threshold → 인증할 때 unseal key 사용 개수
  • key-shares와 key-threshold 옵션을 사용 X → 5개의 unseal key 발행되고, 그 중 3개를 입력해야 vault CLI 명령 사용 가능
  • vault 서버 초기화할 때는 vault 서버의 API를 설정 필요
    # VAULT_ADDR이 설정
    VAULT_ADDR='https://[테스트 도메인]:8200'

1. vault 서버 초기화

  • 5개의 unseal key 발행되고, 그 중 3개를 입력해야 VAULT 사용 가능

      # unseal key 발행
      $ vault operator init
      Unseal Key 1: ayPqZuzG7bBN3uRp/GYfUBIVg9MGrbIotnHrjYXNWQIm
      Unseal Key 2: iRntqlhFUfybvnjzLCHHxq/GQfDDtuPupxJyFqpLqpNc
      Unseal Key 3: ibTmbjiieSQPLB2ZnUNY2hrplvrr6ab1m8FnyY8moMMu
      Unseal Key 4: RdU4jDtYmAlF9bDFg8J3/l67Nph72ZFuyXlGWTzsP/ja
      Unseal Key 5: yO+uE3m3eCy/IgzU6qQFz4QC2mIlG6ZcVXC8ZH65u0Rr
    
      Initial Root Token: s.asQ2M2u8kefJAH7pTRK9VZuY
    
      Vault initialized with 5 key shares and a key threshold of 3. Please securely
      distribute the key shares printed above. When the Vault is re-sealed,
      restarted, or stopped, you must supply at least 3 of these keys to unseal it
      before it can start servicing requests.
    
      Vault does not store the generated master key. Without at least 3 keys to
      reconstruct the master key, Vault will remain permanently sealed!
    
      It is possible to generate new unseal keys, provided you have a quorum of
      existing unseal keys shares. See "vault operator rekey" for more information.

2. unseal키 수동 설정하여 vault 서버 초기화 (예시)

  • unseal 키 1개 설정하였으며, 1개의 unseal키를 입력하면 vault 서버 사용 가능

      # unseal key 발행
      $ vault operator init -key-shares=1 -key-threshold=1
    
      Unseal Key 1: 8vTbeSYOS0yWMve+NFy2eisJQkbqaPOb6ocp3zkHS1c=           # Unseal key 1개 발행 확인 -> 보관 필요
    
      Initial Root Token: s.s15mhZCNj4oOwcYji8TuIx5h                                        # Root Token 도 1개 발행 -> 보관 필요
    
      Vault initialized with 1 key shares and a key threshold of 1. Please securely
      distribute the key shares printed above. When the Vault is re-sealed,
      restarted, or stopped, you must supply at least 1 of these keys to unseal it
      before it can start servicing requests.
    
      Vault does not store the generated master key. Without at least 1 keys to
      reconstruct the master key, Vault will remain permanently sealed!
    
      It is possible to generate new unseal keys, provided you have a quorum of
      existing unseal keys shares. See "vault operator rekey" for more information.

3. vault 초기화 후 vault 서버 상태 확인

$ vault status
Key                       Value
---                        -----
Seal Type               shamir
Initialized               true
Sealed                   true
Total Shares           5                  # unseal 발행 개수
Threshold               3                  # unseal 인증 개수
Unseal Progress      0/3
Unseal Nonce         n/a
Version                  1.9.3
Storage Type          file
HA Enabled            false



Root Token인 VAULT_TOKEN을 환경 변수 지정

  • VAULT_TOKEN은 Vault를 초기화(init)할 때 root token이라고 획득 → s.asQ2M2u8kefJAH7pTRK9VZuY
  • Vault 서버의 루트 권한이 있는 토큰
    1. 서버의 모든 작업을 가능
    2. sealed 상태로 변경 가능
    3. unseal 상태로 변경은 불가능
  • vault 토큰은 VAULT_TOKEN 환경변수에 저장하면 vault 클라이언트에서 사용 가능

    # vault token을 환경 변수에 지정
    $ export VAULT_TOKEN=s.asQ2M2u8kefJAH7pTRK9VZuY
    $ echo -e "export VAULT_TOKEN=s.asQ2M2u8kefJAH7pTRK9VZuY" >> /root/.bashrc
    
    # VAULT에서 지정한 환경변수 확인
    $ env | grep -i vault
    VAULT_ADDR=https://[테스트 도메인]:8200
    VAULT_TOKEN=s.asQ2M2u8kefJAH7pTRK9VZuY



Vault Server를 unseal

  • vault init을 할 때 받은 unseal key를 입력 → 초기화할 때 발행받은 5개 중에 3개만 입력하면 됨
    1. 첫번째 : iRntqlhFUfybvnjzLCHHxq/GQfDDtuPupxJyFqpLqpNc
    2. 두번째 : ibTmbjiieSQPLB2ZnUNY2hrplvrr6ab1m8FnyY8moMMu
    3. 세번째 : RdU4jDtYmAlF9bDFg8J3/l67Nph72ZFuyXlGWTzsP/ja
  • 기본적으로 Vault server를 초기화하면 Sealed 상태가 됨 → 즉, 잠겨있어서 Vault 서버에서 정보를 읽는 등 작업 불가능
  • Vault server를 init에 알려준 Unseal Key를 이용하면 Unsealed 상태로 변경 → Vault 서버의 정보 읽기, 쓰기 등 여러 작업 가능

1. vault Server unseal (봉인 해제)

  • 3번의 vault operator unseal을 통해 봉인 해제

  • unseal 명령어를 성공할 때마다 Unseal Progress의 수치가 올라가서 3/3이 되었을 때 unseal이 됨

  • unseal이 완료 → Sealed : false

    # 첫번째 Vault unseal
    $ vault operator unseal
    Unseal Key (will be hidden):
    Key                Value
    ---                -----
    Seal Type          shamir
    Initialized        true
    Sealed             true
    Total Shares       5
    Threshold          3
    Unseal Progress    1/3
    Unseal Nonce       ccbf047b-5956-fdd8-29f9-bad6969cdd45
    Version            1.9.3
    Storage Type       file
    HA Enabled         false
    
    # 두번째 Vault unseal
    $ vault operator unseal
    Unseal Key (will be hidden):
    Key                Value
    ---                -----
    Seal Type          shamir
    Initialized        true
    Sealed             true
    Total Shares       5
    Threshold          3
    Unseal Progress    2/3
    Unseal Nonce       ccbf047b-5956-fdd8-29f9-bad6969cdd45
    Version            1.9.3
    Storage Type       file
    HA Enabled         false
    
    # 세번째 Vault unseal
    $ vault operator unseal
    Unseal Key (will be hidden):
    Key             Value
    ---             -----
    Seal Type       shamir
    Initialized     true
    Sealed          false
    Total Shares    5
    Threshold       3
    Version         1.9.3
    Storage Type    file
    Cluster Name    vault-cluster-0b89b3d2
    Cluster ID      dbea1671-61fa-c4c8-387e-e32390ace762
    HA Enabled      false

※ unseal 참고 사항

  • 연속적으로 unseal을 3번 실행하여 Vault 서버를 열 수 있다.
  • 하지만, 한사람이 unseal key를 다 가지는 것은 위험 → 키를 5명이 나누어 갖고 3명이 unseal을 하면 Vault 서버를 엶
  • Vault에 중요한 정보가 있음으로 서버를 재시작하거나 보안 문제 발생으로 sealed 상태로 바꾸었을 때, 다시 서버를 열려면 unseal 단계를 거쳐야 함
  • unseal 과정은 서버가 기억하고 있으므로 한자리에 모일 필요 없이 각자의 자리에서 unseal을 하기만 하면 됨
  • unseal은 시간 제한도 없기에 충분히 시간을 두고 진행 가능
  • 스토리지 백엔드에도 암호화된 정보가 저장되어 있고, 복호화하려면 unseal 단계가 필수적 → unseal 키 3개가 없으면 Vault 서버도 복호화키도 만들어 낼 수 없음
  • DB가 통째로 털려도 Vault 서버가 통째로 털려도 unseal 키 3개가 없다면 공격자는 정보를 볼 수 없게 되어 안전함

2. unseal할 때 출력한 vault server 상태와 vault status 명령어로 출력되는 상태가 같은 지 확인

  • vault server가 unseal됨 → token을 입력해야 서버 내부 접근 가능

    $ vault status
    Key                 Value
    ---                   -----
    Seal Type         shamir
    Initialized         true
    Sealed             false
    Total Shares      5
    Threshold         3
    Version             1.9.3
    Storage Type     file
    Cluster Name    vault-cluster-0b89b3d2
    Cluster ID         dbea1671-61fa-c4c8-387e-e32390ace762
    HA Enabled       false



Vault Server를 Sealing

  • vault를 서버에 보안 문제가 있거나, 안전하게 관리하기 위해서 unsealing되어있는 것을 sealing으로 변경

      $ vault operator seal
      Success! Vault is sealed.
  • 다시 sealing된 vault 서버의 상태 확인

      $ vault status
      Key                    Value
      ---                   -----
      Seal Type          shamir
      Initialized          true
      Sealed               true
      Total Shares        5
      Threshold           3
      Unseal Progress     0/3
      Unseal Nonce       n/a
      Version               1.9.3
      Storage Type        file
      HA Enabled          false

+ Recent posts