세미나

[Hashicorp Vault Hands On 2023] Vault Basics (Korean)

nineDeveloper 2023. 6. 1.
728x90

https://play.instruqt.com/hashicorp/invite/eqpc1i6pthse

 

Instruqt

 

play.instruqt.com

볼트 오픈 소스는 랩톱 또는 가상 워크 스테이션에서 다운로드하여 실행할 수있는 명령 줄 응용 프로그램입니다.

Go로 작성되었으며 macOS, Windows, Linux 및 기타 운영 체제에서 실행됩니다.

여기에서 항상 최신 버전의 볼트를 다운로드할 수 있습니다: https://www.vaultproject.io/downloads/

 

Install | Vault | HashiCorp Developer

Explore Vault product documentation, tutorials, and examples.

developer.hashicorp.com

노트북이나 워크스테이션에 볼트를 쉽게 설치할 수 있습니다. zip 파일을 다운로드하고 압축을 푼 다음 경로 어딘가에 놓기만 하면 됩니다.

단계별 지침은 다음 튜토리얼을 참조하십시오: https://learn.hashicorp.com/vault/getting-started/install

 

Install Vault | Vault | HashiCorp Developer

The first step to using Vault is to get it installed.

developer.hashicorp.com

사용자가 다운로드하거나 설치할 필요가 없도록 Instrumentqt 랩 환경의 도커 컨테이너에서 볼트가 실행됩니다.

The Vault CLI

Vault 명령 행 인터페이스 (CLI)를 사용하면 Vault 서버와 상호 작용할 수 있습니다.

몇 가지 기본 Vault 명령어를 왼쪽의 "Vault CLI"탭에서 실행하겠습니다.

컴퓨터에서 실행 중인 볼트 버전 확인:

vault version
vault-server:~# vault version
Vault v1.8.3 (73e85c3c21dfd1e835ded0053f08e3bd73a24ad6)

볼트 CLI 명령 목록 보기:

vault
vault-server:~# vault
Usage: vault <command> [args]

Common commands:
    read        Read data and retrieves secrets
    write       Write data, configuration, and secrets
    delete      Delete secrets and configuration
    list        List data or secrets
    login       Authenticate locally
    agent       Start a Vault agent
    server      Start a Vault server
    status      Print seal and HA status
    unwrap      Unwrap a wrapped secret

Other commands:
    audit          Interact with audit devices
    auth           Interact with auth methods
    debug          Runs the debug command
    kv             Interact with Vault's Key-Value storage
    lease          Interact with leases
    monitor        Stream log messages from a Vault server
    namespace      Interact with namespaces
    operator       Perform operator-specific tasks
    path-help      Retrieve API help for paths
    plugin         Interact with Vault plugins and catalog
    policy         Interact with policies
    print          Prints runtime configurations
    secrets        Interact with secrets engines
    ssh            Initiate an SSH session
    token          Interact with tokens

"vault secrets" 명령에 대한 도움말 보기:

vault secrets -h
vault-server:~# vault secrets -h
Usage: vault secrets <subcommand> [options] [args]

  This command groups subcommands for interacting with Vault's secrets engines.
  Each secret engine behaves differently. Please see the documentation for
  more information.

  List all enabled secrets engines:

      $ vault secrets list

  Enable a new secrets engine:

      $ vault secrets enable database

  Please see the individual subcommand help for detailed usage information.

Subcommands:
    disable    Disable a secret engine
    enable     Enable a secrets engine
    list       List enabled secrets engines
    move       Move a secrets engine to a new path
    tune       Tune a secrets engine configuration

"-h"대신 "-help" 및 "--help"플래그를 사용할 수도 있습니다.

"vault read"명령에 대한 도움말 보기:

vault read -h
vault-server:~# vault read -h
Usage: vault read [options] PATH

  Reads data from Vault at the given path. This can be used to read secrets,
  generate dynamic credentials, get configuration details, and more.

  Read a secret from the static secrets engine:

      $ vault read secret/my-secret

  For a full list of examples and paths, please see the documentation that
  corresponds to the secrets engine in use.

