๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
BackEnd๐ŸŒฑ/DB & SQL

[MySQL] ์‚ฌ์šฉ์ž ์ƒ์„ฑ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ ๋ฐฉ๋ฒ•

by ์•ˆ์ฃผํ˜• 2023. 10. 6.

[๊ฐœ์š”]

MySQL์€ ์‚ฌ์šฉ์ž ๊ณ„์ •์˜ ๊ด€๋ฆฌ ๋ฐฉ์‹์ด ๋‹ค๋ฅธ DBMS์™€ ์•ฝ๊ฐ„ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค ๋งŽ์€ DBMS์—์„œ๋Š” ์•„์ด๋””๋กœ ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜์ง€๋งŒ, MySQL์€ ์‚ฌ์šฉ์ž ์•„์ด๋”” ์™ธ์—๋„ ์ ‘์†ํ•˜๋Š” IP ์ฃผ์†Œ๋ฅผ ํ•จ๊ป˜ ๊ณ ๋ คํ•˜์—ฌ ๋”์šฑ ์ •๋ฐ€ํ•œ ์ ‘๊ทผ ์ œ์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, MySQL 8.0 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” '์—ญํ• (ROLE)'์ด๋ผ๋Š” ๊ฐœ๋…๋„ ๋„์ž…๋˜์—ˆ๊ณ , ์ด๋ฅผ ํ†ตํ•ด ๋ฏธ๋ฆฌ ์ •์˜๋œ ๊ถŒํ•œ ๊ทธ๋ฃน, ์ฆ‰ 'Role'์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‰ฝ๊ฒŒ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

[์‚ฌ์šฉ์ž ์‹๋ณ„]

๊ณ„์ •๊ณผ ํ˜ธ์ŠคํŠธ๋ช…

๋Œ€๋ถ€๋ถ„์˜ DBMS๋Š” ๊ณ„์ • ์ด๋ฆ„๋งŒ์œผ๋กœ ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜์ง€๋งŒ, MySQL์€ ์‚ฌ์šฉ์ž์˜ ๊ณ„์ •๊ณผ ์ ‘์† ์ง€์ (ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ๋ช…, ๋„๋ฉ”์ธ, IP ์ฃผ์†Œ)์„ ๋™์‹œ์— ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ MySQL ๊ณ„์ •์„ ์–ธ๊ธ‰ํ•  ๋•Œ๋Š” ์•„๋ž˜์˜ ์˜ˆ์ฒ˜๋Ÿผ ์•„์ด๋””์™€ ํ˜ธ์ŠคํŠธ ์ •๋ณด๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

'svc_id'@'127.0.0.1'

์œ„ ์˜ˆ์‹œ๋Š” 'svc_id' ๊ณ„์ •์ด MySQL ์„œ๋ฒ„๊ฐ€ ๋™์ž‘ ์ค‘์ธ ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ์—์„œ๋งŒ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์—์„œ 'svc_id'๋กœ ์ ‘์†ํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด, ์ด ๊ณ„์ • ์ •๋ณด๋กœ๋Š” ์ ‘์†ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์™ธ๋ถ€ ์ ‘์†์„ ํ—ˆ์šฉํ•˜๋ ค๋ฉด ํ˜ธ์ŠคํŠธ ๋ถ€๋ถ„์„ %๋กœ ๋Œ€์ฒดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ์˜ %๋Š” ๋ชจ๋“  IP๋‚˜ ํ˜ธ์ŠคํŠธ๋ช…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

์ค‘๋ณต๋œ ๊ณ„์ •๋ช… ์ฃผ์˜

์‚ฌ์šฉ์ž ๊ณ„์ •์„ ์‹๋ณ„ํ•  ๋•Œ ์ค‘์š”ํ•œ ์ ์ด ์žˆ๋Š”๋ฐ, ๋ฐ”๋กœ ๋™์ผํ•œ ์•„์ด๋””๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. MySQL ์„œ๋ฒ„๋Š” ๋™์ผํ•œ ์•„์ด๋””๋ฅผ ๊ฐ€์ง„ ์—ฌ๋Ÿฌ ๊ณ„์ •์ด ์žˆ์„ ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š”๋ฐ, MySQL์€ ๋™์ผํ•œ ์•„์ด๋””๋ฅผ ๊ฐ€์ง€๋Š” ์ •๋ณด๊ฐ€ ์žˆ์„ ๋•Œ ๋ฒ”์œ„๊ฐ€ ์ข์€ ๊ณ„์ •์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

'svc_id'@'192.168.0.10' -- ๋น„๋ฐ€๋ฒˆํ˜ธ: 123
'svc_id'@'%' -- ๋น„๋ฐ€๋ฒˆํ˜ธ: abc

