[Valut] ID ๊ธฐ๋ฐ ๋น๋ฐ ๋ฐ ์ํธํ ๊ด๋ฆฌ ์์คํ ๊ตฌ์ถ feat.Docker
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."
๐ ID ๊ธฐ๋ฐ ๋น๋ฐ ๋ฐ ์ํธํ ๊ด๋ฆฌ ์์คํ ๊ตฌ์ถ
๐ฝ ๊ฐ์
๐ฆ ์๊ฐ
์ด๋ฒ ๊ธ์ Docker๋ฅผ ์ด์ฉํ์ฌ Valut(๋ณผํธ)๋ผ๋ ๊ฒ์ ๊ตฌํํ๋ ๊ฒ์ ๋ํด ์ ๋ฆฌํด ๋ณด๋ ค๊ณ ํด์.
๋ณผํธ๋ ๋ฌด์์ผ๊น์?
๋ณผํธ๋ HashiCorp๊ฐ ๊ฐ๋ฐํ ์คํ ์์ค ๋น๋ฐ ๊ด๋ฆฌ ๋๊ตฌ์์. ๋ณผํธ๋ Application(์ ํ๋ฆฌ์ผ์ด์ )์์ ์ฌ์ฉ๋๋ ๋น๋ฐ ์ ๋ณด์ ์ํธํ Key, API Token(ํ ํฐ) ๋ฑ์ ์์ ํ๊ฒ ์ ์ฅํ๊ณ , ๊ด๋ฆฌํ๋๋ฐ ์ด์ฉํ ์ ์์ด์. ์ฆ, ์ฃผ์ ๋ชฉํ๋ ๋น๋ฐ ์ ๋ณด๋ฅผ ๋ณดํธํ๊ณ , ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํด ์ฃผ๋ ๋๊ตฌ์์.
์ฃผ์ ๊ธฐ๋ฅ | ๊ฐ ๋ |
Secret Storage (๋น๋ฐ ์ ์ฅ์) | ๋น๋ฐ ์ ๋ณด๋ฅผ ์ค์ ์ง์ค์ ์ ์ฅ์์ ๋ณด๊ด. ํด๋น ์ ๋ณด๋ Database ๋น๋ฐ ์ ๋ณด, API Key, ์ํธํ Key ๋ฑ์ ํฌํจ. |
์ ๊ทผ ์ ์ด ๋ฐ ๊ถํ ๊ด๋ฆฌ | ์ฌ์ฉ์ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ํ ์๊ฒฉํ ์ ๊ทผ ์ ์ด ๊ธฐ๋ฅ ์ ๊ณต. ์ฌ์ฉ์ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ํ ๋น๋ฐ ์ ๋ณด์ ๋ํ ์ ๊ทผ ๊ถํ์ ๋ถ์ฌ ๋ฐ์์ผ ํจ. |
๋์ ์ํฌ๋ฆฟ ์์ฑ | ๋น๋ฐ ์ ๋ณด๋ฅผ ๋์ ์ผ๋ก ์์ฑํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ์ผํ์ฉ ๋น๋ฐ ์ ๋ณด ๋๋ ์ ํ๋ ์ ํจ ๊ธฐ๊ฐ์ ๊ฐ์ง ๋น๋ฐ ์ ๋ณด ์์ฑ ๊ฐ๋ฅ. |
์ํธํ ๋ฐ ๋ณตํธํ | ๋ฐ์ดํฐ๋ฅผ ์ํธํํ๊ณ , ๋ณตํธํํ๋๋ฐ ์ฌ์ฉ. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ ๋ณดํธ์ ๋ฌด๊ฒฐ์ฑ ์ ์ง์ ์ค์ํ ์ญํ . |
๋ณด์ ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ | ๋ค์ํ ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ ๋ฉ์ปค๋์ฆ์ ์ง์ํ์ฌ |
Auditing & Monitoring | ๋ชจ๋ ๋น๋ฐ ์ ๋ณด ์ ์ ๋ฐ ๋ณ๊ฒฝ์ Auditingํ๊ณ , Monitoringํ ์ ์์. ์ด๋ฅผ ํตํด ๋ณด์ ๋ฐ ๊ท์ ์ค์ ์ฌํญ์ ์งํฌ ์ ์๋๋ก ํจ. |
Clieint Library | ๋ค์ํ Programing Languge๋ฅผ ์ง์ํ๋ Client Library๊ฐ ์๊ธฐ ๋๋ฌธ์ Application์์ Valut์ ํตํฉํ๊ธฐ ์ฌ์. |
๋ณผํธ๋ Cloud(ํด๋ผ์ฐ๋) ํ๊ฒฝ์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ , ๋ง์ ์กฐ์ง์ด ๋ณด์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๊ธฐ ์ํด ๋ณผํธ๋ฅผ ์ฌ์ฉํ๊ณ ์์ด์.
์ ํ๋ฆฌ์ผ์ด์
์์ ์ฌ์ฉ๋๋ ๋น๋ฐ ์ ๋ณด๋ฅผ ์ค์ ์ง์ค์์ผ๋ก ๊ด๋ฆฌํ๊ณ , ๋ณด๊ณ ํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ๋ก ์ธ์ ๋ฐ๊ณ ์๋ต๋๋ค.
๐ฝ Valut ์ค์น ๋ฐ ๊ตฌ์ฑ
๐ฆ Docker
์ต์ด Docker(๋์ปค)๋ฅผ ์ฌ์ฉํ์ฌ ๋ณผํธ๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํด Docker Compose(๋์ปค ์ปดํฌ์ฆ)๋ก ๊ตฌ์ฑํด ๋ณด๋ ค๊ณ ํด์.
version: "3.3"
volumes:
vault_data: { }
services:
junyss_vault:
image: vault:1.13.3
container_name: junyss_vault
restart: unless-stopped
hostname: junyss_vault
volumes:
- /docker/dirMapping/valut/config:/vault/config
- /docker/dirMapping/valut/data:/vault/file
- /docker/dirMapping/valut/logs:/vault/logs
ports:
- "8082:8200"
cap_add:
- IPC_LOCK
command: vault server -config=/vault/config/config.hcl
์ ์ปดํฌํธ ๊ด๋ จํด์ ๊ฐ๊ฐ ์ด๋ค ๋ด์ฉ์ธ์ง ๋ถ์ํด ๋ณผ๊ฒ์.
Section | ์์ธ ๋ด์ฉ |
version: "3.3" | ๋์ปค ์ปดํฌ์ฆ ํ์ผ์ ๋ฒ์ ๋ช ์. |
volumes | ๋์ปค ๋ณผ๋ฅจ ์ ์. Container์์ ์ฌ์ฉํ ๋ณผ๋ฅจ์ ์ค์ ํ๋ ๋ฐ ์ฌ์ฉ. - valut_data: Valut Data ์ ์ฅ ๋ณผ๋ฅจ ์ ์. Valut์ Data์ ์ค์ ํ์ผ์ด ์ฌ๊ธฐ์ ์ ์ฅ. |
services | ๋์ปค ์ปดํฌ์ฆ๋ก ์คํํ ์๋น์ค ์ ์. - valut: valut ์๋น์ค ์ ์ - image: valut Container์์ ์ฌ์ฉํ ๋์ปค ์ด๋ฏธ์ง ์ง์ . - container_name: Container ์ด๋ฆ ์ง์ . - volumes: Container์ Host File System ๊ฐ Volume Mapping ์ค์ . ์ด๋ฅผ ํตํด Container์ Config file, Data, Log ๋ฑ์ Host์ ํน์ ๋๋ ํฐ๋ฆฌ์ ์ ์ฅ. - ports: Host์ Container ๊ฐ Port Mapping. - cap_add: Container์ ์ถ๊ฐ ๊ถํ ๋ถ์ฌ. IPC_LOCK์ Container์์ ๊ณ ์ IPC(Inter-Process Communication) Name Space๋ฅผ ์ฌ์ฉํ๋๋ก ํ์ฉ. - command: Container ์์ํ ๋ ์คํ ๋ช ๋ น์ด ์ ์. valut server - config... ๋ฅผ ์ฌ์ฉํ์ฌ Valut Server ์คํํ๋ฉฐ, ์ค์ ํ์ผ์ /vault/config/config.hcl์์ Load |
Container(์ปจํ
์ด๋) ๋ด๋ถ ๋๋ ํฐ๋ฆฌ์ Mapping(๋งคํ)ํ Directory(๋๋ ํฐ๋ฆฌ)๋ฅผ ์์ ๊ฐ์ด ๋ง๋ค์ด ์ฃผ์์ด์.
ui = true
api_addr = "http://192.168.20.253:8200" # vault ์๋ฒ ์ฃผ์
disable_mlock = true
listener "tcp" {
address = "0.0.0.0:8200"
tls_disable = "true"
}
storage "file" {
path = "/vault/file"
}
์ ์ค์ ํ์ผ์ ๋ณผํธ ์ค์ ํ์ผ์ด์์. ์ด๊ฒ์ ํตํด ๋ณผํธ์ ๋์๊ณผ ๊ตฌ์ฑ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ํด ์ค ์ ์์ด์.
Section | ์์ธ ๋ด์ฉ |
ui = true | ๋ณผํธ ์น UI ํ์ฑํ. ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ๋ณผํธ์ ๋ํ GUI ์ ๊ทผ ๊ฐ๋ฅ. |
api_addr = "http://192.168.20.253:8200" | ๋ณผํธ ์๋ฒ API ์ฃผ์ ์ค์ . ๋ณผํธ ์๋ฒ API๋ Client Application๊ณผ ์ํธ ์์ฉํ๋๋ฐ ์ฌ์ฉ. |
disable_mlock = true | Memory Lock์ ๋นํ์ฑํ ํ๋๋ก ์ค์ . Memory Lock์ Memory์ ์ผ๋ถ๋ฅผ ๋ฌถ์ด ๋ค๋ฅธ Process๊ฐ ์ ๊ทผํ์ง ๋ชปํ๊ฒ ํ๋ ๋ณด์ ๋ฉ์ปค๋์ฆ ์ค ํ๋. ์ด ๋ถ๋ถ์ true๋ก ํจ์ผ๋ก Memory Lock์ ๋นํ์ฑํ. |
listener "tcp" | ๋ณผํธ ์๋ฒ๊ฐ ์์ ๋๊ธฐํ๊ณ Client์ ์ฐ๊ฒฐ์ ์๋ฝํ๋ Network litener ์ ์. - address = "0.0.0.0:8200": ๋ชจ๋ ๋คํธ์ํฌ ๋์ญ์ 8200 ํฌํธ์์ Client ์ฐ๊ฒฐ ์๋ฝ ํ์ฉ. - tls_disable = "true": TLS(Transport Layer Security) ๋นํ์ฑํ ํ๋๋ก ์ค์ . - storage "file": Valut Data ์ ์ฅ Back End Storage ์ ์. - path = "valut/file": Vault Data file์ /valut/file Directory์ ์ ์ฅํ๋๋ก ์ค์ . ์ด Directory๋ ๋ณผํธ๊ฐ Data๋ฅผ ์ ์ฅํ๊ณ , ๊ด๋ฆฌํ๋ ์์น. |
์์ ๊ฐ์ด ๋์ปค ์ปจํ
์ด๋๋ฅผ ๊ธฐ๋ ์์ผ ์ฃผ์์ด์.
์์ ๊ฐ์ด ๋ณผํธ์ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์ ์ํ ์ ์๋ ๊ฑธ ํ์ธํ ์ ์์ด์.
๐ฆ ์ด๊ธฐ ๊ตฌ์ฑ
๋ณผํธ๋ฅผ ์ ์์ ์ผ๋ก ๋์์ผ๋ ์ด์ ๋ก๊ทธ์ธ์ ํด๋ด์ผ ํด์.
์ต์ด ์์ ๊ฐ์ด ๋ชจ๋ 1์ ์
๋ ฅํ๊ณ , Initialize๋ฅผ ํด๋ฆญํด ์ฃผ์ธ์.
๊ทธ๋ฐ ๋ค ์์ ๊ฐ์ด Download keys๋ฅผ ๋๋ฌ Key ๊ฐ ํ์ผ์ ๋ด๋ ค ๋ฐ์ ์ค๋๋ค.
๊ทธ๋ฐ ๋ค Continue to Unseal์ ํด๋ฆญํด ์ค๊ฒ์.
ํด๋น ํ์ผ์ ์์ ๊ฐ์ ํ์์ผ๋ก ์์ฑ ๋์ด ์์๊ฑฐ์์.
์ด ๋ถ๋ถ์ ํ์ผ์ ์ ํ ์๋ keys์ ""๋ฅผ ์ ์ธํ Key ๊ฐ์ ๋ฃ์ด์ฃผ์ธ์.
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."
์ด ๋ถ๋ถ์ Method๋ Token์ผ๋ก ์ ํํ๊ณ , Token ๋ถ๋ถ์ ํ์ผ์ root_token์ ""๋ฅผ ์ ์ธํ Key ๊ฐ์ ๋ฃ์ด์ฃผ์ธ์.
๊ทธ๋ฐ ๋ค Sign In ๋ฒํผ์ ๋๋ฌ์ฃผ๋ฉด ๋๋ต๋๋ค.
์์ ๊ฐ์ด ์๋น์ค์ ์ ์ํ ์ ์์ด์.
๐ฆ Profile Config
์์ ๊ฐ์ด ์น UI๋ฅผ ์ด์ฉํ ์๋ ์์ง๋ง, CLI ํ๊ฒฝ์์ ์ฌ์ฉํ๊ณ ์ถ์ ์๋ ์์ํ
๋ ํด๋น ์ค์ ์ ์งํํด ๋ณผ๊ฒ์.
๋ง์ฝ Profile(ํ๋กํ) ์ค์ ์ ํ์ง ์๊ณ , vault ๋ช
๋ น์ด๋ฅผ ์คํํ๊ฒ ๋๋ฉด ์๋์ ๊ฐ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฑฐ์์.
์ต์ด ์ ๋ช
๋ น์ด๋ฅผ ์ด์ฉํด์ ๋ณผํธ ์ปจํ
์ด๋์ ์ ์ํด ์ฃผ์์ด์.
์ด๋ ๊ฒ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํด์.
export VAULT_ADDR="http://127.0.0.1:8200"
export VAULT_TOKEN="hvs.EwyXMoRXoseiVXke0TdXiDYe"
์ ๋ด์ฉ์ profile file์ ์ ์ฅํด ์ฃผ์์ด์. VAULT_TOKEN ๋ถ๋ถ์๋ ์์์ ๋ด๋ ค ๋ฐ์ json ํ์ผ์
root_token์ ""๋ฅผ ์ ์ธํ Key ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ต๋๋ค.
๊ทธ๋ฐ ๋ค ์ ๋ช
๋ น์ด๋ฅผ ํตํด .profile ๋ด์ฉ์ ์ ์ฉ ์์ผ์ฃผ์ด์ผ ํด์.
๊ทธ๋ผ ์์ ๊ฐ์ด ๋ณผํธ ๋ช
๋ น์ด๊ฐ ์๋ํ๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
๐ฆ ID & Password ์ฌ์ฉ
์ด๋ฒ์๋ Token(ํ ํฐ)์ด ์๋๊ณ , ID์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ด์ฉํด์ ๋ก๊ทธ์ธํ ์ ์๋๋ก ์ค์ ํด ๋ณผ๊ฒ์.
์ต์ด ์์ ๊ฐ์ด root_token์ ์ด์ฉํ์ฌ root๋ก vault์ ๋ก๊ทธ์ธํ์ฌ ์ฃผ์์ด์.
๋ณผํธ์๊ฒ ID์ ๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํด์ ์ธ์ฆํ๋ ๋ฐฉ์์ ํ์ฉํ๋ผ๊ณ ๋ช
๋ นํด ์ฃผ์์ด์!
์ ๋ช
๋ น์ด๋ฅผ ํตํด root ๊ณ์ ์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ง์ ํด ์ฃผ์์ด์.
๊ทธ๋ผ ์์ ๊ฐ์ด Method๋ฅผ Username์ ์ด์ฉํด์ ID์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ด์ฉํ์ฌ ๋ก๊ทธ์ธํ ์ ์์ด์.
๐ง ์ฐธ๊ณ ์๋ฃ