MySQL의 사용자 계정을 어떻게 식별하고, 계정을 어떻게 생성하며, 보안을 강화하는 다양한 비밀번호 정책을 어떻게 설정하는지 상세히 설명합니다.
사용자 식별
- MySQL에서 사용자 계정은 사용자의 접속 지점(클라이언트가 실행된 호스트명, 도메인, 또는 IP 주소)을 기반으로 식별합니다.
- 계정명과 IP 주소는 역따옴표(`)로 감싸져 MySQL에서 식별자로 사용됩니다.
- 예를 들어, 모든 외부 컴퓨터에서 접속 가능한 사용자 계정을 생성하려면 호스트 부분을 ‘%’ 문자로 지정합니다. 이는 모든 IP 또는 호스트명을 의미합니다.
SQL
'svc_id'@'192.168.0.10' (pw: 123)
'svc_id'@'%' (pw:abc)
- MySQL에서는 권한이나 계정 정보를 가장 제한적인 범위부터 적용합니다. 위와 같이 2개의 권한을 주었을 때
svc_id@192.168.0.10
으로 접속하면 비밀번호123
을 사용하여 접속해야 합니다.
사용자 계정 관리
MySQL 8.0 이상에서는 계정을 시스템 계정(System Account)과 일반 계정(Regular Account)으로 구분합니다. 시스템 계정은 데이터베이스 서버의 관리자를 위한 계정이며, 일반 계정은 응용 프로그램이나 개발자를 위한 계정입니다.
내장된 주요 계정은 다음과 같습니다:
'mysql.sys'@'localhost'
: MySQL 8.0 이상에서 sys 스키마의 객체들을 관리하는 데 사용됩니다.'mysql.session'@'localhost'
: MySQL 플러그인이 서버에 접근할 때 사용됩니다.'mysql.infoschema'@'localhost'
:INFORMATION_SCHEMA
에 정의된 뷰의 DEFINER로 사용됩니다.
계정 생성 예시
SQL
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: 인증방식(인증 플러그인의 이름)을 명시
- REQUIRE : MYSQL 서버에 접속할 때 암호화 된 SSL/TLS 채널 사용 여부 설정
- 설정하지 않으면 비암호화 채널로 연결한다. 하지만 Caching SHA-2 Authenticate 인증 방식을 사용하면 암호화 된 채널만으로 MYSQL 서버를 접속 할 수 있게 됩니다.
- PASSWORD EXPIRE : 비밀번호 유효기간 설정하는 옵션
- default 값은password_liftime 시스템 변수에 저장된 값입니다.
- PASSWORD HISTORY : password_history 시스템 변수에 저장된 개수만큼 pw 이력을 저장
- PASSWORD REUSE INTERVAL : 재사용 할 수 있는 기간
- ACCOUNT LOCK : 계정 정보를 변경할 때 계정을 사용하지 못하게 잠글지 여부
비밀번호 관리
고수준의 비밀번호
MYSQL 서버에서 비밀번호의 유효성 체크 규칙을 적용하기 위해 validate_password 컴포넌트를 이용합니다. 컴포넌트는 아래의 명령어로 다운 받을 수 있습니다.INSTALL COMPONENT 'file://component_validate_password';
SHOW GLOBAL VARIABLES LIKE 'validate_password%';
명령어를 통해 validate_password 컴포넌트에서 제공하는 시스템 변수를 확인할 수 있습니다.
- validate_password.changed_characters_percentage
비밀번호 변경 시 이전 비밀번호와 달라야 하는 문자의 비율 설정 - validate_password.check_user_name
사용자 이름이 비밀번호에 포함되지 않도록 합니다. 즉, 사용자 이름을 포함하는 비밀번호는 유효하지 않습니다. - validate_password.dictionary_file
이 변수는 금지된 단어나 일반적인 단어들이 포함된 사전 파일의 경로를 지정합니다. - validate_password.length
비밀번호의 최소 길이를 나타냅니다. - validate_password.mixed_case_count
비밀번호에 포함되어야 하는 최소 대소문자 수를 정합니다. - validate_password.number_count
비밀번호에 포함되어야 하는 최소 숫자의 수를 정합니다. - validate_password.policy 비밀번호 정책의 강도를 나타냅니다. ‘MEDIUM’은 중간 수준의 보안 정책을 의미하며, 특정 기준을 충족해야만 비밀번호가 유효하다는 것을 나타냅니다.
- LOW : 비밀번호의 길이만 검증
- MEDIUM: 비밀번호의 길이, 숫자와 대소문자, 특수문자의 배합 검증
- STRONG: MEDIUM + 금칙어 포함 검
- validate_password.special_char_count
비밀번호에 포함되어야 하는 특수 문자의 최소 수를 정합니다. 이 설정은 최소 1개의 특수 문자가 포함되어야 함을 의미합니다.
이중 비밀번호
계정의 비밀번호로 두 개의 값을 동시에 사용할 수 있는 기능으로, 최근 설정된 비밀번호를 Primary로, 이전 비밀번호를 Secondary로 구분합니다. 다음과 같이 설정할 수 있습니다.
SQL
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password' RETAIN CURRENT PASSWORD;
계정은 Primary 또는 Secondary 비밀번호로 접근할 수 있습니다.