์œ„์™€ ๊ฐ™์€ ๊ณ„์ • ์ •๋ณด๊ฐ€ ์žˆ์„ ๋•Œ, '192.168.0.10' IP๋กœ ์ ‘์†์„ ์‹œ๋„ํ•˜๋ฉด, MySQL์€ ๋ฒ”์œ„๊ฐ€ ์ข์€ 'svc_id'@'192.168.0.10' ๊ณ„์ •์„ ์šฐ์„  ์ธ์ฆํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ƒํ™ฉ์—์„œ 'svc_id' ๊ณ„์ •์œผ๋กœ 'abc' ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•˜๋ฉด '๋น„๋ฐ€๋ฒˆํ˜ธ ๋ถˆ์ผ์น˜' ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ์ค‘์ฒฉ๋œ ๊ณ„์ • ์„ค์ •์€ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

 

 

[์‚ฌ์šฉ์ž ๊ณ„์ • ๊ด€๋ฆฌ]

์‹œ์Šคํ…œ ๊ณ„์ •๊ณผ ์ผ๋ฐ˜ ๊ณ„์ •

MySQL 8.0๋ถ€ํ„ฐ ๊ณ„์ •์€ 'SYSTEM_USER' ๊ถŒํ•œ์˜ ์œ ๋ฌด์— ๋”ฐ๋ผ ์‹œ์Šคํ…œ ๊ณ„์ •๊ณผ ์ผ๋ฐ˜ ๊ณ„์ •์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ๊ณ„์ •์€ ์„œ๋ฒ„ ๋‚ด๋ถ€์ ์ธ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์™€๋Š” ์—ฐ๊ด€์ด ์—†์œผ๋ฉฐ, ์ด ๊ณ„์ •์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ์ž์šฉ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ์ผ๋ฐ˜ ๊ณ„์ •์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์šฉ์ž๋‚˜ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ ๊ณ„์ •์€ ๋ชจ๋“  ๊ณ„์ •์˜ ๊ด€๋ฆฌ ๊ถŒํ•œ์„ ๊ฐ€์ง€๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ค‘์š”ํ•œ ๊ด€๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ณ„์ • ๊ด€๋ฆฌ(๊ณ„์ • ์ƒ์„ฑ, ์‚ญ์ œ ๋ฐ ๊ถŒํ•œ ์„ค์ •)
  • ๋‹ค๋ฅธ ์„ธ์…˜ ๋˜๋Š” ์ฟผ๋ฆฌ์˜ ๊ฐ•์ œ ์ข…๋ฃŒ
  • ์Šคํ† ์–ด๋“œ ํ”„๋กœ๊ทธ๋žจ ์ƒ์„ฑ ์‹œ, ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋ฅผ DEFINER๋กœ ์ง€์ •

์ด๋Ÿฌํ•œ ๊ตฌ๋ถ„์€ DBA ๊ณ„์ •์—๋งŒ 'SYSTEM_USER' ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๊ณ  ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋ถ€์—ฌํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ MySQL ์„œ๋ฒ„์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์žฅ ๊ณ„์ •๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ์ค‘ 'root'@'localhost'๋ฅผ ์ œ์™ธํ•˜๋ฉด, ๋‚˜๋จธ์ง€ ๊ณ„์ •๋“ค์€ ํŠน์ • ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ์‚ญ์ œํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • 'mysql.sys'@'localhost': MySQL 8.0๋ถ€ํ„ฐ ์ œ๊ณต๋˜๋ฉฐ, sys ์Šคํ‚ค๋งˆ ๊ฐ์ฒด์˜ DEFINER๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • 'mysql.session'@'localhost': MySQL ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ ‘๊ทผ์šฉ ๊ณ„์ •์ž…๋‹ˆ๋‹ค.
  • 'mysql.infoschema'@'localhost': information_schema๋ทฐ์˜ DEFINER๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์œ„์— ์–ธ๊ธ‰ํ•œ 3๊ฐœ์˜ ๊ณ„์ •์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž ๊ฒจ(account_locked ์นผ๋Ÿผ) ์žˆ๋Š” ์ƒํƒœ์ด๋ฏ€๋กœ ์˜๋„์ ์œผ๋กœ ์ž ๊ธด ๊ณ„์ •์„ ํ’€์ง€ ์•Š๋Š” ํ•œ ์•…์˜์ ์œผ๋กœ ์‚ฌ์šฉ๋  ๊ฑฑ์ •์€ ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

 

 

๊ณ„์ • ์ƒ์„ฑ