HTTP Options:

  -address=<string>
      Address of the Vault server. The default is https://127.0.0.1:8200. This
      can also be specified via the VAULT_ADDR environment variable.

  -agent-address=<string>
      Address of the Agent. This can also be specified via the
      VAULT_AGENT_ADDR environment variable.

  -ca-cert=<string>
      Path on the local disk to a single PEM-encoded CA certificate to verify
      the Vault server's SSL certificate. This takes precedence over -ca-path.
      This can also be specified via the VAULT_CACERT environment variable.

  -ca-path=<string>
      Path on the local disk to a directory of PEM-encoded CA certificates to
      verify the Vault server's SSL certificate. This can also be specified
      via the VAULT_CAPATH environment variable.

  -client-cert=<string>
      Path on the local disk to a single PEM-encoded CA certificate to use
      for TLS authentication to the Vault server. If this flag is specified,
      -client-key is also required. This can also be specified via the
      VAULT_CLIENT_CERT environment variable.

  -client-key=<string>
      Path on the local disk to a single PEM-encoded private key matching the
      client certificate from -client-cert. This can also be specified via the
      VAULT_CLIENT_KEY environment variable.

  -mfa=<string>
      Supply MFA credentials as part of X-Vault-MFA header. This can also be
      specified via the VAULT_MFA environment variable.

  -namespace=<string>
      The namespace to use for the command. Setting this is not necessary
      but allows using relative paths. -ns can be used as shortcut. The
      default is (not set). This can also be specified via the VAULT_NAMESPACE
      environment variable.

  -output-curl-string
      Instead of executing the request, print an equivalent cURL command
      string and exit. The default is false.

  -policy-override
      Override a Sentinel policy that has a soft-mandatory enforcement_level
      specified The default is false.

  -tls-server-name=<string>
      Name to use as the SNI host when connecting to the Vault server via TLS.
      This can also be specified via the VAULT_TLS_SERVER_NAME environment
      variable.

  -tls-skip-verify
      Disable verification of TLS certificates. Using this option is highly
      discouraged as it decreases the security of data transmissions to and
      from the Vault server. The default is false. This can also be specified
      via the VAULT_SKIP_VERIFY environment variable.

  -wrap-ttl=<duration>
      Wraps the response in a cubbyhole token with the requested TTL. The
      response is available via the "vault unwrap" command. The TTL is
      specified as a numeric string with suffix like "30s" or "5m". This can
      also be specified via the VAULT_WRAP_TTL environment variable.

Output Options:

  -field=<string>
      Print only the field with the given name. Specifying this option will
      take precedence over other formatting directives. The result will not
      have a trailing newline making it ideal for piping to other processes.

  -format=<string>
      Print the output in the given format. Valid formats are "table", "json",
      "yaml", or "pretty". The default is table. This can also be specified
      via the VAULT_FORMAT environment variable.

다시 위로 스크롤하여 볼트에서 시크릿를 읽는 방법을 확인하십시오.

Your First Secret

이번 실습과정에서는 첫 번째 볼트 서버를 "dev" 모드로 실행하고 볼트 서버에 첫 번째 시크릿을 작성합니다.

Vault의 "dev" 모드 설정에 대한 자세한 내용은 다음 링크를 참고하세요 : https://www.vaultproject.io/docs/concepts/dev-server/

 

Dev Server Mode | Vault | HashiCorp Developer

The dev server in Vault can be used for development or to experiment with Vault.

developer.hashicorp.com

VAULT가 "dev"모드에서 자동으로 생성하는 기본 KV v2 시크릿 엔진을 사용합니다. 변경되지 않는 정적 시크릿을 여러 버전으로 저장하는 데 사용됩니다.

KV v2 시크릿 엔진에 대한 내용은 다음 링크를 참고하세요 : https://www.vaultproject.io/docs/secrets/kv/kv-v2/

 

KV - Secrets Engines | Vault | HashiCorp Developer

The KV secrets engine can store arbitrary secrets.

developer.hashicorp.com

이번 실습과정에 사용할 세 개의 탭이 있습니다: Vault CLI, Vault Dev Server, and Vault UI.

Vault server는 "dev" 또는 "production" 모드로 동작할수 있습니다. "vault server" CLI 명령어를 실행하여 확인할 수 있습니다. :

"Vault CLI" 탭을 선택하고, 다음 명령어 실행 :

vault server -h
vault-server:~# vault server -h
Usage: vault server [options]

  This command starts a Vault server that responds to API requests. By default,
  Vault will start in a "sealed" state. The Vault cluster must be initialized
  before use, usually by the "vault operator init" command. Each Vault server must
  also be unsealed using the "vault operator unseal" command or the API before the
  server can respond to requests.

  Start a server with a configuration file:

      $ vault server -config=/etc/vault/config.hcl

  Run in "dev" mode:

      $ vault server -dev -dev-root-token-id="root"

  For a full list of examples, please see the documentation.

