MySQL

사용자 계정

iksadnorth 2023. 7. 31. 17:04

해당 게시물은 'Real MySQL 8.0'라는 책을 참고해서 작성했습니다.

👣 계정 등록

MySQL은 계정을 등록하더라도 사용자가 등록 당시 사용한 IP가 아니라면 접근 거부를 한다.

예를 들어, someaccount라는 계정명으로 localhost IP로 등록을 했다고 가정해보면,

CREATE USER 'someaccount'@'localhost' IDENTIFIED BY '비밀번호';​

해당 계정은 someaccount가 192.72.41.232라는 IP로 접근해도 접근할 수 없다.

다만, '%'를 사용해서 User를 생성하면 모든 IP에서 접근 가능하다.
%는 모든 IP를 뜻하기 때문이다. 이 방법은 보안상 위험하기 때문에 자제해야 한다.
CREATE USER 'someaccount'@'%' IDENTIFIED BY '비밀번호';​

👣 계정 조회

MySQL에 등록된 계정을 확인하는 방법은 다음과 같다.

SELECT user, host FROM mysql.user;

👣 시스템 계정, 일반 계정

시스템 계정(System Account)는 DB 서버 관리자를 위한 계정이고
일반 계정(Regular Accunt)는 응용 프로그램이나 개발자를 위한 계정이다.

👣 MySQL 내장 계정

계정명 설명
mysql.sys 내장된 sys 스키마의 객체(뷰, 함수, 프로시저 등)들의 DEFINER로 사용하는 계정.
mysql.session 플러그인이 서버로 접근할 때, 사용하는 계정.
mysql.infoschema information_schema에 정의된 뷰의 DEFINER로 사용되는 계정.

처음부터 Locked 상태이므로 보안을 걱정하지 않아도 된다.

👣 MySQL 계정 생성

MySQL 5.7 버젼 까지는 GRANT 명령으로 계정 생성을 했지만,
MySQL 8.0 버젼 부터는 CREATE USER 명령으로 생성한다.

CRETE 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;

아래는 위 명령어의 옵션 설명이다.

더보기

👣 IDENTITIED WITH

 identified with {인증방식} by {비밀번호}

인증방식에는 4가지가 있다.

1. Native Pluggable Authentication
2. Caching SHA-2 Pluggable Authentication
3. PAM Pluggable Authentication
4. LDAP Pluggable Authentication

👣 REQUIRE

MySQL 서버에 접속할 때, SSL/TLS 채널을 사용할지 여부를 설정함.

👣 PASSWORD EXPIRE

비밀 번호의 유효시간을 설정하는 옵션
NEVER, DEFAULT, INTERVAL n DAY 등의 선택지가 있다.

👣 PASSWORD HISTORY

한번 사용했던 비밀번호는 재사용하지 못하게 하는 옵션.
이전에 사용했던 비밀번호는 mysql 데이터베이스의 password_history 테이블에 저장되어 있다.

👣 PASSWORD REUSE INTERVAL

한번 사용한 비밀번호의 재사용 금지 시간 설정 옵션.

👣 PASSWORD REQUIRE

비밀 번호가 만료되었을때, 새로운 비밀 번호로 변경해야 한다.
이 때, 새로운 비밀번호를 설정하기 이전에 만료된 비밀 번호를 물어보게 할지 말지에 대한 설정 옵션.

👣 ACCOUNT LOCKK / UNLOCK

 계정 생성 시 or ALTER USER 명령 시, 계정을 잠금 상태로 놓을지 말지를 결정하는 옵션.

👣 비밀번호 관리

해당 부분은 너무 전문적인 부분이라 간단하게 짚고 넘어가기로 함.

1. 고수준 비밀번호
너무 짧은 비밀번호라던지 금칙어를 설정하는 등의 기능을 이용해서 
비밀번호가 쉽게 노출되지 않게 강제하는 플러그인이 존재함.

2. 이중 비밀번호
서비스가 실행 중인 상태에서는 비밀번호를 변경하기가 어렵다.
때문에 계정 비밀번호를 2개를 동시에 사용해 2개 중 아무거나 입력해도 접속이 가능하게 만든다.
이는 각 응용 프로그램이 서서히 비밀번호로 마이그레이션할 수 있도록 도와준다.
끝내 새롭게 만든 비밀번호로 완전히 이동되었을때, 기존의 비밀번호를 파기한다.

👣 권한

권한을 부여할 수 있는 많은 옵션이 있지만, 공식 사이트에서 확인할 수 있는 것을 
여기서 나열하는 것은 무의미하다고 느껴 권한 목록이 나열된 사이트의 링크만 달기로 함.

 

MySQL :: MySQL 8.0 Reference Manual :: 6.2.2 Privileges Provided by MySQL

MySQL 8.0 Reference Manual  /  ...  /  Security  /  Access Control and Account Management  /  Privileges Provided by MySQL 6.2.2 Privileges Provided by MySQL The privileges granted to a MySQL account determine which operations the account can perf

dev.mysql.com

참고로 권한 부여는 GRANT로 이뤄지고, 권한 삭제는 REVOKE로 이뤄진다.

-- 글로벌 권한
GRANT SUPER ON *.* TO 'user'@'localhost';

-- DB 권한
GRANT EVENT ON employees.* TO 'user'@'localhost';

-- Table 권한
GRANT INSERT ON employees.department TO 'user'@'localhost';

👣 역할

각 사용자마다 줄줄이 권한을 부여하는 것은 매우 Cost가 소비되는 행동이다.
사용자는 일정한 유형을 지니고 있고 같은 유형이면 비슷한 권한을 부여받는다.

때문에 권한 부여 묶음을 만들고 사용자에게 해당 묶음을 한꺼번에 주면 위 문제가 해결된다.
이런 '권한 묶음'을 '역할'이라고 한다.

-- 역할 생성
CREATE ROLE {역할명};

-- 역할에 권한 부여
GRANT INSERT, UPDATE ON {DB 명}.{Table 명} TO {역할명};

-- 사용자에 역할 부여
GRANT {역할명} TO {계정명}@{IP 명};

위 방식으로 역할을 부여하면 지정된 권한을 부여받을 수 있긴하다.
문제는 매번 로그인할 때마다 역할이 비활성화되어 있기 때문에
활성화를 시켜야 해당 권한을 사용할 수 있다.

-- 역할 활성화
SET ROLE '{역할명}';

위와 같은 방법이 불편하다면, 설정을 바꿈으로서 해결할 수 있다.

-- 자동 역할 활성화 설정.
SET GLOBAL activate_all_roles_on_login=ON;

'MySQL' 카테고리의 다른 글

MySQL 로그 파일  (0) 2023.08.01
MyISAM 스토리지 엔진  (0) 2023.08.01
InnoDB 스토리지 엔진  (0) 2023.08.01
MySQL 아키텍처  (0) 2023.08.01
왜 MySQL을 사용하는가?  (0) 2023.07.31