MySQL 5.7๊นŒ์ง€๋Š” 'GRANT' ๋ช…๋ น์–ด๋กœ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋ฉด์„œ ๋™์‹œ์— ๊ณ„์ •์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ, MySQL 8.0๋ถ€ํ„ฐ๋Š” ๊ณ„์ • ์ƒ์„ฑ์„ ์œ„ํ•œ 'CREATE USER' ๋ช…๋ น๊ณผ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ์œ„ํ•œ 'GRANT' ๋ช…๋ น์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ณ„์ • ์ƒ์„ฑ ์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ต์…˜์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ณ„์ •์˜ ์ธ์ฆ ๋ฐฉ์‹๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ
  • ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ด€๋ จ ์˜ต์…˜(๋น„๋ฐ€๋ฒˆํ˜ธ ์œ ํšจ ๊ธฐ๊ฐ„, ๋น„๋ฐ€๋ฒˆํ˜ธ ์ด๋ ฅ ๊ฐœ์ˆ˜, ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€ ์‹œ๊ฐ„)
  • ๊ธฐ๋ณธ ์—ญํ• (Role)
  • SSL ์˜ต์…˜
  • ๊ณ„์ • ์ž ๊ธˆ ์—ฌ๋ถ€

๋‹ค์Œ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” 'CREATE USER' ๋ช…๋ น์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

CREATE USER 'user'@'%'
IDENTIFIED WITH 'mysql_native_password' BY 'password'
REQUIRE NONE
PASSWORD EXPIRE INTERVAL 30 DAY
ACCOUNT UNLOCK
PASSWORD HISTORY DEFAULT
PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT;

์œ„ ์˜ˆ์ œ์˜ ๊ฐ ์˜ต์…˜์„ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ด…์‹œ๋‹ค.

 

IDENTIFIED WITH

์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ๋ฐฉ์‹๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. MySQL ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ์ธ์ฆ ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ฃผ์š” ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. Native Pluggable Authentication: MySQL 5.7๊นŒ์ง€์˜ ๊ธฐ๋ณธ ๋ฐฉ์‹์œผ๋กœ, SHA-1 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•ด์‹œ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค.
  2. Cacging SHA-2 Pluggable Authentication: MySQL 8.0์˜ ๊ธฐ๋ณธ ์ธ์ฆ ๋ฐฉ์‹์œผ๋กœ, ๋ณด์•ˆ์„ฑ์ด ๋†’์€ SHA-2 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ํ•ด์‹œ๊ฐ’ ๊ณ„์‚ฐ์— ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋˜๋ฏ€๋กœ, ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ํ•ด์‹œ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์บ์‹ฑํ•ฉ๋‹ˆ๋‹ค.
  3. PAM pluggable Authentication: ์œ ๋‹‰์Šค๋‚˜ ๋ฆฌ๋ˆ…์Šค์˜ ํŒจ์Šค์›Œ๋“œ ๋˜๋Š” LDAP๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, MySQL ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์—๋””์…˜์—๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
  4. LDAP pluggable Authentication: LDAP ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, MySQL ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์—๋””์…˜์—์„œ๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

MySQL 5.7 ๋ฒ„์ „๊นŒ์ง€๋Š” Native Authentication์ด ๊ธฐ๋ณธ ์ธ์ฆ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋์ง€๋งŒ MySQL. 8.0 ๋ฒ„ ์ „๋ถ€ํ„ฐ๋Š” Caching SHA-2 Authentication์ด ๊ธฐ๋ณธ ์ธ์ฆ์œผ๋กœ ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋กœ ์ธํ•ด Native Authentication ๋ฐฉ์‹์„ ๊ณ„์† ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ • ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

--// Native Authentication์„ ๊ธฐ๋ณธ ์ธ์ฆ ๋ฐฉ์‹์œผ๋กœ ์„ค์ •
SET GLOBAL default_authentication_plugin="mysql_native_password";

 

์ฃผ์˜ ์‚ฌํ•ญ

MySQL์˜ Caching SHA-2 Pluggable Authentication ๋ฐฉ์‹์€ SCRAM ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด๋Š” ํ‰๋ฌธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์•”ํ˜ธํ™”ํ•˜์—ฌ ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž… ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ์ž๋‚˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์—ฐ๊ฒฐ ์†๋„๋ฅผ ๋Š๋ฆฌ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SCRAM ์ธ์ฆ์˜ ํ•ด์‹œ ํ•จ์ˆ˜ ์‹คํ–‰ ํšŸ์ˆ˜๋Š” 'sha2_password_digest_rounds' ๋ณ€์ˆ˜๋กœ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๊ธฐ๋ณธ ๊ฐ’์€ 5000์ž…๋‹ˆ๋‹ค.

 

REQUIRE