HTTP Options:

  -address=<string>
      Address of the Vault server. The default is https://127.0.0.1:8200. This
      can also be specified via the VAULT_ADDR environment variable.

  -agent-address=<string>
      Address of the Agent. This can also be specified via the
      VAULT_AGENT_ADDR environment variable.

  -ca-cert=<string>
      Path on the local disk to a single PEM-encoded CA certificate to verify
      the Vault server's SSL certificate. This takes precedence over -ca-path.
      This can also be specified via the VAULT_CACERT environment variable.

  -ca-path=<string>
      Path on the local disk to a directory of PEM-encoded CA certificates to
      verify the Vault server's SSL certificate. This can also be specified
      via the VAULT_CAPATH environment variable.

  -client-cert=<string>
      Path on the local disk to a single PEM-encoded CA certificate to use
      for TLS authentication to the Vault server. If this flag is specified,
      -client-key is also required. This can also be specified via the
      VAULT_CLIENT_CERT environment variable.

  -client-key=<string>
      Path on the local disk to a single PEM-encoded private key matching the
      client certificate from -client-cert. This can also be specified via the
      VAULT_CLIENT_KEY environment variable.

  -mfa=<string>
      Supply MFA credentials as part of X-Vault-MFA header. This can also be
      specified via the VAULT_MFA environment variable.

  -namespace=<string>
      The namespace to use for the command. Setting this is not necessary
      but allows using relative paths. -ns can be used as shortcut. The
      default is (not set). This can also be specified via the VAULT_NAMESPACE
      environment variable.

  -output-curl-string
      Instead of executing the request, print an equivalent cURL command
      string and exit. The default is false.

  -policy-override
      Override a Sentinel policy that has a soft-mandatory enforcement_level
      specified The default is false.

  -tls-server-name=<string>
      Name to use as the SNI host when connecting to the Vault server via TLS.
      This can also be specified via the VAULT_TLS_SERVER_NAME environment
      variable.

  -tls-skip-verify
      Disable verification of TLS certificates. Using this option is highly
      discouraged as it decreases the security of data transmissions to and
      from the Vault server. The default is false. This can also be specified
      via the VAULT_SKIP_VERIFY environment variable.

  -wrap-ttl=<duration>
      Wraps the response in a cubbyhole token with the requested TTL. The
      response is available via the "vault unwrap" command. The TTL is
      specified as a numeric string with suffix like "30s" or "5m". This can
      also be specified via the VAULT_WRAP_TTL environment variable.

Command Options:

  -config=<string>
      Path to a configuration file or directory of configuration files. This
      flag can be specified multiple times to load multiple configurations.
      If the path is a directory, all files which end in .hcl or .json are
      loaded.

  -exit-on-core-shutdown
      Exit the vault server if the vault core is shutdown. The default is
      false.

  -log-format=<string>
      Log format. Supported values are "standard" and "json". The default is
      (not set).

  -log-level=<string>
      Log verbosity level. Supported values (in order of detail) are "trace",
      "debug", "info", "warn", and "err". The default is (not set). This can
      also be specified via the VAULT_LOG_LEVEL environment variable.

  -recovery
      Enable recovery mode. In this mode, Vault is used to perform recovery
      actions.Using a recovery operation token, "sys/raw" API can be used to
      manipulate the storage. The default is false.

Dev Options:

  -dev
      Enable development mode. In this mode, Vault runs in-memory and starts
      unsealed. As the name implies, do not run "dev" mode in production. The
      default is false.

  -dev-listen-address=<string>
      Address to bind to in "dev" mode. The default is 127.0.0.1:8200. This
      can also be specified via the VAULT_DEV_LISTEN_ADDRESS environment
      variable.

  -dev-no-store-token
      Do not persist the dev root token to the token helper (usually the local
      filesystem) for use in future requests. The token will only be displayed
      in the command output. The default is false.

  -dev-root-token-id=<string>
      Initial root token. This only applies when running in "dev" mode.
      This can also be specified via the VAULT_DEV_ROOT_TOKEN_ID environment
      variable.

위로 스크롤하여 두 모드에 대한 정보를 확인합니다.

"Vault Dev Server" 탭 선택

Vault를 Dev Server mode로 기동. 가장 간단한 명령어는 "vault server -dev" 이지만, 최초 root 토큰을 "root"로 설정하고, 모든 IP 주소를 바인딩하기 위해 다음과 같이 변경. 다음 명령어를 실행:

