• 토큰, 비밀번호, 인증서, 암호화 키와 같은 비밀 정보나 민감한 데이터를 UI, CLI, HTTP API 를 활용할때 안전하게 저장하고 제어할수 있게 해주는 오픈 소스
  • vault 메뉴얼 URL : https://www.vaultproject.io/

Valut 설치

$ yum install -y yum-utils
$ yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
$ yum -y install vault

# 설치한 vault 패키지 버전 확인
$ vault -v
Vault v1.8.0 (82a99f14eb6133f99a975e653d4dac21c17505c7)



Vault server를 DEV 모드로 실행

1. 환경변수 등록

  • vault CLI 를 사용하기 위해 환경변수 등록이 필요

      # 수동으로 환경 변수 등록
      $ export VAULT_ADDR='http://127.0.0.1:8200'
    
      # 영구적으로 환경 변수 등록
      $ echo "export VAULT_ADDR='http://127.0.0.1:8200'" >> /root/.bashrc
      $ source /root/.bashrc
    
      # 설정 확인
      $ echo $VAULT_ADDR
      http://127.0.0.1:8200

2. 테스트를 위해 -dev 모드로 백그라운드에서 서버를 실행

  • dev모드는 미리 준비된 설정으로 서버를 구동

  • dev 모드는 모든 데이터는 in-memory 저장, 암호화

  • localhost로 listen되며 TLS가 없음

  • 자동 봉인 해제 → 봉인 해제된 키와 엑세스 토큰을 보여줌

  • 프로덕션 모드에서는 -dev 옵션 사용을 권장 X

    $ vault server -dev &
    ==> Vault server configuration:
    
               Api Address: http://127.0.0.1:8200
                       Cgo: disabled
           Cluster Address: https://127.0.0.1:8201
                Go Version: go1.16.5
                Listener 1: tcp (addr: "127.0.0.1:8200", cluster address: "127.0.0.1:8201", max_request_duration: "1m30s", max_request_size: "33554432", tls: "disabled")
                 Log Level: info
                     Mlock: supported: true, enabled: false
             Recovery Mode: false
                   Storage: inmem
                   Version: Vault v1.8.0
               Version Sha: 82a99f14eb6133f99a975e653d4dac21c17505c7
    
    ==> Vault server started! Log data will stream in below:
    
    2021-08-02T14:07:10.555Z [INFO]  proxy environment: http_proxy="" https_proxy="" no_proxy=""
    2021-08-02T14:07:10.556Z [WARN]  no `api_addr` value specified in config or in VAULT_API_ADDR; falling back to detection if possible, but this value should be manually set
    2021-08-02T14:07:10.557Z [INFO]  core: security barrier not initialized
    2021-08-02T14:07:10.557Z [INFO]  core: security barrier initialized: stored=1 shares=1 threshold=1
    2021-08-02T14:07:10.558Z [INFO]  core: post-unseal setup starting
    2021-08-02T14:07:10.572Z [INFO]  core: loaded wrapping token key
    2021-08-02T14:07:10.572Z [INFO]  core: successfully setup plugin catalog: plugin-directory=""
    2021-08-02T14:07:10.572Z [INFO]  core: no mounts; adding default mount table
    2021-08-02T14:07:10.573Z [INFO]  core: successfully mounted backend: type=cubbyhole path=cubbyhole/
    2021-08-02T14:07:10.574Z [INFO]  core: successfully mounted backend: type=system path=sys/
    2021-08-02T14:07:10.574Z [INFO]  core: successfully mounted backend: type=identity path=identity/
    2021-08-02T14:07:10.582Z [INFO]  core: successfully enabled credential backend: type=token path=token/
    2021-08-02T14:07:10.589Z [INFO]  core: restoring leases
    2021-08-02T14:07:10.603Z [INFO]  rollback: starting rollback manager
    2021-08-02T14:07:10.603Z [INFO]  expiration: lease restore complete
    2021-08-02T14:07:10.604Z [INFO]  identity: entities restored
    2021-08-02T14:07:10.604Z [INFO]  identity: groups restored
    2021-08-02T14:07:10.604Z [INFO]  core: post-unseal setup complete
    2021-08-02T14:07:10.604Z [INFO]  core: root token generated
    2021-08-02T14:07:10.604Z [INFO]  core: pre-seal teardown starting
    2021-08-02T14:07:10.604Z [INFO]  rollback: stopping rollback manager
    2021-08-02T14:07:10.604Z [INFO]  core: pre-seal teardown complete
    2021-08-02T14:07:10.604Z [INFO]  core.cluster-listener.tcp: starting listener: listener_address=127.0.0.1:8201
    2021-08-02T14:07:10.604Z [INFO]  core.cluster-listener: serving cluster requests: cluster_listen_address=127.0.0.1:8201
    2021-08-02T14:07:10.604Z [INFO]  core: post-unseal setup starting
    2021-08-02T14:07:10.605Z [INFO]  core: loaded wrapping token key
    2021-08-02T14:07:10.605Z [INFO]  core: successfully setup plugin catalog: plugin-directory=""
    2021-08-02T14:07:10.605Z [INFO]  core: successfully mounted backend: type=system path=sys/
    2021-08-02T14:07:10.605Z [INFO]  core: successfully mounted backend: type=identity path=identity/
    2021-08-02T14:07:10.605Z [INFO]  core: successfully mounted backend: type=cubbyhole path=cubbyhole/
    2021-08-02T14:07:10.606Z [INFO]  core: successfully enabled credential backend: type=token path=token/
    2021-08-02T14:07:10.606Z [INFO]  core: restoring leases
    2021-08-02T14:07:10.607Z [INFO]  identity: entities restored
    2021-08-02T14:07:10.607Z [INFO]  identity: groups restored
    2021-08-02T14:07:10.607Z [INFO]  core: post-unseal setup complete
    2021-08-02T14:07:10.607Z [INFO]  core: vault is unsealed
    2021-08-02T14:07:10.609Z [INFO]  core: successful mount: namespace="" path=secret/ type=kv
    2021-08-02T14:07:10.610Z [INFO]  expiration: lease restore complete
    2021-08-02T14:07:10.610Z [INFO]  secrets.kv.kv_f71fab5a: collecting keys to upgrade
    2021-08-02T14:07:10.610Z [INFO]  secrets.kv.kv_f71fab5a: done collecting keys: num_keys=1
    2021-08-02T14:07:10.610Z [INFO]  secrets.kv.kv_f71fab5a: upgrading keys finished
    2021-08-02T14:07:10.611Z [INFO]  rollback: starting rollback manager
    WARNING! dev mode is enabled! In this mode, Vault runs entirely in-memory
    and starts unsealed with a single unseal key. The root token is already
    authenticated to the CLI, so you can immediately begin using Vault.
    
    You may need to set the following environment variable:
    
      $ export VAULT_ADDR='http://127.0.0.1:8200'
    
    The unseal key and root token are displayed below in case you want to
    seal/unseal the Vault or re-authenticate.
    
    Unseal Key: +1P8t1jNPI8mBPCV57v+emB4E3DttH3t1xkz+oXsQUs=
    Root Token: s.BT8kE324DT9EJYQqG8noC8J1
    
    Development mode should NOT be used in production installations!

