[Hashicorp Vault Hands On 2023] Vault Basics (Korean)
https://play.instruqt.com/hashicorp/invite/eqpc1i6pthse
볼트 오픈 소스는 랩톱 또는 가상 워크 스테이션에서 다운로드하여 실행할 수있는 명령 줄 응용 프로그램입니다.
Go로 작성되었으며 macOS, Windows, Linux 및 기타 운영 체제에서 실행됩니다.
여기에서 항상 최신 버전의 볼트를 다운로드할 수 있습니다: https://www.vaultproject.io/downloads/
노트북이나 워크스테이션에 볼트를 쉽게 설치할 수 있습니다. zip 파일을 다운로드하고 압축을 푼 다음 경로 어딘가에 놓기만 하면 됩니다.
단계별 지침은 다음 튜토리얼을 참조하십시오: https://learn.hashicorp.com/vault/getting-started/install
사용자가 다운로드하거나 설치할 필요가 없도록 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/
VAULT가 "dev"모드에서 자동으로 생성하는 기본 KV v2 시크릿 엔진을 사용합니다. 변경되지 않는 정적 시크릿을 여러 버전으로 저장하는 데 사용됩니다.
KV v2 시크릿 엔진에 대한 내용은 다음 링크를 참고하세요 : https://www.vaultproject.io/docs/secrets/kv/kv-v2/
이번 실습과정에 사용할 세 개의 탭이 있습니다: 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/
이번 실습 과정에서는 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/
Vault 서버 초기화에 대한 상세한 내용은 다음 링크를 참고하세요. : https://www.vaultproject.io/docs/commands/operator/init/
Vault 서버 잠금 및 잠금 해제에 대한 상세한 내용은 다음 링크를 참고하세요. : https://www.vaultproject.io/docs/concepts/seal/
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상에서 생성된 루트 토큰으로 로그인할 수 있습니다. 문제가 발생하였담녀, 이전에 실행한 명령어의 결과를 다시 한 번 확인합니다.
루트 토큰과 잠금 해제 키를 저장하는 것을 잊지 마세요!
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를 사용하여 여러 버전의 시크릿을 유지할 수 있습니다.
vault secrets enable
명령어에 대한 상세한 내용은 다음 링크를 참고하세요. : https://www.vaultproject.io/docs/commands/secrets/enable/
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/
Vault가 제공하는 사용자명/비밀번호 인증 방법에 대한 상세한 내용은 다음 링크를 참고하세요. : https://www.vaultproject.io/docs/auth/userpass/
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" 정책으로 , 하나 이상의 정책을 통해 명시적으로 부여된 권한이 있는 경우에 해당 토큰을 사용하여 시크릿을 읽거나 변경 가능함을 의미합니다.
다음 실습 과정에서는 사용자 이름에 시크릿을 읽고 쓸 수 있는 정책을 추가합니다.