MySQL์˜ ์•”ํ˜ธํ™”: ํ‚ค ์ €์žฅ์†Œ

์ƒˆ๋กœ์šด ๊ณผ์ •์˜ ์‹œ์ž‘์„ ์˜ˆ์ƒํ•˜์—ฌ "๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค" ๋‹น์‹ ์„ ์œ„ํ•ด ์œ ์šฉํ•œ ๊ธฐ์‚ฌ์˜ ๋ฒˆ์—ญ์„ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค.

MySQL์˜ ์•”ํ˜ธํ™”: ํ‚ค ์ €์žฅ์†Œ

TDE(Transparent Data Encryption)๊ฐ€ ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. MySQL์šฉ Percona ์„œ๋ฒ„ ๊ทธ๋ฆฌ๊ณ  ๊ฝค ์˜ค๋žซ๋™์•ˆ MySQL. ๊ทธ๋Ÿฌ๋‚˜ TDE๊ฐ€ ๋‚ด๋ถ€์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€, TDE๊ฐ€ ์„œ๋ฒ„์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋Š”์ง€ ์ƒ๊ฐํ•ด ๋ณธ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ๊ธฐ์‚ฌ ์‹œ๋ฆฌ์ฆˆ์—์„œ๋Š” TDE๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์•”ํ˜ธํ™”๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•˜๋ฏ€๋กœ ํ‚ค ์ €์žฅ์†Œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ Percona Server for MySQL/MySQL์—์„œ ์•”ํ˜ธํ™”๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ Percona Server for MySQL์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

MySQL ํ‚ค๋ง

ํ‚ค๋ง์€ ์„œ๋ฒ„๊ฐ€ ๋กœ์ปฌ ํŒŒ์ผ(keyring_file) ๋˜๋Š” ์›๊ฒฉ ์„œ๋ฒ„(์˜ˆ: HashiCorp Vault)์—์„œ ํ‚ค๋ฅผ ์ฟผ๋ฆฌ, ์ƒ์„ฑ ๋ฐ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ž…๋‹ˆ๋‹ค. ํ‚ค๋Š” ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ํ•ญ์ƒ ๋กœ์ปฌ์— ์บ์‹œ๋ฉ๋‹ˆ๋‹ค.

ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋‘ ๊ฐ€์ง€ ๋ฒ”์ฃผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€. ์˜ˆ๋ฅผ ๋“ค์–ด ๋กœ์ปฌ ํŒŒ์ผ(์ด๋ฅผ ํŒŒ์ผ ๊ธฐ๋ฐ˜ ํ‚ค๋ง์ด๋ผ๊ณ  ํ•จ)์ž…๋‹ˆ๋‹ค.
  • ์›๊ฒฉ ์ €์žฅ์†Œ. ์˜ˆ๋ฅผ ๋“ค์–ด Vault Server(์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ํ‚ค๋ง์ด๋ผ๊ณ  ํ•จ).

ํ‚ค๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•  ๋•Œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ‚ค๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ๋„ ์ €์žฅ์†Œ ์œ ํ˜•์ด ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ถ„๋ฆฌ๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์‹œ์ž‘ ์‹œ ์ €์žฅ์†Œ์˜ ๋ชจ๋“  ์ฝ˜ํ…์ธ (ํ‚ค ID, ํ‚ค ์‚ฌ์šฉ์ž, ํ‚ค ์œ ํ˜• ๋ฐ ํ‚ค ์ž์ฒด)๊ฐ€ ์บ์‹œ์— ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

๋ฐฑ์—”๋“œ ์ €์žฅ์†Œ(์˜ˆ: Vault ์„œ๋ฒ„)์˜ ๊ฒฝ์šฐ ์‹œ์ž‘ ์‹œ ํ‚ค ID์™€ ํ‚ค ์‚ฌ์šฉ์ž๋งŒ ๋กœ๋“œ๋˜๋ฏ€๋กœ ๋ชจ๋“  ํ‚ค๋ฅผ ๊ฐ€์ ธ์™€๋„ ์‹œ์ž‘ ์†๋„๊ฐ€ ๋Š๋ ค์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ‚ค๊ฐ€ ๋Š๋ฆฌ๊ฒŒ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ‚ค ์ž์ฒด๋Š” ์‹ค์ œ๋กœ ํ•„์š”ํ•  ๋•Œ๋งŒ Vault์—์„œ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์šด๋กœ๋“œ ํ›„ ํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์บ์‹œ๋˜๋ฏ€๋กœ ๋‚˜์ค‘์— Vault ์„œ๋ฒ„์— ๋Œ€ํ•œ TLS ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ํ‚ค์— ์•ก์„ธ์Šคํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ํ‚ค ์ €์žฅ์†Œ์— ์–ด๋–ค ์ •๋ณด๊ฐ€ ์žˆ๋Š”์ง€ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