vault server -dev -dev-listen-address=0.0.0.0:8200 -dev-root-token-id=root
vault-server:~# vault server -dev -dev-listen-address=0.0.0.0:8200 -dev-root-token-id=root
==> Vault server configuration:

             Api Address: http://0.0.0.0:8200
                     Cgo: disabled
         Cluster Address: https://0.0.0.0:8201
              Go Version: go1.16.7
              Listener 1: tcp (addr: "0.0.0.0:8200", cluster address: "0.0.0.0: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.3
             Version Sha: 73e85c3c21dfd1e835ded0053f08e3bd73a24ad6

==> Vault server started! Log data will stream in below:

2023-06-01T06:06:57.419Z [INFO]  proxy environment: http_proxy="" https_proxy="" no_proxy=""
2023-06-01T06:06:57.419Z [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
2023-06-01T06:06:57.420Z [INFO]  core: security barrier not initialized
2023-06-01T06:06:57.421Z [INFO]  core: security barrier initialized: stored=1 shares=1 threshold=1
2023-06-01T06:06:57.421Z [INFO]  core: post-unseal setup starting
2023-06-01T06:06:57.437Z [INFO]  core: loaded wrapping token key
2023-06-01T06:06:57.437Z [INFO]  core: successfully setup plugin catalog: plugin-directory=""
2023-06-01T06:06:57.437Z [INFO]  core: no mounts; adding default mount table
2023-06-01T06:06:57.439Z [INFO]  core: successfully mounted backend: type=cubbyhole path=cubbyhole/
2023-06-01T06:06:57.440Z [INFO]  core: successfully mounted backend: type=system path=sys/
2023-06-01T06:06:57.440Z [INFO]  core: successfully mounted backend: type=identity path=identity/
2023-06-01T06:06:57.443Z [INFO]  core: successfully enabled credential backend: type=token path=token/
2023-06-01T06:06:57.443Z [INFO]  rollback: starting rollback manager
2023-06-01T06:06:57.443Z [INFO]  core: restoring leases
2023-06-01T06:06:57.444Z [INFO]  expiration: lease restore complete
2023-06-01T06:06:57.444Z [INFO]  identity: entities restored
2023-06-01T06:06:57.445Z [INFO]  identity: groups restored
2023-06-01T06:06:57.445Z [INFO]  core: post-unseal setup complete
2023-06-01T06:06:57.445Z [INFO]  core: root token generated
2023-06-01T06:06:57.445Z [INFO]  core: pre-seal teardown starting
2023-06-01T06:06:57.445Z [INFO]  rollback: stopping rollback manager
2023-06-01T06:06:57.446Z [INFO]  core: pre-seal teardown complete
2023-06-01T06:06:57.446Z [INFO]  core.cluster-listener.tcp: starting listener: listener_address=0.0.0.0:8201
2023-06-01T06:06:57.446Z [INFO]  core.cluster-listener: serving cluster requests: cluster_listen_address=[::]:8201
2023-06-01T06:06:57.446Z [INFO]  core: post-unseal setup starting
2023-06-01T06:06:57.446Z [INFO]  core: loaded wrapping token key
2023-06-01T06:06:57.446Z [INFO]  core: successfully setup plugin catalog: plugin-directory=""
2023-06-01T06:06:57.448Z [INFO]  core: successfully mounted backend: type=system path=sys/
2023-06-01T06:06:57.449Z [INFO]  core: successfully mounted backend: type=identity path=identity/
2023-06-01T06:06:57.449Z [INFO]  core: successfully mounted backend: type=cubbyhole path=cubbyhole/
2023-06-01T06:06:57.452Z [INFO]  core: successfully enabled credential backend: type=token path=token/
2023-06-01T06:06:57.452Z [INFO]  core: restoring leases
2023-06-01T06:06:57.455Z [INFO]  rollback: starting rollback manager
2023-06-01T06:06:57.455Z [INFO]  expiration: lease restore complete
2023-06-01T06:06:57.455Z [INFO]  identity: entities restored
2023-06-01T06:06:57.455Z [INFO]  identity: groups restored
2023-06-01T06:06:57.455Z [INFO]  core: post-unseal setup complete
2023-06-01T06:06:57.455Z [INFO]  core: vault is unsealed
2023-06-01T06:06:57.458Z [INFO]  expiration: revoked lease: lease_id=auth/token/root/h8b757a7328ad0a7d938270c44929901e01f1e88974e4195e9c765a5f549c72e5
2023-06-01T06:06:57.461Z [INFO]  core: successful mount: namespace="" path=secret/ type=kv
2023-06-01T06:06:57.471Z [INFO]  secrets.kv.kv_415095d4: collecting keys to upgrade
2023-06-01T06:06:57.471Z [INFO]  secrets.kv.kv_415095d4: done collecting keys: num_keys=1
2023-06-01T06:06:57.471Z [INFO]  secrets.kv.kv_415095d4: upgrading keys finished
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://0.0.0.0:8200'

The unseal key and root token are displayed below in case you want to
seal/unseal the Vault or re-authenticate.

Unseal Key: jQi+QtWXdnHjv4ou8CK4Y/fp83703NrrM5xE68vSWPg=
Root Token: root

Development mode should NOT be used in production installations!

"Vault UI" 탭을 선택.

Vault UI에서 Method는Token, Token 값은 root를 사용하여 로그인.

"Vault CLI" 탭을 선택.

볼트 개발 서버가 자동으로 마운트한 KV v2 시크릿 엔진에 시크릿 생성:

vault kv put secret/my-first-secret age=<age>
vault-server:~# vault kv put secret/my-first-secret age=20
Key              Value
---              -----
created_time     2023-06-01T06:07:38.165486859Z
deletion_time    n/a
destroyed        false
version          1

<age>는 여러분의 나이를 입력하세요.

또는, Vault UI에서 "Secrets" 탭에서 "secret/" KV v2 시크릿 엔진을 선택하고 , "Create secret +" 버튼을 클릭, "my-first-secret"를 path로, "age"를 시크릿의 첫 번째 키, 그리고 여러분의 나이를 해당하는 값(value)로 지정하고, "Save" 버튼을 눌러 저장하는 방식으로 시크릿을 생성할 수 있습니다.

Vault UI에서, "secret/" KV v2 시크릿 엔진을 선택하고, "my-first-secret" 시크릿을 선택하고, 눈모양 아이콘을 클릭하면 저장된 나이값을 확인할 수 있습니다.

나이값을 수정하고자 하면, Vault UI에서 "Create new version +" 버튼을 클릭하거나, Vault CLI 명령어 "vault kv put" 를 이용할 수 있습니다.

The Vault API

이번 실습 과정에서는 이전 과정에서 기동된 Vault 서버의 상태를 확인하기 위하여 Vault HTTP API를 사용하게 됩니다.

"my-first-secret" 시크릿에 저장된 나이값을 읽을 때도, Vault HTTP API를 사용하게 됩니다.

Vault HTTP API에 대한 상세한 내용은 다음 링크를 참고하세요. : https://www.vaultproject.io/api-docs/index/

 

HTTP API | Vault | HashiCorp Developer

Vault has an HTTP API that can be used to control every aspect of Vault.

developer.hashicorp.com

이번 실습 과정에서는 Vault HTTP API를 이용하게 됩니다.

"Vault CLI" 탭에서 다음 명령어를 실행하여, Vault 서버 상태를 확인합니다. :

curl http://localhost:8200/v1/sys/health | jq
vault-server:~# curl http://localhost:8200/v1/sys/health | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   294  100   294    0     0  60122      0 --:--:-- --:--:-- --:--:-- 73500
{
  "initialized": true,
  "sealed": false,
  "standby": false,
  "performance_standby": false,
  "replication_performance_mode": "disabled",
  "replication_dr_mode": "disabled",
  "server_time_utc": 1685599340,
  "version": "1.8.3",
  "cluster_name": "vault-cluster-2c3784f0",
  "cluster_id": "8cf84317-9f33-4559-985f-3607b106fe1a"
}

그러면 서버가 초기화 및 잠금 해제되었음을 나타내는 적절한 형식의 JSON 문서가 반환됩니다.

이제, "my-first-secret" 시크릿을 다음 명령어를 사용하여 조회합니다. (명령어는 한 줄입니다.!):

curl --header "X-Vault-Token: root" http://localhost:8200/v1/secret/data/my-first-secret | jq
vault-server:~# curl --header "X-Vault-Token: root" http://localhost:8200/v1/secret/data/my-first-secret | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   289  100   289    0     0  19959      0 --:--:-- --:--:-- --:--:-- 20642
{
  "request_id": "36643062-4878-fce7-8df2-54d32574a167",
  "lease_id": "",
  "renewable": false,
  "lease_duration": 0,
  "data": {
    "data": {
      "age": "20"
    },
    "metadata": {
      "created_time": "2023-06-01T06:00:49.413884407Z",
      "deletion_time": "",
      "destroyed": false,
      "version": 1
    }
  },
  "wrap_info": null,
  "warnings": null,
  "auth": null
}

이렇게 하면 사용자의 나이와 버전을 포함한 시크릿에 대한 메타데이터를 보여주는 JSON 문서가 반환됩니다.

Run a Production Server

이번 실습 과정에서는 Vault server를 "production" 모드로 기동하여, 초기화 및 잠금 해제를 수행합니다. 서버는 시작하기 전에 편집하는 파일에서 구성을 가져옵니다.

Vault 서버 구성에 대한 상세한 내용은 다음 링크를 참고하세요. : https://www.vaultproject.io/docs/configuration/

 

Server Configuration | Vault | HashiCorp Developer

Vault server configuration reference.

developer.hashicorp.com

Vault 서버 초기화에 대한 상세한 내용은 다음 링크를 참고하세요. : https://www.vaultproject.io/docs/commands/operator/init/

 

operator init - Command | Vault | HashiCorp Developer

The "operator init" command initializes a Vault server. Initialization is the process by which Vault's storage backend is prepared to receive data. Since Vault servers share the same storage backend in HA mode, you only need to initialize one Vault to init

developer.hashicorp.com

Vault 서버 잠금 및 잠금 해제에 대한 상세한 내용은 다음 링크를 참고하세요. : https://www.vaultproject.io/docs/concepts/seal/

 

Seal/Unseal | Vault | HashiCorp Developer

A Vault must be unsealed before it can access its data. Likewise, it can be sealed to lock it down.

developer.hashicorp.com

Production Vault 서버를 실행합니다.

프로덕션 볼트 서버는 구성 파일에서 해당 구성을 가져옵니다. vault-config.hcl 구성 파일을 "Vault Configuration" 탭에서 확인할 수 있습니다.

"Vault Server" 탭에서, 구성 파일을 사용하여 Vault server를 시작합니다. :

vault server -config=/vault/config/vault-config.hcl
vault-server:~# vault server -config=/vault/config/vault-config.hcl
==> Vault server configuration:

             Api Address: http://localhost:8200
                     Cgo: disabled
         Cluster Address: https://localhost:8201
              Go Version: go1.16.7
              Listener 1: tcp (addr: "0.0.0.0:8200", cluster address: "0.0.0.0:8201", max_request_duration: "1m30s", max_request_size: "33554432", tls: "disabled")
               Log Level: info
                   Mlock: supported: true, enabled: false
           Recovery Mode: false
                 Storage: file
                 Version: Vault v1.8.3
             Version Sha: 73e85c3c21dfd1e835ded0053f08e3bd73a24ad6

==> Vault server started! Log data will stream in below:

2023-06-01T06:13:05.332Z [INFO]  proxy environment: http_proxy="" https_proxy="" no_proxy=""
2023-06-01T06:15:10.381Z [INFO]  core: security barrier not initialized
2023-06-01T06:15:10.381Z [INFO]  core: seal configuration missing, not initialized
2023-06-01T06:15:13.412Z [INFO]  core: security barrier not initialized
2023-06-01T06:15:13.414Z [INFO]  core: security barrier initialized: stored=1 shares=1 threshold=1
2023-06-01T06:15:13.414Z [INFO]  core: post-unseal setup starting
2023-06-01T06:15:13.426Z [INFO]  core: loaded wrapping token key
2023-06-01T06:15:13.426Z [INFO]  core: successfully setup plugin catalog: plugin-directory=""
2023-06-01T06:15:13.426Z [INFO]  core: no mounts; adding default mount table
2023-06-01T06:15:13.429Z [INFO]  core: successfully mounted backend: type=cubbyhole path=cubbyhole/
2023-06-01T06:15:13.429Z [INFO]  core: successfully mounted backend: type=system path=sys/
2023-06-01T06:15:13.429Z [INFO]  core: successfully mounted backend: type=identity path=identity/
2023-06-01T06:15:13.433Z [INFO]  core: successfully enabled credential backend: type=token path=token/
2023-06-01T06:15:13.433Z [INFO]  rollback: starting rollback manager
2023-06-01T06:15:13.435Z [INFO]  core: restoring leases
2023-06-01T06:15:13.436Z [INFO]  expiration: lease restore complete
2023-06-01T06:15:13.441Z [INFO]  identity: entities restored
2023-06-01T06:15:13.441Z [INFO]  identity: groups restored
2023-06-01T06:15:13.442Z [INFO]  core: usage gauge collection is disabled
2023-06-01T06:15:13.442Z [INFO]  core: post-unseal setup complete
2023-06-01T06:15:13.443Z [INFO]  core: root token generated
2023-06-01T06:15:13.443Z [INFO]  core: pre-seal teardown starting
2023-06-01T06:15:13.443Z [INFO]  rollback: stopping rollback manager
2023-06-01T06:15:13.443Z [INFO]  core: pre-seal teardown complete

해당 탭이 이제 볼트 서버를 실행 중이므로, "Vault CLI" 탭에서 나머지 CLI 명령어를 실행합니다.

하나의 잠금 해제 키를 사용하도록 설정하여 새 서버 초기화

vault operator init -key-shares=1 -key-threshold=1
vault-server:~# vault operator init -key-shares=1 -key-threshold=1
Unseal Key 1: 1xEMhRDj9P30p4q/zn6Cdov6YHz0pqPD6EqiTn6sJeI=

Initial Root Token: s.5iUGcCaL8JRzST0TMbb7OOJD

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.

그러면 잠금 해제 키(Unseal key)와 초기 루트 토큰이 반환됩니다. 실습 과정에서 사용할 수 있도록 별도로 보관하십시오.

일반적으로 Vault 명령어를 사용하기 위해 "VAULT_TOKEN" 환경 변수 설정이 필요합니다. "init" 명령어 수행 결과로 생성된 초기 루트 토큰을 사용합니다.

export VAULT_TOKEN=<root_token>
vault-server:~# export VAULT_TOKEN=s.5iUGcCaL8JRzST0TMbb7OOJD

은 반드시 초기화 과정에서 생성된 root_token값으로 지정하세요!

실습 시 편의를 위해 다음을 ".profile" 파일에 추가합니다. :

echo "export VAULT_TOKEN=$VAULT_TOKEN" >> /root/.profile
vault-server:~# echo "export VAULT_TOKEN=$VAULT_TOKEN" >> /root/.profile

다음과정으로 Vault server를 잠금 해제(unseal)합니다. "init" 명령어 수행 결과로 생성된 잠금 해제키(unseal key)을 사용합니다.:

vault operator unseal
vault-server:~# vault operator unseal
Unseal Key (will be hidden): 
Key             Value
---             -----
Seal Type       shamir
Initialized     true
Sealed          false
Total Shares    1
Threshold       1
Version         1.8.3
Storage Type    file
Cluster Name    vault-cluster-f7208d4b
Cluster ID      182c67a3-d862-709e-2a1a-1fbae77170ff
HA Enabled      false

명령어 수행 결과, "Initialized"는 "true", "Sealed" 는 "false"로 서버의 상태값이 출력됩니다.

Vault 서버의 상테를 확인하고자 할 때는 vault status 명령어를 실행합니다. "Sealed" 값이 "true" 확인되면, vault operator unseal 명령어를 다시 수행합니다.

잠금 해제되고 나면, Vault UI상에서 생성된 루트 토큰으로 로그인할 수 있습니다. 문제가 발생하였담녀, 이전에 실행한 명령어의 결과를 다시 한 번 확인합니다.

Root Token으로 로그인

루트 토큰과 잠금 해제 키를 저장하는 것을 잊지 마세요!


Use the KV V2 Secrets Engine

이번 실습 과정에서는 이전 과정에서 구성하고 동작 중인 Production Vault 서버에 KV v2 시크릿 엔진을 활성화하고 사용하게 됩니다

또한 시크릿을 작성하고 볼트 UI에서 값을 변경한 다음 KV v2 시크릿 엔진이 여러 버전의 시크릿을 유지하므로 원래 값을 계속 검사할 수 있는지 확인합니다.

Vault 시크릿 엔진에 대한 상세한 내용은 다음 링크를 참고하세요. : https://www.vaultproject.io/docs/secrets/

Vault K/V 시크릿 엔진에 대한 상세한 내용은 다음 링크를 참고하세요. : https://www.vaultproject.io/docs/secrets/kv/ 이 엔진의 버전 2를 사용하여 여러 버전의 시크릿을 유지할 수 있습니다.

 

KV - Secrets Engines | Vault | HashiCorp Developer

The KV secrets engine can store arbitrary secrets.

developer.hashicorp.com

vault secrets enable 명령어에 대한 상세한 내용은 다음 링크를 참고하세요. : https://www.vaultproject.io/docs/commands/secrets/enable/

 

secrets enable - Command | Vault | HashiCorp Developer

The "secrets enable" command enables an secrets engine at a given path. If an secrets engine already exists at the given path, an error is returned. After the secrets engine is enabled, it usually needs configuration. The configuration varies by secrets en

developer.hashicorp.com

Vault production server는 기동 중이므로 (백그라운드에서 기동 중), 시크릿 엔진을 마운트하고 시크릿을 작성할 수 있습니다.

이 실습과정의 환경 설정 스크립트는 ".profile"파일에 이미 루트 토큰 설정해 두었습니다.

먼저, KV v2 시크릿 엔진을 기본 경로(default path), "kv"로 마운트합니다.:

vault secrets enable -version=2 kv
vault-server:~# vault secrets enable -version=2 kv
Success! Enabled the kv secrets engine at: kv/

다음, 새로 생성된 시크릿엔진에 시크릿 만들기:

vault kv put kv/a-secret value=1234
vault-server:~# vault kv put kv/a-secret value=1234
Key              Value
---              -----
created_time     2023-06-01T06:24:11.264156108Z
deletion_time    n/a
destroyed        false
version          1

1234 대신에 여러분만의 비밀 번호를 자유롭게 지정하세요.

루트 토큰을 사용하여 볼트 UI에 로그인, "kv" 시크릿 엔진의 "a-secret" 시크릿에 명령어로 설정한 값이 저장되었는지 눈모양 아이콘을 클릭하여 확인합니다.

UI상에서 "Create new version +" 버튼을 클릭하여 "....."으로 표시된 필드에 새로운 값을 입력하고, "Save" 버튼을 눌러 변경할 수 있습니다. 변경 내용을 확인하려면 눈모양 아이콘을 클릭합니다.

Vault UI에서, 시크릿의 History 메뉴 선택, "Version 1" 선택, 눈모양 아이콘을 클릭하여 원래 값을 확인 할 수 있습니다.

Use the Userpass Auth Method

Vault Production server를 기동하여, KV v2 시크릿 엔진를 활성화하고, 사용해보았습니다. 이제 사용자 인증에 대해 알아보겠습니다.

이번 실습 과정에서는 Vault에서 사용자를 인증하는 방식 중, Vault에서 관리되는 사용자 이름과 비밀번호를 이용하여 사용자를 인증하는 방법을 알려드립니다.

더불어, 사용자 또는 애플리케이션 별로 서로 다른 시트릿에 접근하도록 Vault 정책에 대해 실습합니다. Vault 정책은 기본적으로 "deny by default"입니다. 즉, 하나 이상의 정책을 통해 명시적으로 부여된 권한이 있는 경우에 해당 토큰을 사용하여 시크릿을 읽거나 변경 가능함을 의미합니다.

Vault 인증 방법에 대한 상세한 내용은 다음 링크를 참고하세요. : https://www.vaultproject.io/docs/auth/

 

Auth Methods | Vault | HashiCorp Developer

Auth methods are mountable methods that perform authentication for Vault.

developer.hashicorp.com

Vault가 제공하는 사용자명/비밀번호 인증 방법에 대한 상세한 내용은 다음 링크를 참고하세요. : https://www.vaultproject.io/docs/auth/userpass/

 

Userpass - Auth Methods | Vault | HashiCorp Developer

The "userpass" auth method allows users to authenticate with Vault using a username and password.

developer.hashicorp.com

Vault Production server를 기동하여, KV v2 시크릿 엔진를 활성화하고, 사용해보았습니다. 이제 사용자 인증에 대해 알아보겠습니다.

이 실습과정의 환경 설정 스크립트는 ".profile"파일에 이미 루트 토큰 설정해 두었습니다.

먼저, 사용자 이름/비밀번호 인증 방법을 활성화합니다. :

vault auth enable userpass
vault-server:~# vault auth enable userpass
Success! Enabled userpass auth method at: userpass/

다음으로, 정책 설정없는 Vault 사용자로 자기 자신을 추가합니다.

vault write auth/userpass/users/<name> password=<pwd>
vault-server:~# vault write auth/userpass/users/user1 password=1234
Success! Data written to: auth/userpass/users/user1

이 때, 꺾쇠괄호없이 <name><pwd>는 실제 사용자 이름과 비밀번호로 변경하여 실행합니다.

Vault UI를 사용하여 Userpass 인증 방법을 선택하고,사용자 이름과 비밀번호를 입력 후 로그인할 수 있습니다.

Vault CLI를 사용하여 로그인할 수 도 있습니다.:

vault login -method=userpass username=<name> password=<pwd>
vault-server:~# vault login -method=userpass username=user1 password=1234
WARNING! The VAULT_TOKEN environment variable is set! This takes precedence
over the value set by this command. To use the value set by this command,
unset the VAULT_TOKEN environment variable or set it to the token displayed
below.

Success! You are now authenticated. The token information displayed below
is already stored in the token helper. You do NOT need to run "vault login"
again. Future Vault requests will automatically use this token.

Key                    Value
---                    -----
token                  s.ScJ4QL8l7gudPD6EYCjI9cza
token_accessor         lWTnApe5HnPtoPS6m5G78hwq
token_duration         768h
token_renewable        true
token_policies         ["default"]
identity_policies      []
policies               ["default"]
token_meta_username    user1

두 가지 방식으로 로그인하게 되면, Vault 서버에게 제공되는 기본정책 (기능이 제약됨)이 토큰에 부여됩니다. 노란색 경고 메시지는 현재 작업 환경의 환경 변수로 VAULT_TOKEN이 설정되었음을 의미합니다. 이런 경우, 환경 변수 설정을 해제하거나, 새로운 토큰값으로 설정 가능합니다. 설정을 해제하겠습니다. :

unset VAULT_TOKEN

새로운 토큰이 사용되는지 확인하기 위해 다음 명령어를 실행합니다. :

vault token lookup
vault-server:~# vault token lookup
Key                 Value
---                 -----
accessor            lWTnApe5HnPtoPS6m5G78hwq
creation_time       1685601362
creation_ttl        768h
display_name        userpass-user1
entity_id           396aaf60-f7eb-6370-ae1f-0607667995a7
expire_time         2023-07-03T06:36:02.285028355Z
explicit_max_ttl    0s
id                  s.ScJ4QL8l7gudPD6EYCjI9cza
issue_time          2023-06-01T06:36:02.285034314Z
meta                map[username:user1]
num_uses            0
orphan              true
path                auth/userpass/login/user1
policies            [default]
renewable           true
ttl                 767h58m23s
type                service

이제 현재 토큰의 display_name 이 "userpass-<name>"형태로 <name> 값은 조금 전 설정한 사용자 이름이, 부여된 정책은 기본 정책("default" policy)아 출력됩니다.

이전 실습 과정에서 생성된 KV v2 시크릿 엔진의 시크릿을 읽어 보겠습니다.:

vault kv get kv/a-secret
vault-server:~# vault kv get kv/a-secret
Error making API request.

URL: GET http://localhost:8200/v1/sys/internal/ui/mounts/kv/a-secret
Code: 403. Errors:

* preflight capability check returned 403, please ensure client's policies grant access to path "kv/a-secret/"

시크릿을 읽을 수 있는 권한이 부여되지 않은 상태라서 에러 메시지가 출력됩니다. 이것이 Vault의 "deny by default" 정책으로 , 하나 이상의 정책을 통해 명시적으로 부여된 권한이 있는 경우에 해당 토큰을 사용하여 시크릿을 읽거나 변경 가능함을 의미합니다.

다음 실습 과정에서는 사용자 이름에 시크릿을 읽고 쓸 수 있는 정책을 추가합니다.

728x90

댓글

💲 추천 글