MySQL ์„œ๋ฒ„์— ์ ‘์† ์‹œ SSL/TLS ์•”ํ˜ธํ™” ์ฑ„๋„์˜ ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„์•”ํ˜ธํ™” ์ฑ„๋„๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ 'REQUIRE' ์˜ต์…˜์„ SSL๋กœ ์„ค์ •ํ•˜์ง€ ์•Š๋”๋ผ๋„ Caching SHA-2 Authentication ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด MySQL ์„œ๋ฒ„ ์ ‘์† ์‹œ ์•”ํ˜ธํ™” ์ฑ„๋„๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

PASSWORD EXPIRE

๋น„๋ฐ€๋ฒˆํ˜ธ์˜ ์œ ํšจ ๊ธฐ๊ฐ„์„ ์„ค์ •ํ•˜๋Š” ์˜ต์…˜์ด๋ฉฐ, ๋ณ„๋„๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด default_password_lifetime ์‹œ์Šคํ…œ ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ธฐ๊ฐ„์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋น„๋ฐ€๋ฒˆํ˜ธ ์œ ํšจ๊ธฐ๊ฐ„ ์„ค์ •์€ ๊ด€๋ฆฌ์ž๋‚˜ ๊ฐœ๋ฐœ์ž ๊ณ„์ •์—๋Š” ๊ถŒ์žฅ๋˜์ง€๋งŒ, ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ณ„์ •์—๋Š” ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

PASSWORD EXPIRE ์ ˆ์— ์„ค์ • ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • PASSWORD EXPIRE: ๊ณ„์ •์„ ์ƒ์„ฑํ•  ๋•Œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฆ‰์‹œ ๋งŒ๋ฃŒ
  • PASSWORD EXPIRE NEVER: ๋น„๋ฐ€๋ฒˆํ˜ธ ๋งŒ๋ฃŒ ์—†์Œ
  • PASSWORD EXPIRE DEFAULT: default_password_lifetime ์‹œ์Šคํ…œ ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ธฐ๊ฐ„์œผ๋กœ ์œ ํšจ๊ธฐ๊ฐ„ ์„ค์ •
  • PASSWORD EXPIRE INTERVAL n DAY: ์˜ค๋Š˜๋ถ€ํ„ฐ n์ผ ํ›„ ๋งŒ๋ฃŒ

 

PASSWORD HISTORY

ํ•œ ๋ฒˆ ์‚ฌ์šฉํ–ˆ๋˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ์„ค์ •ํ•˜๋Š” ์˜ต์…˜์œผ๋กœ, PASSWORD HISTORY ์ ˆ์— ์„ค์ • ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • PASSWORD HISTORY DEFAULT: ์‹œ์Šคํ…œ ๋ฒˆ์ˆ˜์— ์ง€์ •๋œ ๊ฐœ์ˆ˜๋งŒํผ์˜ ์ด์ „ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•˜๋ฉฐ, ์ €์žฅ๋œ ์ด๋ ฅ ์•ˆ์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€
  • PASSWORD HISTORY n: ์ตœ๊ทผ n๊ฐœ์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋งŒ ์ €์žฅํ•˜๋ฉฐ, ์ €์žฅ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€

ํ•œ ๋ฒˆ ์‚ฌ์šฉํ–ˆ๋˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด ์ด์ „์— ์‚ฌ์šฉํ–ˆ๋˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ MySQL ์„œ๋ฒ„๊ฐ€ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋ฅผ ์œ„ํ•ด MySQL ์„œ๋ฒ„๋Š” mysql DB์˜ password_history ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

PASSWORD REUSE INTERVAL

ํ•œ ๋ฒˆ ์‚ฌ์šฉํ–ˆ๋˜ ๋น„๋ฐ€๋ฒˆํ˜ธ์˜ ์žฌ์‚ฌ์šฉ ๊ธˆ์ง€ ๊ธฐ๊ฐ„์„ ์„ค์ •ํ•˜๋Š” ์˜ต์…˜์ด๋ฉฐ, ๋ณ„๋„๋กœ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด password_reuse_interval ์‹œ์Šคํ…œ ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ธฐ๊ฐ„์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. PASSWORD REUSE INTERVAL ์ ˆ์— ์„ค์ • ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • PASSWORD REUSE INTERYAL DEFAULT: password_reuse_interval ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ธฐ๊ฐ„์œผ๋กœ ์„ค์ •
  • PASSWORD REUSE INTERVAL n DAY: n์ผ ์ดํ›„์— ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์„ค์ •

 

PASSWORD REQUIRE

๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐ˜๋ฃŒ ํ›„ ๋ณ€๊ฒฝ ์‹œ, ์ด์ „ ๋น„๋ฐ€๋ฒˆํ˜ธ์˜ ์ž…๋ ฅ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ณ„๋„๋กœ ๋ช…์‹œ๋˜์ง€ ์•Š์œผ๋ฉด password_require_current ์‹œ์Šคํ…œ ๋ณ€์ˆ˜์˜ ๊ฐ’์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. PASSWORD REQUIRE ์ ˆ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • PASSWORD REQUIRE CURRENT: ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ํ˜„์žฌ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋จผ์ € ์ž…๋ ฅํ•˜๋„๋ก ์„ค์ •
  • PASSWORD REQUIRE OPTIONAL: ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ํ˜„์žฌ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์ง€ ์•Š์•„๋„ ๋˜๋„๋ก ์„ค์ •
  • PASSWORD REQUIRE DEFAULT: password_require_current ์‹œ์Šคํ…œ ๋ณ€์ˆ˜์˜ ๊ฐ’์œผ๋กœ ์„ค์ •

 

ACCOUNT LOCK / UNLOCK

๊ณ„์ • ์ƒ์„ฑ ์‹œ ๋˜๋Š” ALTER USER ๋ช…๋ น์„ ์‚ฌ์šฉํ•ด ๊ณ„์ • ์ •๋ณด๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ์ž ๊ธ€์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ACCOUNT LOCK: ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ์ž ๊ธˆ
  • ACCOUNT UNLOCK: ์ž ๊ธด ๊ณ„์ •์„ ๋‹ค์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์ƒํƒœ๋กœ ์ž ๊ธˆ ํ•ด์ œ

 

 

[๋น„๋ฐ€๋ฒˆํ˜ธ ๊ด€๋ฆฌ]

๊ณ ์ˆ˜์ค€ ๋น„๋ฐ€๋ฒˆํ˜ธ

MySQL์—์„œ๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ์˜ ์œ ํšจ๊ธฐ๊ฐ„, ์žฌ์‚ฌ์šฉ ์ œํ•œ, ๋ณต์žก์„ฑ ๊ฒ€์ฆ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ณด์•ˆ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, ์‚ฌ์šฉ์ž๊ฐ€ ์˜ˆ์ƒํ•˜๊ธฐ ์‰ฌ์šด ๋‹จ์–ด๋‚˜ ํŒจํ„ด์„ ํฌํ•จํ•˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ์˜ ์‚ฌ์šฉ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด MySQL์€ validate_password ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ด ์ปดํฌ๋„ŒํŠธ๋Š” MySQL ์„œ๋ฒ„์— ๊ธฐ๋ณธ์œผ๋กœ ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ํŒŒ์ผ ๊ฒฝ๋กœ ์ง€์ • ์—†์ด ๋ฐ”๋กœ ์„ค์น˜๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

validate_password ์ปดํฌ๋„ŒํŠธ ์„ค์น˜

INSTALL COMPONENT 'file://component_validate_password';

์ปดํฌ๋„ŒํŠธ ์„ค์น˜ ํ›„ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” ์‹œ์Šคํ…œ ๋ณ€์ˆ˜๋“ค์„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ น์–ด๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SHOW VARIABLES LIKE 'validate_password%';

๋น„๋ฐ€๋ฒˆํ˜ธ ์ •์ฑ…์€ ํฌ๊ฒŒ ๋‹ค์Œ 3๊ฐ€์ง€ ์ค‘์—์„œ ์„ ํƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ธฐ๋ณธ๊ฐ’์€ MEDIUM์œผ๋กœ ์ž๋™ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

  • LOW: ๋น„๋ฐ€๋ฒˆํ˜ธ์˜ ๊ธธ์ด๋งŒ ๊ฒ€์ฆ
  • MEDIUM: ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ธธ์ด, ์ˆซ์ž, ๋Œ€์†Œ๋ฌธ์ž, ํŠน์ˆ˜๋ฌธ์ž ํฌํ•จ ์—ฌ๋ถ€ ๊ฒ€์ฆ
  • STRONG: MEDIUM์œผ ๋ชจ๋“  ๊ฒ€์ฆ์— ์ถ”๊ฐ€๋กœ ๊ธˆ์น™์–ด ํฌํ•จ ์—ฌ๋ถ€๋„ ๊ฒ€์ฆ

validate_password.length๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ์˜ ๊ธธ์ด, validate_password.mixed_case_count์™€ validate_password.number_count, validate_password.special_char_count๋Š” ์ˆซ์ž์™€ ๋Œ€์†Œ๋ฌธ์ž, ํŠน์ˆ˜๋ฌธ์ž๋ฅผ ์ผ์ • ์ˆ˜ ์ด์ƒ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š”์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ธˆ์น™์–ด๋Š” validate_password.dictionary_file ์‹œ์Šคํ…œ ๋ณ€์ˆ˜์— ๊ธˆ์น™์–ด๋“ค์ด ์ €์žฅ๋œ ์‚ฌ์ „ ํŒŒ์ผ์„ ๋“ฑ๋กํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ธˆ์น™์–ด ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ธˆ์น™์–ด๋“ค์„ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ๊ธฐ๋กํ•ด์„œ ์ €์žฅํ•œ ํ…์ŠคํŠธ ํŒŒ์ผ๋กœ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

