[MySQL] μ¬μ©μ μμ± λ° κΆν λΆμ¬ λ°©λ²
[κ°μ]
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 μλ²μμ μ 곡νλ λ€μν μΈμ¦ λ°©μ μ€ νλλ₯Ό μ νν μ μλλ°, μ£Όμ λ°©μμ λ€μκ³Ό κ°μ΅λλ€.
- Native Pluggable Authentication: MySQL 5.7κΉμ§μ κΈ°λ³Έ λ°©μμΌλ‘, SHA-1 μκ³ λ¦¬μ¦μ μ¬μ©ν΄ λΉλ°λ²νΈ ν΄μκ°μ μ μ₯νκ³ μΈμ¦ν©λλ€.
- Cacging SHA-2 Pluggable Authentication: MySQL 8.0μ κΈ°λ³Έ μΈμ¦ λ°©μμΌλ‘, 보μμ±μ΄ λμ SHA-2 μκ³ λ¦¬μ¦μ μ¬μ©ν©λλ€. μ΄ λ°©μμ ν΄μκ° κ³μ°μ μκ°μ΄ λ§μ΄ μμλλ―λ‘, μ΅μ νλ₯Ό μν΄ ν΄μκ°μ λ©λͺ¨λ¦¬μ μΊμ±ν©λλ€.
- PAM pluggable Authentication: μ λμ€λ 리λ μ€μ ν¨μ€μλ λλ LDAPλ₯Ό μ¬μ©νλ λ°©μμΌλ‘, MySQL μν°νλΌμ΄μ¦ μλμ μλ§ μ 곡λ©λλ€.
- 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: λΆμ¬λ μν κ°μ κ΄κ³λ₯Ό νννλ κ·Έλν μ 보λ₯Ό μ 곡νλ€.