์ฃผ์š” ์ •๋ณด์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • ํ‚ค ์•„์ด๋”” - ํ‚ค ์‹๋ณ„์ž, ์˜ˆ:
    INNODBKey-764d382a-7324-11e9-ad8f-9cb6d0d5dc99-1
  • ํ‚ค ์œ ํ˜• - ์‚ฌ์šฉ๋œ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๊ธฐ๋ฐ˜ํ•œ ํ‚ค ์œ ํ˜•, ๊ฐ€๋Šฅํ•œ ๊ฐ’: "AES", "RSA" ๋˜๋Š” "DSA".
  • ํ‚ค ๊ธธ์ด - ํ‚ค ๊ธธ์ด(๋ฐ”์ดํŠธ), AES: 16, 24 ๋˜๋Š” 32, RSA 128, 256, 512 ๋ฐ DSA 128, 256 ๋˜๋Š” 384.
  • ์‚ฌ์šฉ์ž ํ‚ค์˜ ์†Œ์œ ์ž์ž…๋‹ˆ๋‹ค. ํ‚ค๊ฐ€ ๋งˆ์Šคํ„ฐ ํ‚ค์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ ํ‚ค์ธ ๊ฒฝ์šฐ ์ด ํ•„๋“œ๋Š” ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. keyring_udf๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค๋ฅผ ๋งŒ๋“  ๊ฒฝ์šฐ ์ด ํ•„๋“œ๋Š” ํ‚ค ์†Œ์œ ์ž๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ํ‚ค ๊ทธ ์ž์ฒด

ํ‚ค๋Š” key_id, user ์Œ์œผ๋กœ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„๋ฉ๋‹ˆ๋‹ค.

