본문 바로가기
개발/DB

Real MySQL 8.0 [ING]

by 설이주인 2022. 10. 31.

http://www.yes24.com/Product/Goods/103415627

 

Real MySQL 8.0 (1권) - YES24

『Real MySQL 8.0』은 『Real MySQL』을 정제해서 꼭 필요한 내용으로 압축하고, MySQL 8.0의 GTID와 InnoDB 클러스터 기능들과 소프트웨어 업계 트렌드를 반영한 GIS 및 전문 검색 등의 확장 기능들을 추가로

www.yes24.com

 

1장 MySQL 소개

...

2장 설치와 설정

MySQL에서 시스템 변수를 변경할 상황이 발생할때가 있다.

MyySQL 서버의 시스템 변수는 서버가 기동 중인 상태에서 변경 가능한지에 따라 동적 변수/정적 변수로 구분된다.

 

현재 시스템 변수의 상태는 show 명령어로 확인 가능하다.

 

위의 설정 값들은 set으로 변경 가능하다.

하지만 set으로 변경된 상태값은 현재 가동 중인 MySQL 인스턴스에만 적용 된다는 점을 알아두자. 이 상태에서 서버를 내렸다가 올리면 설정값은 변경 전 값으로 돌아간다. 영구적으로 변경하기 위해서느느 my.cnf라는 파일을 변경해야한다.

MySQL에서는 사용자에게 set persist 명령어를 사용하면 현재 가동중인 MySQL과 설정 파일 둘 다 변경 되도록 처리해준다.

 


3장 사용자 및 권한

MySQL에는 사용자 계정의 아이디와 해당 사용자가 어느 IP에서 접속하고 있는지도 확인한다. MySQL 8.0 버전부터는 권한을 관리하는 역할 Role, 역할의 개념이 도입 되었다.

MySQL에서는 사용자가 접속하는 계정뿐 아니라 접속 지점도 계정의 일부로 취급한다.

 

'svc_id'@'127.0.0.1'

해당 ID, svc_id는 타 컴퓨터에서 접속이 불가능하다.

외부 컴퓨터에서도 접속을 가능한 계정의 IP는 %로 처리하면 된다. 식별에서 한가지 주의해야 할 점은 서로 동일한 아이디가 있을때 MySQL 서버가 사용자 인증을 위해 어떤 계정을 선택했느냐로 나뉜다.

 

'svc_id'@'192.168.0.10' [pw : 123]

'svc_id'@'%' [pw : asb]

 

192.168.0.10에서 접속할때 MySQL은 첫번째 계정, 두번째 계정 중에서 무엇으로 진행 할까?

MySQL은 범위가 가장 작은 것을 항상 먼저 선택한다. 즉 첫번째 계정으로 인증을 진행하게 될것이다.

그럼 192 IP에서 아래의 비밀번호 asb를 입력한다면? 당연히 비밀번호 비일치로 실패할 것이다.

 

MySQL 8.0부터 시스템 계정(System Account), 일반 계정(Regular Account)으로 나뉜다.

주로 시스템 계정은 서버 관리자 일반 계정은 그외 디비 접속 개발자들을 위한 계정이라고 생각하자

 

시스템 계정은 일반 계정을 관리할 수 있지만 그 반대는 불가능하다

 

시스템 계정 권한

- 계정 관리(계정 생성 및 삭제, 계정 권한 부여 및 제거)

- 다른 세션(Connection) 또는 그 세션에서 실행 중인

- 스토어드 프로그램 생성 시 DEFINER를 타 사용자로 설정

 

MySQL에는 root외의 내장된 계정이 존재한다.

'mysql.sys'@'localhost' :  8.0부터 내방된 sys, 스키마의 객체들을 DEFINER로 사용 되는 계정

'mysql.session'@'localhost' :  플러그인이 서버로 접근할 때 사용되는 계정

'mysql.infoschema'@'localhost' :  information_schema에 정의된 뷰의 DEFINER로 사용 되는 계정