password
123456
admin

๊ธˆ์น™์–ด ํŒŒ์ผ์„ ์ž‘์„ฑํ•œ ํ›„, ์ด๋ฅผ MySQL ์„œ๋ฒ„์— ์ ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋‹จ, ์ด ๊ธฐ๋Šฅ์€ validate_password.policy๊ฐ€ 'STRONG'์ผ ๋•Œ๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

SET GLOBAL validate_password.dictionary_file='/path/to/prohibitive_word.data';
SET GLOBAL validate_password.policy='STRONG';

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด MySQL์€ ์ง€์ •๋œ ๊ธˆ์น™์–ด๋ฅผ ํฌํ•จํ•˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ์˜ ์‚ฌ์šฉ์„ ์ œํ•œํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์ด์ค‘ ๋น„๋ฐ€๋ฒˆํ˜ธ

MySQL8.0๋ถ€ํ„ฐ๋Š” ๊ณ„์ •์˜ ๋ณด์•ˆ์„ ๋”์šฑ ๊ฐ•ํ™”ํ•˜๊ณ ์ž ํ•˜๋Š” ์˜๋„๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ 2๊ฐœ์˜ ๊ฐ’์„ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ(DUAL ๋น„๋ฐ€๋ฒˆํ˜ธ)์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์˜ ํ•ต์‹ฌ์€ ํ•˜๋‚˜์˜ ๊ณ„์ •์— ๋‘ ๊ฐœ์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ, ์ด ๋‘ ๊ฐœ์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ค‘ ํ•˜๋‚˜๋งŒ ๋งž๊ฒŒ ์ž…๋ ฅํ•ด๋„ ๋กœ๊ทธ์ธ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

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

์•„๋ž˜๋Š” ์‚ฌ์šฉ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

-- ๋จผ์ €, 'user'์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ 'old_password'๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
ALTER USER 'user'@'%' IDENTIFIED BY 'old_password';

-- ์ด์ œ 'old_password'๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ 'new_password'๋ฅผ ์ฃผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
ALTER USER 'user'@'%' IDENTIFIED BY 'new_password' RETAIN CURRENT PASSWORD;

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•œ ํ›„์—๋Š” 'old_password'์™€ 'new_password' ๋ชจ๋‘๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

[๊ถŒํ•œ(Privilege)]

MySQL์€ ๊ถŒํ•œ ๊ด€๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ์ ˆํ•œ ๊ถŒํ•œ๋งŒ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. MySQL 5.7 ๋ฒ„์ „๊นŒ์ง€๋Š” ์ฃผ๋กœ ๋‹ค์Œ ์ฃผ ์ข…๋ฅ˜์˜ ๊ถŒํ•œ์œผ๋กœ ๋‚˜๋‰˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฐ์ฒด ๊ถŒํ•œ: ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ํ…Œ์ด๋ธ”์— ์ ์šฉ๋˜๋Š” ๊ถŒํ•œ
  • ๊ธ€๋กœ๋ฒŒ ๊ถŒํ•œ: MySQL ์„œ๋ฒ„ ์ „๋ฐ˜์— ์ ์šฉ๋˜๋Š” ๊ถŒํ•œ์œผ๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ํ…Œ์ด๋ธ” ์™ธ์— ๋‹ค๋ฅธ ์ž์›์—๋„ ์ ์šฉ

MySQL 8.0 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” ๋™์  ๊ถŒํ•œ์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ๊ถŒํ•œ์ด ์ถ”๊ฐ€๋˜๋ฉด์„œ, ์ด์ „ ๋ฒ„์ „์˜ ๊ถŒํ•œ๋“ค์€ ์ •์  ๊ถŒํ•œ์œผ๋กœ ๋ถˆ๋ฆฌ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋™์  ๊ถŒํ•œ์€ ์„œ๋ฒ„์— ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋‚˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์„ค์น˜๋  ๋•Œ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ž…๋‹ˆ๋‹ค.

 

๊ธ€๋กœ๋ฒŒ ๊ถŒํ•œ ๋ถ€์—ฌํ•˜๊ธฐ

๊ธ€๋กœ๋ฒŒ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

GRANT SUPER ON *.* TO 'user'@'%';