3. 실행된 서버의 상태를 확인

$ vault status
Key                   Value
---                    -----
Seal Type          shamir
Initialized          true
Sealed              false
Total Shares      1
Threshold          1
Version             1.3.0
Cluster Name    vault-cluster-a6999d5c
Cluster ID         291371dc-e6a5-42d3-fca7-b2373ff70194
HA Enabled       false



vault 와 secret

  • vault의 핵심 기능중 하나는 비밀정보를 안전하게 읽고 쓰는것
  • vault에 기록된 비밀정보는 암호화하여 backend 저장소에 저장
  • 값을 저장소에 전달하기 전에 암호화를 하며, backend 저장소에 저장된 암호화값은 vault 없이는 해독 불가능



write a secret (비밀정보 작성)

  • key 값의 접두사가 secret/ 로 저장됨

  • secret/ 는 어떤 secrets engine을 실행시킬지 결정하는 route 역할(경로 결정)

  • 비밀정보를 기록할때는 shell history에 남기때문에 되도록이면 file 을 통해서 전달될수있도록 하는것이 좋음

  • kv → Vault의 키-값 저장소와 상호작용 (command)

  • put → KV 저장소의 데이터를 설정하거나 업데이트함

  • secret/hello → hello 이름을 가지는 secret engine 사용

  • foo=world → foo 키에 world 값이 있음

    $ vault kv put secret/hello foo=world
    Key                     Value
    ---                       -----
    created_time        2021-08-02T15:40:03.164784248Z
    deletion_time        n/a
    destroyed             false
    version                1