ํ‚ค ์ €์žฅ ๋ฐ ์‚ญ์ œ์—๋„ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ ์ €์žฅ์ด ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค. ํ‚ค ์ €์žฅ์†Œ๊ฐ€ ํŒŒ์ผ์— ๋Œ€ํ•œ ํ‚ค์˜ ์ผํšŒ์„ฑ ์“ฐ๊ธฐ๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋” ๋งŽ์€ ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ์ €์žฅ์†Œ๊ฐ€ ์ˆ˜์ •๋  ๋•Œ๋งˆ๋‹ค ๋ชจ๋“  ์ฝ˜ํ…์ธ ๊ฐ€ ๋จผ์ € ๋ฐฑ์—…๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ์ด๋ฆ„์ด my_biggest_secrets๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ๋ฐฑ์—…์€ my_biggest_secrets.backup์ด ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ์บ์‹œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ณ (ํ‚ค๊ฐ€ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ๋จ) ๋ชจ๋“  ๊ฒƒ์ด ์„ฑ๊ณต์ ์ด๋ฉด ์บ์‹œ๊ฐ€ ํŒŒ์ผ๋กœ ๋คํ”„๋ฉ๋‹ˆ๋‹ค. ๋“œ๋ฌผ๊ฒŒ ์„œ๋ฒ„ ์ถฉ๋Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์ด ๋ฐฑ์—… ํŒŒ์ผ์ด ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฑ์—… ํŒŒ์ผ์€ ๋‹ค์Œ์— ํ‚ค๊ฐ€ ๋กœ๋“œ๋  ๋•Œ(์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋ฒ„๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ ํ›„) ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„ ์ €์žฅ์†Œ์— ํ‚ค๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ๋•Œ ์ €์žฅ์†Œ๋Š” "ํ‚ค ๋ณด๋‚ด๊ธฐ" / "ํ‚ค ์‚ญ์ œ ์š”์ฒญ" ๋ช…๋ น์œผ๋กœ MySQL ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„ ์‹œ์ž‘ ์†๋„๋กœ ๋Œ์•„๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ €์žฅ์†Œ ์ž์ฒด๊ฐ€ ์‹œ์ž‘ ์†๋„์— ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๋Š” ์‚ฌ์‹ค ์™ธ์—๋„ ์‹œ์ž‘ ์‹œ ์ €์žฅ์†Œ์—์„œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ํ‚ค๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์งˆ๋ฌธ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๋Š” ์„œ๋ฒ„ ์Šคํ† ๋ฆฌ์ง€์— ํŠนํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์ž‘ํ•  ๋•Œ ์„œ๋ฒ„๋Š” ์•”ํ˜ธํ™”๋œ ํ…Œ์ด๋ธ”/ํ…Œ์ด๋ธ”์ŠคํŽ˜์ด์Šค์— ํ•„์š”ํ•œ ํ‚ค๋ฅผ ํ™•์ธํ•˜๊ณ  ์Šคํ† ๋ฆฌ์ง€์—์„œ ํ‚ค๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์Šคํ„ฐ ํ‚ค๊ฐ€ ์žˆ๋Š” "๊นจ๋—ํ•œ" ์„œ๋ฒ„์—๋Š” ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•œ ํ•˜๋‚˜์˜ ๋งˆ์Šคํ„ฐ ํ‚ค๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ์Šคํ† ๋ฆฌ์ง€์—์„œ ๊ฒ€์ƒ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ๋ฅผ ๋“ค์–ด ๊ธฐ๋ณธ ์„œ๋ฒ„์˜ ๋ฐฑ์—…์ด ๋Œ€๊ธฐ ์„œ๋ฒ„๋กœ ๋ณต์›๋˜๋Š” ๊ฒฝ์šฐ ๋” ๋งŽ์€ ํ‚ค๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋งˆ์Šคํ„ฐ ํ‚ค ์ˆœํ™˜์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ๋Š” ํ–ฅํ›„ ๊ธฐ์‚ฌ์—์„œ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ฒ ์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ๋Š” ํŠนํžˆ ์„œ๋ฒ„ ํ‚ค ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์—ฌ๋Ÿฌ ๋งˆ์Šคํ„ฐ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๋” ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด์ œ keyring_file์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋” ์ด์•ผ๊ธฐํ•ด ๋ด…์‹œ๋‹ค. keyring_file์„ ์„ค๊ณ„ํ•  ๋•Œ ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ keyring_file ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค. 5.7์—์„œ๋Š” ์ด์ƒ์ ์ด์ง€ ์•Š์€ ํŒŒ์ผ ํ†ต๊ณ„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒ€์‚ฌ๊ฐ€ ์ˆ˜ํ–‰๋˜์—ˆ์œผ๋ฉฐ 8.0์—์„œ๋Š” SHA256 ์ฒดํฌ์„ฌ์œผ๋กœ ๋Œ€์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

keyring_file์ด ์ฒ˜์Œ ์‹คํ–‰๋  ๋•Œ ํŒŒ์ผ ํ†ต๊ณ„ ๋ฐ ์ฒดํฌ์„ฌ์ด ์„œ๋ฒ„์—์„œ ๊ณ„์‚ฐ ๋ฐ ๊ธฐ์–ต๋˜๋ฉฐ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ฒดํฌ์„ฌ์ด ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ํ‚ค ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ๋งŽ์€ ์งˆ๋ฌธ์„ ๋‹ค๋ฃจ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ข…์ข… ์žŠ์–ด๋ฒ„๋ฆฌ๊ฑฐ๋‚˜ ์˜คํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ์ฃผ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์„œ๋ฒ„ ๊ฐ„ ํ‚ค ๊ณต์œ ์ž…๋‹ˆ๋‹ค.

