[Real MySQL] 03. 사용자 및 권한

예니·2023년 2월 4일
0

Real MySQL

목록 보기
2/9
post-thumbnail

3.1 사용자 식별

MySQL의 사용자는 사용자 계정 + 접속 지점(호스트명, 도메인, IP주소 등)로 식별된다. 항상 아이디와 호스트를 함께 명시해야 한다. svc_id@127.0.0.1

모든 IP 또는 모든 호스트명을 의미하는 %를 사용할 수 있다. svc_id@%

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

3.2 사용자 계정 관리

3.2.1 시스템 계정과 일반 계정

시스템 계정은 DB서버 관리자를 위한 계정, 일반 계정은 응용 프로그램이나 개발자를 위한 계정.

3.2.2 계정 생성

계정 생성은 create user, 권한 부여는 grant 명령으로 구분해서 실행.

create user 명령에 다음과 같은 옵션을 줄 수 있음.

  • IDENTIFIED WITH 사용자의 인증 방식과 비밀번호를 설정 8.0 버전부터는 Caching SHA-2 Authentication이 기본 인증 (SSL/TLS 또는 RSA 키페어를 필요로 함)
  • REQUIRE : 암호화된 SSL/TLS 채널을 사용할지 여부
  • PASSWORD EXPIRE : 비밀번호 유효 기간 설정
  • PASSWORD HISTORY : 한 번 사용했던 비밀번호를 재사용하지 못하게 설정하는 옵션 (MySQL 서버가 mysql.password_history 테이블에 저장해둠)
  • PASSWORD REUSE INTERVAL : 한 번 사용했던 비밀번호의 재사용 금지 기간 설정
  • PASSWORD REQUIRE : 새 비밀번호로 변경할 때 현재 비밀번호를 필요로 할지 여부
  • ACCOUNT LOCK / UNLOCK : 계정 잠금 여부

3.3 비밀번호 관리

3.3.1 고수준 비밀번호

MySQL 서버에서 비밀번호 유효성 체크 규칙을 적용하려면 validate_password 컴포넌트 이용하면 됨.

3.3.2 이중 비밀번호

MySQL에서 이중 비밀번호란, 2개의 비밀번호 중 하나만 일치하면 로그인이 통과되는 것.

이중 비밀번호를 사용하려면 기존 비밀번호 변경 구문에 RETAIN CURRENT PASSWORD 옵션 추가하면 됨.

3.4 권한

  • 글로벌 권한 : 데이터베이스나 테이블 이외의 객체에 적용되는 권한. GRANT 명령에서 특정 객체를 명시하지 말아야 함
  • 객체 권한 : 데이터베이스나 테이블을 제어하는 데 필요한 권한. GRANT 명령에서 특정 객체를 명시해야함.

8.0 버전부터는 동적 권한이 추가됨. 정적 권한은 MySQL 서버 소스코드에 고정적으로 명시돼 있는 권한. 동적 권한은 MySQL 서버가 시작되면서 동적으로 생성하는 권한.

  • 사용자에게 권한을 부여할 때는 GRANT 명령을 사용함. GRANT previllege_list ON db.table TO ‘user’@’host’; GRANT {권한} ON {권한을 부여할 오브젝트} TO {권한을 부여할 대상 사용자};
  • 테이블 권한은 서버의 모든 DB에 대해 권한을 부여하는 것, 특정 DB의 오브젝트에 대해서만 권한을 부여하는 것, 특정 DB의 특정 테이블에 대해서만 권한을 부여하는 것이 가능하다. 특정 테이블의 특정 컬럼에 대해서만 권한을 부여하는 것도 가능하지만, 잘 사용하지 않는다. (컬럼 단위의 권한이 하나라도 설정되면 모든 테이블의 모든 컬럼에 대해 권한 체크를 해서 성능 저하될 수 있음 → 컬럼 단위 권한이 꼭 필요하다면 뷰를 사용하는 것이 나을수도)

3.5 역할

권한을 묶어서 역할을 사용할 수 있음.

CREATE ROLE 명령어 이용하여 역할을 생성하고, GRANT 명령으로 각 역할에 대해 권한을 부여한다.

역할을 생성하고(CREATE ROLE), 역할에 권한을 부여하고(GRANT), 계정을 생성하고(CREATE USER), 계정에 역할을 부여한다(GRANT).

계정이 역할을 사용할 수 있게 하려면 SET ROLE 명령을 실행해 해당 역할을 활성화해야 한다. 이는 재로그인할 때마다 풀릴 수 있는데, activate_all_roles_on_login 시스템 변수를 on으로 설정하면 풀리지 않는다.

SET GLOBAL activate_all_roles_on_login =ON;

역할과 계정은 mysql DB의 user 테이블에서 구분 없이 관리된다. 그럼에도 CREATE ROLE, CREATE USER 명령이 구분되어 있는 이유는, 데이터베이스 관리의 직무를 분리할 수 있게 하여 보안을 강화하는 용도로 사용하기 위해서다.

0개의 댓글