본문 바로가기
Books/RealMySQL 8.0

3.3 비밀번호 관리

by 두두리안 2021. 10. 3.
728x90

3.3.1 고수준 비밀번호

- MySQL 서버의 비밀번호는 유효기간이나 이력 관리를 통한 재사용 금지 기능뿐만 아니라 비밀번호를

   쉽게 유추할 수 있는 단어들이 사용되지 않게 글자의 조합을 강제하거나 금칙어를 설정하는 기능이 있다

- MySQL 서버에서 비밀번호의 유효성 체크 규칙을 적용하려면 'validate_password' 컴포넌트를 이용한다

## validate_password 컴포넌트 설치
INSTALL COMPONENT 'file://component_validate_password';

## 설치된 컴포넌트 확인
SELECT * FROM mysql.component;

## validate_password 컴포넌에서 제공하는 시스템 변수 확인
SHOW GLOBAL VARIABLES LIKE 'validate_password%';

 

설치된 컴포넌트 확인
validate_password 시스템 변수


비밀번호 정책은 크게 3가지 중에서 선택할 수 있고 기본값은 MEDIUM으로 자동 설정된다

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

- MEDIUM : 비밀번호의 길이를 검증하며, 숫자와 대소문자, 그리고 특수문자의 배합을 검증

- STRONG : MEDIUM 레벨의 검증을 모두 수행하며, 금칙어가 포함됐는지 여부까지 검증

 

금칙어 파일은 금치어들을 한 줄에 하나씩 기록해서 저장한 텍스트 파일로 작성하면 된다

- 금칙어 파일이 준비되면 MySQL 서버에 금칙어 파일을 등록하면 된다

## 비밀번호 금칙어는 validate_password.policy 시스템 변수가 'STRONG' 으로 설정된 겨우에만 작동
## 금칙어를 적용하려면 validate_password.policy 시스템 변수도 함께 변경한다
SET GLOBAL validate_password.dictionary_file = 'prohibitive_word.data';
SET GLOBAL validate_password.policy = 'STRONG';

validate_password를 플러그인으로 활성화한 경우와 컴포넌트로 활성화한 경우의 차이 살펴보자

## MySQL 5.7 버전까지는 validate_password가 플러그인 형태로 제공 됐지만
## MySQL 8.0 버전부터는 컴포넌트 형태로 제공된다
## validate_password를 플러그인으로 활성화한 경우와 컴포넌트로 활성화한 경우의 차이 살펴보자
SELECT * FROM mysql.plugin WHERE name = 'validate_password';

SELECT * FROM mysql.component WHERE component_urn LIKE '%validate_password%';

SHOW GLOBAL VARIABLES LIKE 'validate_password%';

- 사용자 측면에서는 플러그인이나 컴포넌트 모두 거의 동일한 기능을 제공하며, 단지 제공되는 시스템 변수의 이름에 차이만 있다

- 플러그인의 단점을 보완하기 위해서 MySQL 8.0부터 컴포넌트가 도입됐으므로 가능하다면 컴포넌트를 선택하는 편이 좋다


3.3.2 이중 비밀번호

- 일반적으로 많은 응용 프로그램 서버들이 공용으로 데이터베이스 서버를 사용하기 때문에

   데이터베이스 서버의 계정 정보는 응용 프로그램 서버로부터 고용으로 사용되는 경우가 많다

- 이러한 구현 특성으로 인해 데이터베이스 서버의 계정 정보는 쉽게 변경하기가 어렵다

- 그중에서도 데이터베이스 계정의 비밀번호는 서비스가 실행 중인 상태에서 변경이 불가능했다

- 그래서 서비스에서 데이터베이스 계정의 비밀번호는 처음 설정한 상태로 몇 년 동안 사용되는 경우가 많았다

 

이런 문제점을 위해서 MySQL 8.0 버전부터는 계정의 비밀번호로 2개의 값을 동시에 사용할 수 있는 기능 추가

- MySQL 서버의 이중 비밀번호 기능은 하나의 계정에 대해 2개의 비밀번호를 동시에 설정할 수 있다

- 프라이머리(Primary) , 세컨더리(Secondary)

- 최근에 설정된 비밀번호 -> 프라이머리

- 이전 비밀번호는 -> 세컨더리


이중 비밀 비밀번호를 사용하려면 다음과 같이 기존 비밀번호 변경 구문에 RETAIN CURRENT PASSWORD 옵션 추가

## 일반 보완을 낮추자!
SET GLOBAL validate_password.policy = 'LOW';
## 비밀번호를 "old_password" 로 설정
ALTER USER 'root'@'localhost' IDENTIFIED BY 'old_password';
## 비밀번호를 "new_password"로 변경하면서 기본 비밀번호를 세컨더리 비밀번호로 설정
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password' RETAIN CURRENT PASSWORD;

- 첫 번째 ALTER USER 명령이 실행되면 root 계정

  프라이머리 비밀번호 -> 'old_password'

- 두 번째 ALTER USER 명령이 실행되면 root 계정 

  프라이머리 비밀번호 -> 'new_password' , 세컨더리 -> 'old_password'

- 두 비밀번호 중 아무거나 입력해도 로그인이 된다

- 이렇게 설정된 상태에서 데이터베이스에 연결하는 응용 프로그램의 소스코드나 설정 파일의

   새로운 비밀번호인 'new_password'로 변경하고 배포 및 재시작을 순차적으로 실행한다


MySQL 서버에 접속하는 모든 응용 프로그램의 재시작이 완료되면 세컨더리 비밀번호는 삭제한다

## 세컨더리 비밀번호 삭제
ALTER USER 'root'@'localhost' DISCARD OLD PASSWORD;

- 세컨더리 비밀번호가 삭제되면 이제는 기존 비밀번호로는 로그인 불가능

- 새로운 비밀번호에만 로그인할 수 있다

728x90

'Books > RealMySQL 8.0' 카테고리의 다른 글

4.1 MySQL 엔진 아키텍처(1)  (0) 2021.10.09
3.5 역할(Role)  (0) 2021.10.04
3.4 권한  (0) 2021.10.04
3.2 사용자 계정관리  (0) 2021.10.02