๋‚ด ๋ง์€? ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐ ์„œ๋ฒ„(์˜ˆ: Percona ์„œ๋ฒ„)๋Š” Percona ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ํ‚ค๋ฅผ ์ €์žฅํ•ด์•ผ ํ•˜๋Š” Vault ์„œ๋ฒ„์— ๋ณ„๋„์˜ ์œ„์น˜๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž๊ฒฉ ์ฆ๋ช… ๋ชจ์Œ์— ์ €์žฅ๋œ ๊ฐ ๋งˆ์Šคํ„ฐ ํ‚ค์—๋Š” ํ•ด๋‹น ID ๋‚ด์— Percona ์„œ๋ฒ„ GUID๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ ์ค‘์š” ํ•จ? Vault ์„œ๋ฒ„๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๊ณ  ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  Percona ์„œ๋ฒ„๊ฐ€ ์ด ๋‹จ์ผ Vault ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋ช…๋ฐฑํ•ด ๋ณด์ธ๋‹ค. ๋ชจ๋“  Percona ์„œ๋ฒ„๊ฐ€ ๊ณ ์œ  ์‹๋ณ„์ž๊ฐ€ ์—†๋Š” ๋งˆ์Šคํ„ฐ ํ‚ค(์˜ˆ: id = 1, id = 2 ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ์„œ๋ฒ„๋Š” ๋™์ผํ•œ ๋งˆ์Šคํ„ฐ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด GUID๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ, ์ฆ‰ ์„œ๋ฒ„ ๊ฐ„์˜ ๊ตฌ๋ณ„์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋ฏธ ๊ณ ์œ ํ•œ GUID๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์„œ๋ฒ„ ๊ฐ„ ํ‚ค ๊ณต์œ ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? keyring_udf๋ผ๋Š” ๋˜ ๋‹ค๋ฅธ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋ฒ„ ์‚ฌ์šฉ์ž๊ฐ€ Vault ์„œ๋ฒ„์— ํ‚ค๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์˜ˆ๋ฅผ ๋“ค์–ด server1์—์„œ ํ‚ค๋ฅผ ๋งŒ๋“  ๋‹ค์Œ server2์—์„œ ๋™์ผํ•œ ID๋กœ ํ‚ค๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

--server1:
select keyring_key_store('ROB_1','AES',"123456789012345");
1
--1 ะทะฝะฐั‡ะธั‚ ัƒัะฟะตัˆะฝะพะต ะทะฐะฒะตั€ัˆะตะฝะธะต
--server2:
select keyring_key_store('ROB_1','AES',"543210987654321");
1

๊ธฐ๋‹ค๋ฆฌ๋‹ค. ๋‘ ์„œ๋ฒ„ ๋ชจ๋‘ ๋™์ผํ•œ Vault ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. keyring_key_store ๊ธฐ๋Šฅ์ด server2์—์„œ ์‹คํŒจํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๊นŒ? ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ๋™์ผํ•œ ์„œ๋ฒ„์—์„œ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

--server1:
select keyring_key_store('ROB_1','AES',"123456789012345");
1
select keyring_key_store('ROB_1','AES',"543210987654321");
0

๋งž์Šต๋‹ˆ๋‹ค. ROB_1์€ ์ด๋ฏธ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € ๋‘ ๋ฒˆ์งธ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•ž์„œ ๋งํ–ˆ๋“ฏ์ด keyring_vault ๋˜๋Š” ๋‹ค๋ฅธ ๋ณผํŠธ ํ”Œ๋Ÿฌ๊ทธ์ธ(keyring)์€ ๋ชจ๋“  ํ‚ค ID๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์บ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ƒˆ ํ‚ค๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ROB_1์ด server1์— ์ถ”๊ฐ€๋˜๊ณ  ์ด ํ‚ค๋ฅผ Vault๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ ์™ธ์— ์บ์‹œ์—๋„ ํ‚ค๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋™์ผํ•œ ํ‚ค๋ฅผ ๋‘ ๋ฒˆ์งธ๋กœ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•˜๋ฉด keyring_vault๋Š” ํ‚ค๊ฐ€ ์บ์‹œ์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๊ฒฝ์šฐ์—๋Š” ์ƒํ™ฉ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. Server1๊ณผ server2์—๋Š” ๋ณ„๋„์˜ ์บ์‹œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ROB_1์„ server1 ๋ฐ Vault ์„œ๋ฒ„์˜ ํ‚ค ์บ์‹œ์— ์ถ”๊ฐ€ํ•œ ํ›„ server2์˜ ํ‚ค ์บ์‹œ๊ฐ€ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. server2์˜ ์บ์‹œ์— ROB_1 ํ‚ค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ROB_1 ํ‚ค๋Š” keyring_key_store์™€ Vault ์„œ๋ฒ„์— ๊ธฐ๋ก๋˜๋ฉฐ ์‹ค์ œ๋กœ ์ด์ „ ๊ฐ’์„ ๋ฎ์–ด์”๋‹ˆ๋‹ค(!). ์ด์ œ Vault ์„œ๋ฒ„์˜ ROB_1 ํ‚ค๋Š” 543210987654321์ž…๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กญ๊ฒŒ๋„ Vault ์„œ๋ฒ„๋Š” ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ  ์ด์ „ ๊ฐ’์„ ์‰ฝ๊ฒŒ ๋ฎ์–ด์”๋‹ˆ๋‹ค.

์ด์ œ keyring_udf๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  Vault์— ํ‚ค๋ฅผ ์ €์žฅํ•˜๋ ค๋Š” ๊ฒฝ์šฐ Vault์—์„œ ์„œ๋ฒ„๋ณ„ ๋ถ„๋ฆฌ๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Vault ์„œ๋ฒ„์—์„œ ์ด๋Ÿฌํ•œ ๋ถ„๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

Vault์—์„œ ๋ถ„ํ• ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์„œ๋ฒ„์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๋งˆ์šดํŠธ ์ง€์ ์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๋™์ผํ•œ ๋งˆ์šดํŠธ ์ง€์  ๋‚ด์—์„œ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋จผ์ € ๊ฐœ๋ณ„ ๋งˆ์šดํŠธ ์ง€์ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

--server1:
vault_url = http://127.0.0.1:8200
secret_mount_point = server1_mount
token = (...)
vault_ca = (...)

--server2:
vault_url = http://127.0.0.1:8200
secret_mount_point = sever2_mount
token = (...)
vault_ca = (...)

์—ฌ๊ธฐ์—์„œ server1๊ณผ server2๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๋งˆ์šดํŠธ ์ง€์ ์„ ์‚ฌ์šฉํ•จ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๋กœ ๋ถ„๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

--server1:
vault_url = http://127.0.0.1:8200
secret_mount_point = mount_point/server1
token = (...)
vault_ca = (...)
--server2:
vault_url = http://127.0.0.1:8200
secret_mount_point = mount_point/sever2
token = (...)
vault_ca = (...)

์ด ๊ฒฝ์šฐ ๋‘ ์„œ๋ฒ„ ๋ชจ๋‘ ๋™์ผํ•œ ๋งˆ์šดํŠธ ์ง€์  "mount_point"๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ฒฝ๋กœ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ server1์—์„œ ์ฒซ ๋ฒˆ์งธ ๋น„๋ฐ€์„ ์ƒ์„ฑํ•˜๋ฉด Vault ์„œ๋ฒ„๊ฐ€ ์ž๋™์œผ๋กœ "server1" ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. server2์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ๊ฒƒ์ด ๋™์ผํ•ฉ๋‹ˆ๋‹ค. mount_point/server1 ๋˜๋Š” mount_point/server2์—์„œ ๋งˆ์ง€๋ง‰ ์•”ํ˜ธ๋ฅผ ์‚ญ์ œํ•˜๋ฉด Vault ์„œ๋ฒ„๋„ ํ•ด๋‹น ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ๋ถ„ํ•  ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋งˆ์šดํŠธ ์ง€์ ์„ ํ•˜๋‚˜๋งŒ ๋งŒ๋“ค๊ณ  ์„œ๋ฒ„๊ฐ€ ๋ณ„๋„์˜ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์šดํŠธ ์ง€์ ์€ HTTP ์š”์ฒญ์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CURL์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

curl -L -H "X-Vault-Token: TOKEN" โ€“cacert VAULT_CA
--data '{"type":"generic"}' --request POST VAULT_URL/v1/sys/mounts/SECRET_MOUNT_POINT

๋ชจ๋“  ํ•„๋“œ(TOKEN, VAULT_CA, VAULT_URL, SECRET_MOUNT_POINT)๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  Vault ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋งˆ์šดํŠธ ์ง€์  ์ƒ์„ฑ์„ ์ž๋™ํ™”ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ด ์ •๋ณด๊ฐ€ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๋ฉฐ ์ด ์‹œ๋ฆฌ์ฆˆ์˜ ๋‹ค์Œ ๊ธฐ์‚ฌ์—์„œ ๋ต™๊ฒ ์Šต๋‹ˆ๋‹ค.

MySQL์˜ ์•”ํ˜ธํ™”: ํ‚ค ์ €์žฅ์†Œ

๋” ์ฝ์–ด๋ณด๊ธฐ:

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€