๊ทธ๋Ÿฌ๋‚˜, ๊ธ€๋กœ๋ฒŒ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋”๋ผ๋„ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ํ…Œ์ด๋ธ”์— ์ ‘๊ทผํ•˜๋Š” ๊ถŒํ•œ์€ ์ž๋™์œผ๋กœ ๋ถ€์—ฌ๋˜์ง€ ์•Š๊ธฐ์— ์œ ์˜ํ•ด์•ผ ํ•˜๋ฉฐ, ๊ธ€๋กœ๋ฒŒ ๊ถŒํ•œ์€ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ํ…Œ์ด๋ธ”์— ํ•œ์ •๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ '*.*' ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ถŒํ•œ์„ ํ™•์ธํ•˜๋ ค๋ฉด, ํ•ด๋‹น ๊ณ„์ •์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ถ€์—ฌ๋œ ๊ถŒํ•œ ๋ชฉ๋ก์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SHOW GRANTS FOR '๊ณ„์ •์ด๋ฆ„'@'ํ˜ธ์ŠคํŠธ';

 

๊ถŒํ•œ ๋ถ€์—ฌ ์ข…๋ฅ˜

-- ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ๊ถŒํ•œ ๋ถ€์—ฌ
GRANT ALL PRIVILEGES ON *.* TO 'user'@'%';

-- ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด์„œ๋งŒ ๊ถŒํ•œ ๋ถ€์—ฌ
GRANT ALL PRIVILEGES ON mydb.* TO 'user'@'%';

-- ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํŠน์ • ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด์„œ๋งŒ ๊ถŒํ•œ ๋ถ€์—ฌ
GRANT SELECT, INSERT ON mydb.mytable TO 'user'@'%';

๋‹ค๋งŒ, ํ…Œ์ด๋ธ”์ด๋‚˜ ์นผ๋Ÿผ ๋‹จ์œ„์˜ ๊ถŒํ•œ์€ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋ฐ, ์นผ๋Ÿผ ๋‹จ์œ„์˜ ๊ถŒํ•œ์ด ํ•˜๋‚˜๋ผ๋„ ์„ค์ •๋˜๋ฉด ๋‚˜๋จธ์ง€ ๋ชจ๋“  ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์นผ๋Ÿผ์— ๋Œ€ํ•ด์„œ๋„ ๊ถŒํ•œ ์ฒดํฌ๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์นผ๋Ÿผ ํ•˜๋‚˜์— ๋Œ€ํ•ด์„œ๋งŒ ๊ถŒํ•œ์„ ์„ค์ •ํ•˜๋”๋ผ๋„ ์ „์ฒด์ ์ธ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

 

[์—ญํ• (Role)]

MySQL8.0๋ถ€ํ„ฐ๋Š” ๊ถŒํ•œ ๊ด€๋ฆฌ๋ฅผ ๋ณด๋‹ค ํšจ๊ณผ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์—ญํ• (Role) ๊ธฐ๋Šฅ์ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์—ญํ• ์€ ์ด๋ฆ„๋งŒ์œผ๋กœ๋Š” ๊ณ„์ •๊ณผ ๊ตฌ๋ณ„๋˜์ง€๋งŒ, ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๊ณ„์ •๊ณผ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์—ญํ•  ์ƒ์„ฑ

์—ญํ• ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 'CREATE ROLE' ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

CREATE ROLE role_testdb_read, role_testdb_write;

์—ญํ• ์— ๊ถŒํ•œ ๋ถ€์—ฌ

์ƒ์„ฑ๋œ ์—ญํ• ์— ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

GRANT SELECT ON testdb.* TO role_testdb_read;
GRANT INSERT, UPDATE, DELETE ON testdb.* TO role_testdb_write;

์‚ฌ์šฉ์ž ๊ณ„์ • ์ƒ์„ฑ

๋‹ค์Œ์œผ๋กœ ์ด ์—ญํ• ์„ ์‚ฌ์šฉํ•  ๊ณ„์ •์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

CREATE USER reader@'%' IDENTIFIED BY '12345678';
CREATE USER writer@'%' IDENTIFIED BY '12345678';

๊ณ„์ •์— ์—ญํ•  ๋ถ€์—ฌ

์ƒ์„ฑํ•œ ๊ณ„์ •์— ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

GRANT role_testdb_read TO reader@'%';
GRANT role_testdb_read, role_testdb_write TO writer@'%';

์—ญํ•  ํ™œ์„ฑํ™”

'SELECT current_role();'๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ํ™œ์„ฑํšŒ๋œ ์—ญํ• ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ดˆ๊ธฐ์—๋Š” ์—ญํ• ์ด ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์€ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— 'SET ROLE' ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ญํ• ์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

SET ROLE 'role_testdb_read';

์—ญํ•  ์ž๋™ ํ™œ์„ฑํ™”

