mysql 에서는 다른 DBMS 와는 조금 다른 방식으로 사용자 계정, 권한 등을 다루고 있으며 8.0 버전부터는 권한을 묶어서 Role 로 관리하고 있다. 자세히 알아보자.
mysql 은 다른 DBMS 와 달리 사용자의 계정뿐 아니라 사용자의 접속 지점(도메인, IP주소, 호스트명)도 계정의 일부가 된다.
`svc_id`@`192.168.0.10`와 같이 사용자 계정을 표시한다. 모든 클라이언트에서 접속가능하도록 하고 싶다면 IP 부분을 `%` 로 바꾸면 된다.
동일한 사용자 이름을 갖고 IP 범위가 다른 여러 사용자 계정이 있을 경우 두 개 이상의 사용자 계정에 해당한다면 IP 범위가 작은 계정을 사용한다.
시스템 계정과 일반 계정
계정은 SYSTEM_USER 권한을 갖고 있느냐에 따라 시스템 계정과 일반 계정으로 나뉜다.
시스템 계정은 데이터베이스 서버 관리자를 위한 계정이며, 일반 계정은 애플리케이션이나 개발자를 위한 계정으로 사용된다.
계정 관리, 쿼리 강제 종료 등의 기능은 시스템 계정에서만 수행할 수 있다.
계정 생성
CREATE USER 명령으로 계정을 생성할 수 있고, GRANT 명령으로 권한을 부여할 수 있다.
계정 생성 시 다음과 같은 다양한 옵션을 설정할 수 있다.
IDENTIFIED WITH: 비밀번호 설정 및 어떤 방법으로 사용자 인증을 할 것인지 설정
REQUIRE: 서버 접속 방식 (비암호화 채널/SSL/TLS 등이 있다.)
PASSWORD EXPIRE: 사용자 비밀번호의 유효 기간 설정
PASSWORD HISTORY: 사용했던 비밀번호를 재사용하지 못하도록 하는 설정. 설정한 개수만큼 접속한 비밀번호를 password_history 테이블에 저장해두었다가 해당 리스트의 비밀번호를 재사용하려 할 때 접근을 못하게 막는다.
PASSWORD REUSE INTERVAL: 비밀번호의 재사용 금지 기간 설정.
PASSWORD REQUIRE: 비밀번호 변경 시 현재 비밀번호를 필요로 할지 말지 설정
ACCOUNT LOCK / UNLCOK: 해당 계정을 LOCK / UNLOCK 하여 사용하지 못하게 하거나 사용 가능하게 변경하는 설정
고수준 비밀번호
MYSQL 서버는 비밀번호의 재사용을 금지하거나, 유효기간을 설정하는 등의 보안 처리도 할 수 있지만 비밀번호를 어렵게 설정하도록 강제할 수도 있다.
MYSQL 서버에서 제공하는 validate_password 컴포넌트를 설치하여 간단한 길이 제한, 특수문자 포함 등을 강제할 수 있으며 금칙어를 별도로 설정할 수도 있다.
이중 비밀번호
기존에는 애플리케이션이 동작중인 데이터베이스에서 계정 비밀번호를 변경하려면 애플리케이션을 내리고 수정해준 뒤 다시 동작시켜야만 했다.
MYSQL 8.0 버전부터는 비밀번호로 2개의 값을 동시에 설정하여 두 개중 하나만 맞으면 접근이 가능하도록 하여 애플리케이션 실행중에도 데이터베이스 계정 비밀번호를 변경하여 보안을 강화할 수 있다.
GRANT 명령어를 통해 사용자 계정에게 권한을 부여할 수 있다.
권한에는 다양한 종류가 있으며 큰 분류는 다음과 같다.
글로벌 권한 (정적 권한)
서버 관리에 필요한 권한.
객체 권한 (정적 권한)
특정 객체에 필요한 권한. 특정 데이터베이스, 특정 테이블, 뷰 등에 별도의 권한을 부여할 수 있다.
동적 권한
MYSQL 서버가 시작되면서 동적으로 생성되는 권한. 컴포넌트나 플러그인에 의한 권한 등이 있다.
권한을 직접 유저에게 설정하는 방법 외에 역할을 만들어 권한을 할당하고, 유저에게 해당 역할을 할당하는 방법으로 권한을 설정할 수도 있다.
역할은 기본적으로 권한과 동일하게 서버 내부적으로 동작하지만, lock 상태이며, 호스트가 없다는 점이 다르다.
역할은 재사용하기 쉽고 보안을 강화하는 측면에서 자주 사용된다.