8.0부터 계정 생성은 CREATE USER, 권한 부여 GRANT로 진행한다.

 

계정 생성 시 계정의

- 인증 방식

- 비밀번호 [ 유효 기간, 이력 개수, 재사용 불가 기간 ]

- 기본 역할(Role)

- SSL 옵션

- 계정 잠금 여부

IDENTIFIED

identified with 'mysql_native_password' BY 'password'

사용자의 인증 방식과 비밀번호를 설정한다.

MySQL 서버의 기본 인증 방식을 사용 한다면 'password' 형식으로 명시해야 한다.

 

- Native Pluggable Authentication : 단순 비밀번호 저장 후 클라이언트가 보낸 값과 해시 값이 일치하는지 비교하는 인증 방식

- Caching SHA-2 Pluggable Authentication : 이 인증 방식을 사용하려면 SSL/TLS 또는 RSA 키페어를 반드시 사용해랴하는데, 이를 위해 클라이언트에서 접속시 SSL 옵션을 활성화해야 한다.

- PAM Pluggable Authentication : 유닉스, 리눅스 패스워드 또는 LDAP 같은 외부 인증을 사용할 수 있게 해주는 방식 유료만 지원

- LDAP Pluggable Authentication : LDAP 외부 인증 사용 인증 방식, 유료 버전에서 지원

 

5.7 버전까지는 Native Pluggable Authentication을 기본 보안으로 지원했지만 8.0 이후로는 Caching SHA-2 Pluggable Authentication을 기본으로 잡고 있다. 하지만 SSL/TLS/RSA와 같은 키 값이 필요해진다. 호환성까지 생각하면 계정을 Native Pluggable Authentication로 생성하는 상황이 발생한다. 이때는 mysql의 기본 인증 방식을 Native Pluggable Authentication로 바꿔주자

 

set global default_authentication_plugin="mysql_native_password";

변경을 시도하면서 발생할 수 있는 에러

https://stackoverflow.com/questions/23670855/how-to-change-read-only-permission-to-set-new-value-of-mysql-server-system-varia

 

How to change read-only permission to set new value of MySQL server system variable

I am new to MySQL; recently I faced this problem while setting a new value for a system variable. I tried: mysql> set global innodb_ft_min_token_size = 6; but I am getting this error: ERROR ...

stackoverflow.com

 

REQUIRE

암호화된 SSL/TLS 채널을 사용할 여부를 설정.

별도로 설정하지 않으면 비암오화된 채널로 연결 하지만 MySQL이 Caching SHA-2 Pluggable Authentication 인증 방식을 사용하면 암호화된 채널로만 MySQL서버에 접근할 수 있다.

 

PASSWORD EXPIRE

비밀번호 유효 기간을 설정하는 옵션. 별도로 명시하지 않으면 default_password_lifetime로 설정됨

- PASSWORD EXIPRE : 계정 생성과 동시에 비밀번호의 만료 처리

- PASSWORD EXPIRE NEVER : 비밀번호 만쵸 기간 없음

- PASSWORD EXPIRE DEFAULT : default_password_lifetime  시스템 변수에 저장된 기간으로 설정됨

- PASSWORD EXPIRE INTERVAL n DAY : 비밀번호의유효 기간을 오늘부터 n일자로 설정

 

PASWORD HISTORY

사용했던 비밀번호를 재사용하지 못하게 설정하는 옵션

- PASSWORD HISTORY DEFAULT : password_history 시스템 변수 갯수만큼의 비밀번호를 저장하고 이력에 있는 비밀번호는 재사용할 수 없다.

- PASSWORD HISTORY n : 비밀번호의 이력을 최근 n개까지만 저장하며, 저장된 이력에 남아있는 비밀번호는 재사용할 수 없다.

 

비밀번호가 저장되어있는 테이블은 password_history

 

PASSWORD REUSE INTERVAL

한 번 사용했던 비밀번호 재사용 금지 기간을 설정하는 옵션