๋งค๋ฒˆ ์—ญํ• ์„ ์ˆ˜๋™์œผ๋กœ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์€ ๋ฒˆ๊ฑฐ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. MySQL์€ ์ด๋ฅผ ์ž๋™ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์‹œ์Šคํ…œ ๋ณ€์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด activate_all_roles_on_login ์‹œ์Šคํ…œ ๋ณ€์ˆ˜๊ฐ€ ON์œผ๋กœ ์„ค์ •๋˜๋ฉด ๋งค๋ฒˆ SET ROLE ๋ช…๋ น์œผ๋กœ ์—ญํ• ์„ ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š์•„๋„ ๋กœ๊ทธ์ธ๊ณผ ๋™์‹œ์— ๋ถ€์—ฌ๋œ ์—ญํ• ์ด ์ž๋™์œผ๋กœ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

SET GLOBAL activate_all_roles_on_login=ON;

 

์—ญํ• ๊ณผ ๊ณ„์ •์˜ ๊ด€๊ณ„

์ด์ „์— ๋งํ–ˆ๋“ฏ์ด, MySQL ์„œ๋ฒ„์—์„œ์˜ '์—ญํ• '๊ณผ '์‚ฌ์šฉ์ž ๊ณ„์ •'์€ ๋งŽ์€ ์œ ์‚ฌ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์‹ค์ œ๋กœ MySQL ์„œ๋ฒ„ ๋‚ด๋ถ€์—์„œ๋Š” ๋‘˜์„ ๋™์ผํ•œ ๊ฐ์ฒด๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ฃผ๋ชฉ์ ์€ ์‚ฌ์šฉ์ž ๊ณ„์ •์— ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž ๊ณ„์ •์ด ๊ฐ€์ง„ ๊ถŒํ•œ์„ ํšจ์œจ์ ์œผ๋กœ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

๊ณ„์ •(User)

  • ๋กœ๊ทธ์ธ์ด ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ…Œ์ด๋ธ”์— ์ง์ ‘์ ์ธ ๊ถŒํ•œ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

์—ญํ• (Role)

  • ๋กœ๊ทธ์ธ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๊ถŒํ•œ์„ ๋ฌถ์–ด์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋‹จ์œ„์ด๋‹ค.
  • ๊ณ„์ •์—๊ฒŒ ๋ถ€์—ฌ๋  ์ˆ˜ ์žˆ๋‹ค.

์‹ค์ œ๋กœ ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด MySQL์— ์ €์žฅ๋œ ๊ณ„์ •์„ ๋ชจ๋‘ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SELECT user,host,account_locked from mysql.user;

์œ„ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ์—ญํ• ๊ณผ ๊ณ„์ •์ด ๋ชจ๋‘ 'user' ํ…Œ์ด๋ธ”์—์„œ ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ„์ •์— ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๋Š” ๊ณผ์ •์€ ๊ทผ๋ณธ์ ์œผ๋กœ ํ•˜๋‚˜์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€์ง„ ๊ถŒํ•œ์„ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ ์ง‘ํ•ฉ์— ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— 'CREATE ROLE' ๋ช…๋ น์–ด์—์„œ ํ˜ธ์ŠคํŠธ ์ •๋ณด๊ฐ€ ์ƒ๋žต๋˜์–ด ์žˆ์œผ๋ฉฐ, ์‹ค์ œ๋กœ ์ด๋Š” ๋ชจ๋“  ํ˜ธ์ŠคํŠธ('%')์— ๋Œ€ํ•ด ์•”์‹œ์ ์œผ๋กœ ์ ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด, ์™œ 'CREATE ROLE'๊ณผ 'CREATE USER'๋ฅผ ๊ตฌ๋ถ„ํ•ด์•ผ ํ• ๊นŒ์š”?

๋‹จ์ˆœํžˆ ๋งํ•˜๋ฉด, 'CREATE ROLE'์€ ๊ณ„์ •์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ถŒํ•œ์˜ ์ง‘ํ•ฉ(์—ญํ• )์„ ์ •์˜ํ•˜๋Š” ๋ช…๋ น์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 'account_locked' ์ปฌ๋Ÿผ์ด 'Y'๋กœ ์„ค์ •๋œ ์—ญํ• ์€ ๋กœ๊ทธ์ธ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, 'CREATE USER'๋กœ ์ƒ์„ฑ๋œ ๊ณ„์ •์€ ๋กœ๊ทธ์ธ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋” ๊น”๋”ํ•˜๊ฒŒ ์—ญํ•  ๊ด€๊ณ„๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด, ๋‹ค์Œ์˜ ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • mysql.default_roles: ๊ฐ ๊ณ„์ •์— ๋ถ€์—ฌ๋œ ๊ธฐ๋ณธ ์—ญํ• ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • mysql.role_edges: ๋ถ€์—ฌ๋œ ์—ญํ•  ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ทธ๋ž˜ํ”„ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

 

 

์ฐธ๊ณ 

Real MySQL 8.0(1๊ถŒ)

๋Œ“๊ธ€