Database

MySQL(2)

MIRACLE LIFE 2023. 9. 17. 19:06

- 사용자 식별

MySQL의 사용자는 다른 DBMS와는 조금 다르게 사용자의 계정뿐 아니라 사용자의 접속 지점도 계정의 일부가 된다.

'svc_id'@'127.0.0.1'

한 가지 주의해야 할 점은 서로 동일한 아이디가 있을 때 MySQL 서버가 해당 사용자의 인증을 위해 어떤 계정을 선택하느냐다.

1. 'svc_id'@'192.168.0.10'

2. 'svc_id'@'%'

IP 주소가 192.168.0.10인 PC에서 이 MySQL 서버에 접속할 때 어떤 계정을 이용하여 인증을 실행할까?

권한이나 계정 정보에 대해 MySQL은 범위가 가장 작은 것을 항상 먼저 선택한다.

 

- 사용자 계정 관리

1. 시스템 계정과 일반 계정

시스템 계정은 데이터베이스 서버 관리자를 위한 계정이며, 일반 계정은 응용 프로그램이나 개발자를 위한 계정 정도로 생각하면 된다.

2. 계정 생성

계정을 생성할 때는 다양한 옵션을 설정할 수 있다.

예시)

CREATE USER 'user'@'%'
	IDENTIFIED WITH 'mysql_native_password' BY 'password;
    REQUIRE NONE
    PASSWORD EXPIRE INTERVAL 30 DAY
    ACCOUNT UNLOCK
    PASSWORD HISTORY DEFAULT
    PASSWORD RESUE INTERVAL DEFAULT
    PASSWORD REQUIRE CURRENT DEFAULT;

 

- 비밀번호 관리

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

  • LOW: 비밀번호의 길이만 검증
  • MEDIUM: 비밀번호의 길이를 검증하며, 숫자와 대소문자, 그리고 특수문자의 배합을 검증
  • STRONG: MEDIUM 레벨의 검증을 모두 수행하며, 금칙어가 포함됐는지 여부까지 검증

2. 이중 비밀번호

데이터베이스 계정의 비밀번호는 보안을 위해 주기적으로 변경해야 하지만 지금까지는 서비스를 모두 멈추지 않고서는 비밀번호를 변경하는 것은 불가능한 일이었다.

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

 

- 권한

사용자에게 권한을 부여할 때는 GRANT 명령을 사용한다. GRANT 명령은 다음과 같은 문법으로 작성하는데, 각 권한의 특성(범위)에 따라 GRANT 명령의 ON 절에 명시되는 오브젝트(DB나 테이블)의 내용이 바뀌어야 한다.

> GRANT privilege_list ON db.table TO 'user'@'host';

권한의 범위로는 글로벌 권한, DB 권한, 테이블 권한 등이 있다.

여러 가지 레벨이나 범위로 권한을 설정하는 것이 가능하지만 테이블이나 칼럼 단위의 권한은 잘 사용하지 않는다. 칼럼 단위의 권한이 하나라도 설정되면 나머지 모든 테이블의 모든 칼럼에 대해서도 권한 체크를 하기 때문에 칼럼 하나에 대해서만 권한을 설정하더라도 전체적인 성능에 영향을 미칠 수 있다. 칼럼 단위의 접근 권한이 꼭 필요하다면 GRANT 명령으로 해결하기보다는 테이블에서 권한을 허용하고자 하는 칼럼만으로 별도의 뷰(VIEW)를 만들어 사용하는 방법도 생각해볼 수 있다. 뷰도 하나의 테이블로 인식되기 때문에 뷰를 만들어 두면 뷰의 칼럼에 대해 권한을 체크하지 않고 뷰 자체에 대한 권한만 체크하게 된다.

 

- 역할

계정에 역할을 부여하고 그 역할을 사용할 수 있게 하려면 SET ROLE 명령을 실행해 해당 역할을 활성화해야 한다. 일단 역할이 활성화되면 그 역할이 가진 권한은 사용할 수 있는 상태가 되지만 계정이 로그아웃됐다가 다시 로그인하면 역할이 활성화되지 않은 상태로 초기화돼 버린다.

시스템 변수 activate_all_roles_on_login을 ON으로 설정하면 매번 SET ROLE 명령으로 역할을 활성화하지 않아도 로그인과 동시에 부여된 역할이 자동으로 활성화된다.

 

mysql DB의 user 테이블을 살펴보면 역할과 계정의 차이는 account_locked 칼럼의 값이 다를 뿐 아무런 차이가 없다. 그렇다면 MySQL 서버는 계정과 권한을 어떻게 구분할까, 라는 의문이 생길수 있는데, 하나의 계정에 다른 계정의 권한을 병합하기만 하면 되므로 MySQL 서버는 역할과 계정을 구분할 필요가 없는 것이다.

 

참조: 책 Real MySQL 8.0

'Database' 카테고리의 다른 글

MySQL(4)  (0) 2023.09.20
MySQL(3)  (0) 2023.09.19
MySQL(1)  (0) 2023.09.17
Redis(2)  (0) 2023.06.11
Redis(1)  (0) 2023.06.07