사용자 및 식별
MySQL의 사용자는 다른 DBMS와는 조금 다르게 사용자의 계정 뿐만 아니라 사용자의 접속 지점 도 계정의 일부가 된다. 아이디와 아이피는 역따옴표(`)나 홑따옴표(')로 감싸서 표현된다
'jordy'@
123.123.123.123``
뒤에 아이피(도메인) 자리에는 %
특수문자가 들어올 수도 있는데 이는 접속 지점에 대해서 별도로 구분하지 않는다는 표시이다.
접속하는 아이디와 아이피 그리고 도메인에 따라 비밀번호는 다를 수 있으며 동일한 아이디가 있을 때 접속 지점이 좁을 수록 우선순위가 높다.
`jordy`@`123.123.123.123` --password: 1234
`jordy`@`%` --password: 456
=> 아이피가 123.123.123.123 컴퓨터에서 접속할 때 비밀번호는 1234이고, 그 외에는 456이다.
사용자 계정 관리
시스템 계정와 일반 계정
MySQL 8.0 부터 시스템 유저 권한의 유무에 따라 DBA를 위한 시스템 계정과 일반 계정으로 구분된다. 시스템 계정은 일반 계정과 달리 아래와 같은 권한을 가진다.
- 계정 관리(계정 생성과 삭제, 그리고 권한 부여 및 제거)
- 다른 세션 또는 그 세션에서 실행 중인 쿼리를 강제 종료
- 스토어드 프로그램 생성시 DEFINER를 타 사용자로 지정
MySQL 내장 계정
mysql.sys`@`localhost
MySQL 8.0부터 기본으로 내장된 sys 스키마의 객체들의 디파이너로 사용되는 계정
mysql.session`@`localhost
MySQL 플러그인이 서버로 접근할 때 사용되는 계쩡
mysql.infoschema`@`localhost
information_schema에 정의된 뷰의 DEFINER로 사용되는 계정
위 계정들은 잠겨있어서 기본적으로 접근이 불가능하며 절대 삭제해서는 안된다.
계정 생성
계정을 생성할 때는 아래와 같은 옵션을 설정할 수 있다.
- 계정의 인증 방식과 비밀번호
- 비밀번호 관련 옵션(유효기간, 이력 개수, 재사용 불가 기간)
- 기본 역할
- SSL 옵션
- 계정 잠금 여부
IDENTIFIED WITH
사용자의 인증방식과 비밀번호를 설정한다. 커뮤니티의 경우 두 가지 방식이 있다.
- Native Pluggable Authentication: MySQL 5.7 까지 기본으로 사용되었던 방식으로 비밀번호 해싱 (SHA-1) 값을 디비에 저장 해놓고 클라이언트가 보낸 값과 해시 값이 일치하는지 비교하는 방식이다.
- Caching SHA-2 Pluggable Authentication: MySQL 5.6에 도입되고 MySQL 8.0에 조금더 보완된 인증 방식으로 암호화 해시값 생성을 위해 SHA-2(256비트) 알고리즘을 사용한다. 위 방식과는 알고리즘에 있어 차이가 있다. 위 방식의 경우 동일한 인풋에 대해 동일한 아웃풋이 나오지만 이 방식의 경우 해싱에 솔트 키를 활용하므로 동일한 인풋에 대해 다른 결과가 나온다. 이 과정에서 성능적으로 보완하기 위해 캐싱을 사용하므로 암호화 방식에 캐싱이란 키워드가 포함되어있다. 이 방식을 사용하기 위해서는 SSL/TLS 옵션을 활성화 해야한다.
REQUIRE
SSL/TLS 채널 사용 여부 설정
PASSWORD EXPIRE
비밀번호 유효기간 설정.
PASSWORD HISTORY
비밀번호 설정 이력의 관리 여부 및 갯수 설정
PASSWORD REUSE INTERVAL
비밀번호의 재사용 금지 기간 설정
PASSWORD REQUIRE
비밀번호 변경시 기존 비밀번호 입력 여부 결정 설정
ACCOUNT LOCK/UNLOCK
계정의 잠금/비잠금 여부 설정
비밀번호 관리
고수준 비밀번호
비밀번호의 복잡도에 대한 레벨을 글로벌 설정 변수로 설정한다. 관련된 컴포넌트의 설치가 필요하다.
- LOW: 길이만 검증
- MEDIUM: 길이와 숫자, 대소문자, 특수문자 배합 검증
- STRONG: 길이와 숫자, 대소문자, 특수문자 배합, 금칙어 포함 여부 검증이 결정된다.
금칙어의 경우 고수가 만든걸 가져다 쓰자.
이중 비밀번호
이미 특정 계정으로 서비스 중일 경우 비밀번호의 변경이 제한 될 수 있다. 이때 비밀번호를 이중으로 함으로써 기존 서비스에 영향을 주지 않고 비밀번호를 변경하는 것이 가능하다.
권한
권한은 글로벌 권한과 객체 권한으로 구분된다. 글로벌 권한은 데이터베이스나 테이블 외에 적용되는 권한을 말하며, 객체 권한은 데이터베이스나 테이블을 제어하는데 필요한 권한을 말한다.
객체 권한은 특정 객체를 명확히 명시해야 하지만 글로벌 권한은 특정 객체를 명시하지 말아야 한다.
ALL 키워드의 경우 객체 권한에서는 특정 객체에 대한 모드 권한을 의미하며, 글로벌 권한 에서는 글로벌 수준에서 가능한 모든 권한을 의미한다.
MySQL 8.0 부터는 기존에 있던 권한을 정적 권한으로 구분하고, 컴포넌트가 플러그인이 설치되면 그때 부여되는 권한들을 동적 권한으로 구분했다.
MySQL 5.7 때는 SUPER라는 권한이 데이터베이스 권한에 꼭 필요했으나 MySQL 8.0 부터는 SUPER 권한이 잘게 부서졌다.
컬럼 단위에 대해서도 권한 부여가 가능한데, 이는 권한 검증으로 인해 성능에 영향을 주므로 컬럼 단위 권한 관리는 안티 패턴이다.
권한 부여 현황은 mysql 데이터베이스 내 관련 테이블을 확인하면 된다.
역할
권한을 묶어서 역할이란 이름으로 포장할 수 있다. 동일한 권한을 가지는 아이디가 여러 개 있을 때 각각 권한을 일일히 부여해주는게 아니라 역할을 만들고 거기에 권한을 부여한 후 해당 권한을 아이디 들에게 부여해주면 된다.
역할과 사용자의 차이는 계정의 잠금 여부이며 역할이 기본적으로 계정이 잠겨 있는 반면, 사용자는 잠겨 있지 않다. 기본 잠금도 activate_all_roles_on_login
이란 시스템 변수를 변경하며 역할의 초기화시 로그인이 가능하도록 설정할 수 있다.
'Book' 카테고리의 다른 글
대규모 서비스를 지탱하는 기술 - 규모 조정의 요소 (0) | 2022.07.29 |
---|---|
대규모 서비스를 지탱하는 기술 - (하드웨어 관점에서의) 메모리와 디스크 (0) | 2022.07.27 |
[Effective Java] Item 7. 다 쓴 객체 참조를 해제하라 (0) | 2021.10.06 |
[Effective Java] Item 6. 불필요한 객체 생성을 피하라 (0) | 2021.10.06 |
[Effective Java] Item 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 (0) | 2021.10.06 |