- PASSWORD REUSE INTERVAL DEFAULT : password_reuse_interval 변수에 저장된 기간으로 설정

- PASSWORD REUSE INTERVAL n DAY : n일자 이후에 비밀번호 재사용 가능

 

PASSWORD REQUIRE

비밀번호가 만료되어 새로운 비밀번호로 변경할 때 현재 비밀번호를 입력 받을지 말지 결정하는 옵션

- PASSWORD REQUIRE CURRENT : 먼저 입력

- PASSWORD REQUIRE OPTIONAL :  입력하지 않아도 되도록 설정

- PASSWORD REQUIRE DEFAULT : password_require_current  시스템 변수의 값으로 설정

 

ACCOUNT LOCK/UNLOCK

계정 생성 시 또는 ALTER USER 명령으로 계정 정보를 변경시 계정을 잠글지 말지 결정

- ACCOUNT LOCK : 계정을 사용하지 못하게 잠금

- ACCOUNT UNLOCK : 잠금 계정을 다시 사용 가능 상태로 변경


MySQL에서는 비밀번호의 조합, 금지 글자, 금칙어 설정이 가능하다.

install component 'file://component_validate_password';

POLICY

- LOW : 비밀번호의 길이만 검증

- MEDIUM : 길이, 숫자, 대소문자, 특수문자

- STRONG : MEDIUM 레벨의 검증, 금칙어가 포함 되어있는지 여부까지 검증

금칙어 파일을 텍스트로 작성 후 설정 가능하다. 인터넷에서 검색이 가능하기에 가져다가 쓰자

 

 


데이터베이스의 안전을 위해서 비밀번호를 주기적으로 변경해주는 것을 권장한다. 하지만 서비스를 멈추지 않고서는 비밀번호를 변경한다는 것은 거의 불가능에 가깝다. 이런 문제점을 MySQL 8.0부터는 계정의 비밀번호를 2개 동시에 사용할 수 있는 기능 이중 비밀번호(Dual Password)를 추가했다. 

 

이중 비밀번호는 2개의 비밀번호 중 하나만 일치하면 로그인이 통과하는 것을 의미한다.

2개의 비밀번호는 프라이머리(Primary)와 세컨더리(Secondary)로 구분된다. 최근에 설정한 비밀번호는 Primary 이전 비밀번호는 Secondary로 부른다. 이중 비밀번호를 사용하기 위해서는 기존 비밀번호 변경 구문에 RETAIN CURRENT PASSWORD 옵션을 추가하면 된다.

 


Privilege 권한

MySQL 5.7까지는 글로벌 권한과 객체 권한으로 구분되었으며 8.0에서는 동작 권한이 추가 되었다.

 

정적 권한 :  서버의 소스코드에 고정적으로 명시돼 있는 권한

동적 권한 : MySQL 서버가 시작되면서 동적으로 생성되는 권한

 

글로벌 권한 : 데이터베이스나 테이블 의외의 객체에 적용되는 권한, GRANT 명령에서 특정 객체 명시하면 안됨

객체 권한 : 데이터베이스나 테이블을 제어하는데 필요한 권한, GRANT 명령어로 권한 부여시 특정 객체를 반드시 명시해야한다.

 

ALL, ALL PRIVILEGES은 글로벌, 객체 권한 둘 다 사용 가능하다.

 

구분 저장소 테이블 [mysql] 설명
정적 user 계정 정보, 역할의 글로벌 권한
db DB단위 권한
tables_priv 테이블 단위 권한
columns_priv 칼럼 단위 권한
procs_priv 스토어드 프로그램 단위 권한
동적 global_grants 동적 글로벌 권한

ROLE 역할

역할과 계정은 내외부적으로 동일한 객체라고 하는데 그럼 왜 MySQL은 CREATE ROLE, GRANT ROLE을 분리한 것을까?

둘을 분리한 이유는 데이터베이스 관리의 직무를 분리할 수 있게 해서 보안을 강화하는 용도로 사용될 수 있게 하기 위해서다.