read a secret (비밀정보 읽기)

1. secret과 함께 여러 가지 메타 데이터가 함께 반환

  • 비밀정보를 획득

  • vault는 저장소로부터 값을 가져올때 복호화하여 가져옴

  • kv → Vault의 키-값 저장소와 상호작용 (command)

  • get → KV 저장소에서 데이터 검색

  • secret/hello → hello 이름을 가지는 secret engine 사용

    $ vault kv get secret/hello
    ====== Metadata ======
    Key Value
    --- -----
    created_time 2019-11-26T02:39:20.8458832Z
    deletion_time n/a
    destroyed false
    version 1
    
    === Data ===
    Key Value
    --- -----
    foo world

2. hello 키에 해당하는 값 추출

  • kv → Vault의 키-값 저장소와 상호작용 (command)

  • get → KV 저장소에서 데이터 검색

  • field=key → 입력한 key의 value를 출력, -field 옵션을 사용하면 다른 형식 지정 지시문보다 우선

    $ vault kv get -field=foo secret/hello
    world

3. JSON output → 결과데이터의 포맷을 json형식으로 출력

  • kv → Vault의 키-값 저장소와 상호작용 (command)

  • get → KV 저장소에서 데이터 검색

  • format=형식 → "table", "json", "yaml", "pretty" 중에 입력한 형식으로 출력 → 기본값은 table로 출력

  • format 옵션을 사용하지 않고, VAULT_FORMAT 환경 변수를 통해 지정 가능

    $ vault kv get -format=json secret/hello
    {
    "request_id": "777069c4-4cb8-1bfa-2eaa-5d35018eca54",
    "lease_id": "",
    "lease_duration": 0,
    "renewable": false,
    "data": {
      "data": {
        "foo": "world"
      },
      "metadata": {
        "created_time": "2021-08-02T15:40:03.164784248Z",
        "deletion_time": "",
        "destroyed": false,
        "version": 1
      }
    },
    "warnings": null
    }

4. jq 활용 → jq 도구를 통해 더 편리하게 원하는 메타정보를 가져올 수 있음

  • kv → Vault의 키-값 저장소와 상호작용 (command)

  • get → KV 저장소에서 데이터 검색

  • format=json → json 형식으로 출력

  • json 형식으로 출력되면 key값으로 해서 해당 value를 찾을 수 있음

    # jq를 사용하기 위해서는 패키지 설치 필요
    $ yum install -y jq
    
    #  data 키 → data 키 → foo 키의 값 출력
    $ vault kv get -format=json secret/hello | jq -r .data.data.foo
    world



delete a secret (비밀정보 삭제)

  • 저장된 비밀정보를 삭제

  • kv → Vault의 키-값 저장소와 상호작용 (command)

  • delete → KV 저장소에서 데이터 삭제

    $ vault kv delete secret/hello
    Success! Data deleted (if it existed) at: secret/hello
    
    # key와 value가 삭제됨을 확인
    $ vault kv get secret/hello
    ====== Metadata ======
    Key                      Value
    ---                       -----
    created_time        2021-08-02T15:40:03.164784248Z
    deletion_time       2021-08-02T16:17:00.129797593Z
    destroyed             false
    version                1

+ Recent posts