사용자 계정 관리

공부하는 감자·2024년 4월 13일
0

MySQL

목록 보기
50/74
post-thumbnail

시스템 계정과 일반 계정

💡 계정과 사용자

일반적으로 데이터베이스에서는 계정과 사용자라는 말을 혼용하는데, 이번 장에서는 설명과 편의를 위해 두 단어를 다음과 같이 구분해서 사용했다.

  • 사용자: MySQL 서버를 사용하는 주체 (사람 또는 응용프로그램)
  • 계정: MySQL 서버에 로그인하기 위한 식별자 (로그인 아이디)
  • MySQL 8.0부터 계정은 SYSTEM_USER 계정을 가지고 있느냐에 따라 구분된다.
    • 시스템 계정 (System Account)
    • 일반 계정 (Regular Account)
  • 여기서 소개하는 시스템 계정은 MySQL 서버 내부적으로 실행되는 백그라운드 스레드와는 무관하며, 시스템 계정도 일반 계정과 같이 사용자를 위한 계정이다.
    • 시스템 계정은 데이터베이스 서버 관리자를 위한 계정
    • 일반 계정은 응용 프로그램이나 개발자를 위한 계정
  • 시스템 계정과 일반 계정의 개념이 도입된 것은 DBA(데이터베이스 관리자) 계정에는 SYSTEM_USER 권한을 할당하고 일반 사용자를 위한 계정에는 SYSTEM_USER 권한을 부여하지 않게 하기 위해서다.

계정과 관리

  • 시스템 계정은 시스템 계정과 일반 계정을 관리(생성 삭제 및 변경)할 수 있다.
  • 일반 계정은 시스템 계정을 관리할 수 없다.
  • 시스템 계정으로만 다음과 같이 데이터베이스 서버 관리와 관련된 중요 작업을 수행할 수 있다.
    • 계정 관리 (계정 생성 및 삭제, 그리고 계정의 권한 부여 및 제거)
    • 다른 세션(Connection) 또는 그 세션에서 실행 중인 쿼리를 강제 종료
    • 스토어드 프로그램 생성 시 DEFINER를 타 사용자로 설정

MySQL 서버에 내장된 계정

  • MySQL 서버에는 다음과 같이 내장된 계정들이 있다.
    1. ‘mysql.sys’@’localhost’
    2. ‘mysql.session’@’localhost’
    3. ‘mysql.infoschema’@’localhost’
    • ‘root’@’localhost’를 제외한 3개의 계정은 내부적으로 각기 다른 목적으로 사용되므로 삭제하지 않도록 주의하자.
  • 위의 3개의 계정은 처음부터 잠겨(account_locked 칼럼) 있는 상태이다.
    • 의도적으로 잠긴 계정을 풀지 않는 한 악의적인 용도로 사용할 수 없으므로 보안을 걱정하지는 않아도 된다.

‘mysql.sys’@’localhost’

  • MySQL 8.0부터 기본으로 내장된 sys 스키마의 객체(뷰나 함수, 그리고 프로시저)들의 DEFINER로 사용되는 계정

‘mysql.session’@’localhost’

  • MySQL 플러그인이 서버로 접근할 때 사용되는 계정

‘mysql.infoschema’@’localhost’

  • information_schema에 정의된 뷰의 DEFINER로 사용되는 계정

계정 생성

  • MySQL 5.7 버전까지는 GRANT 명령으로 권한의 부여와 동시에 계정 생성이 가능했다.
  • MySQL 8.0 버전부터는 계정의 생성과 권한 부여를 두 개의 명령으로 구분해서 실행하도록 바뀌었다.
    • 계정의 생성은 CREATE USER 명령
    • 권한 부여는 GRANT 명령
  • 계정을 생성할 때는 다음과 같은 다양한 옵션을 설정할 수 있다.
    • 계정의 인증 방식과 비밀번호
    • 비밀번호 관련 옵션 (비밀번호 유효 기간, 비밀번호 이력 개수, 비밀번호 재사용 불가 시간)
    • 기본 역할 (Role)
    • SSL 옵션
    • 계정 잠금 여부
  • 일반적으로 많이 사용되는 옵션을 가진 CREATE USER 명령은 다음과 같다.
    CREATE 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;
  • CREATE USER 또는 ALTER USER 명령을 이용해 MySQL 서버의 계정을 생성 또는 변경할 때 연결 방식과 비밀번호 옵션, 자원 사용과 관련된 여러 옵션을 설정할 수 있다.

IDENTIFIED WITH 옵션

  • 사용자의 인증 방식과 비밀번호를 설정한다.
  • IDENTIFIED WITH 뒤에는 반드시 인증 방식(인증 플러그인의 이름)을 명시해야 한다.
    • MySQL 서버의 기본 인증 방식을 사용하고자 한다면 IDENTIFIED BY 'password' 형식으로 명시해야 한다.
  • MySQL 서버에서는 다양한 인증 방식을 플러그인 형태로 제공하며, 다음 4가지 방식이 가장 대표적이다.
    • Native Pluggable Authentication
    • Caching SHA-2 Pluggable Authentication
    • PAM Pluggable Authentication
    • LDAP Pluggable Authentication
  • MySQL 5.7 버전까지는 Native Authentication이 기본 방식으로 사용됐지만, MySQL 8.0 버전부터는 Caching SHA-2 Authentication이 기본 방식으로 바뀌었다.
  • Caching SHA-2 Authentication은 SSL/TLS 또는 RSA 키페어를 필요로 하기 때문에 기존 MySQL 5.7까지의 연결 방식과는 다른 방식으로 접속해야 한다.
    • 그래서 보안 수준은 좀 낮아지겠지만 기존 버전과의 호환성을 고려한다면 Native Authentication 인증 방식으로 계정을 생성해야 할 수도 있다.
  • MySQL 8.0 에서도 Native Authentication을 기본 인증 방식으로 설정하려면,
    • MySQL 설정을 변경하거나

    • my.cnf 설정 파일에 추가해야 된다.

      -- Native Authentication을 기본 인증 방식으로 설정
      SET GLOBAL default_authentication_plugin='mysql_native_password"

Native Pluggable Authentication

  • MySQL 5.7 버전까지 기본으로 사용되던 방식이다.
  • 단순히 비밀번호에 대한 해시(SHA-1 알고리즘)값을 저장해두고, 클라이언트가 보낸 값과 해시값이 일치하는지 비교하는 인증 방식이다.
  • Native Authentication 플러그인은 입력이 동일 해시값을 출력한다.

Caching SHA-2 Pluggable Authentication

  • MySQL 5.6 버전에 도입되고 MySQL 8.0 버전에서는 ㅈ금 더 보완된 인증 방식이다.
  • 암호화 해시값 생성을 위해 SHA-2(256비트) 알고리즘을 사용한다.
  • Native Authentication과의 가장 큰 차이는 사용되는 암호화 해시 알고리즘의 차이이다.
    • SHA-2 Authentication은 저장된 해시값의 보안에 더 중점을 둔 알고리즘으로 이해할 수 있다.
  • Caching SHA-2 Authentication은 내부적으로 Salt 키를 활용하며, 수천 번의 해시 계산을 수행해서 결과를 만들어 내기 때문에 동일한 키 값에 대해서도 결과가 달라진다.
    • 이처럼 해시값을 계산하는 방식은 상당히 시간 소모적이어서 성능이 많이 떨어지는데, 이를 보완하기 위해 MySQL 서버는 해시 결과값을 메모리에 캐시해서 사용하게 된다.
    • 그래서 인증 방식의 이름에 ‘Caching’이 포함된 것이다.
  • 이 인증 방식으로 사용하려면 SSL/TLS 또는 RSA 키페어를 반드시 사용해야 한다.
    • 이를 위해 클라이언트에서 접속할 때 SSL 옵션을 활성화해야 한다.

💡 SCRAM 인증 방식

MySQL의 Caching SHA-2 Pluggable Authentication은 SCRAM(Salted Chanllenge Response Authentication Mechanisma) 인증 방식을 사용한다.

SCRAM 인증 방식은 평문 비밀번호를 입력해서 5000번 이상 암호화 해시 함수를 실행해야 MySQL 서버로 로그인 요청을 보낼 수 있다.

이러한 인증 방식은 무작위로 비밀번호를 입력하는 무차별 대입 공격(Brute-force attack)을 어렵게 만들지만, 악의가 없는 정상적인 유저나 응용 프로그램의 연결도 느리게 만든다.

자세한 내용은 서적과 위키피디아를 참고할 것.

PAM Pluggable Authentication

  • 유닉스나 리눅스 패스워드 또는 LDAP 같은 외부 인증을 사용할 수 있게 해주는 인증 방식이다.
    • LDAP : Lightweight Directory Access Protocal
  • MySQL 엔터프라이즈 에디션에서만 사용 가능하다.

LDAP Pluggable Authentication

  • LDAP을 이용한 외부 인증을 사용할 수 있게 해주는 인증 방식이다.
  • MySQL 엔터프라이즈 에디션에서만 사용 가능하다.

REQUIRE 옵션

  • MySQL 서버에 접속할 때 암호화된 SSL/TLS 채널을 사용할지 여부를 설정한다.
  • 별도로 설정하지 않으면 비암호화 채널로 연결하게 된다.
  • REQUIRE 옵션을 SSL로 설정하지 않았다고 하더라도 Caching SHA-2 Authentication 인증 방식을 사용하면 암호화된 채널만으로 MySQL 서버에 접속할 수 있게 된다.

PASSWORD EXPIRE 옵션

  • 비밀번호의 유효 기간을 설정하는 옵션이다.
  • 별도로 명시하지 않으면 default_password_lifetime 시스템 변수에 저장된 기간으로 유효 기간이 설정된다.
  • 개발자나 데이터베이스 관리자의 비밀번호는 유효기간을 설정하는 것이 보안상 안전하지만 응용 프로그램 접속용 계정에 유효 기간을 설정하는 것은 위험할 수 있다.
  • PASSWORD EXPIRE 옵션에 설정 가능한 옵션은 다음과 같다.
    • PASSWORD EXPIRE
      • 계정 생성과 동시에 비밀번호의 만료 처리
    • PASSWORD EXPIRE NEVER
      • 계정 비밀번호의 만료 기간 없음
    • PASSWORD EXPIRE DEFAULT
      • default_password_lifetime 시스템 변수에 저장된 기간으로 비밀번호의 유효 기간을 설정
    • PASSWORD EXPIRE OMTERVAL n DAY
      • 비밀번호의 유효 기간을 오늘부터 n일자로 설정

PASSWORD HISTORY 옵션

  • 한 번 사용했던 비밀번호를 재사용하지 못하게 설정하는 옵션이다.
  • MySQL 서버는 이전에 사용했던 비밀번호를 기억하기 위해 myslq DB의 password_history 테이블을 사용한다.
    SELECT * FROM mysql.password_history;
  • PASSWORD HISTORY 옵션에 설정 가능한 옵션은 다음과 같다.
    • PASSWORD HISTORY DEFAULT
      • password_history 시스템 변수에 저장된 개수만큼 비밀번호의 이력을 저장한다.
      • 저장된 이력에 남아있는 비밀번호는 재사용할 수 없다.
    • PASSWORD HISTORY n
      • 비밀번호의 이력을 최근 n개까지만 저장한다.
      • 저장된 이력에 남아있는 비밀번호는 재사용할 수 없다.

PASSWORD REUSE INTERVAL 옵션

  • 한 번 사용했던 비밀번호의 재사용 금지 기간을 설정하는 옵션이다.
  • 별도로 명시하지 않으면 password_reuse_interval 시스템 변수에 저장된 기간으로 설정된다.
  • PASSWORD REUSE INTERVAL 절에 설정 가능한 옵션은 다음과 같다.
    • PASSWORD REUSE INTERVAL DEFAULT
      • password_reuse_interval 시스템 변수에 저장된 기간으로 설정
    • PASSWORD REUSE INTERVAL n DAY
      • n일자 이후에 비밀번호를 재사용할 수 있게 설정

PASSWORD REQUIRE 옵션

  • 비밀번호가 만료되어 새로운 비밀번호로 변경할 때 현재 비밀번호(변경하기 전 만료된 비밀번호)를 필요로 할지 말지를 결정하는 옵션이다.
  • 별도로 명시하지 않으면 password_require_current 시스템 변수의 값으로 설정된다.
  • PASSWORD REQUIRE 절에 사용 가능한 옵션은 다음과 같다.
    • PASSWORD REQUIRE CURRENT
      • 비밀번호를 변경할 때 현재 비밀번호를 먼저 입력하도록 설정
    • PASSWORD REQUIRE OPTIONAL
      • 비밀번호를 변경할 때 현재 비밀번호를 입력하지 않아도 되도록 설정
    • PASSWORD REQUIRE DEFAULT
      • password_require_current 시스템 변수의 값으로 설정

ACCOUNT LOCK / UNLOCK 옵션

  • 계정 생성 시 또는 ALTER USER 명령을 사용해 계정 정보를 변경할 때 계정을 사용하지 못하게 잠글지 여부를 결정한다.
  • 옵션은 다음과 같다.
    • ACCOUNT LOCK
      • 계정을 사용하지 못하게 잠금
    • ACCOUNT UNLOCK
      • 잠긴 계정을 다시 사용 가능 상태로 잠금 해제

Reference

참고 서적

📔 Real MySQL 8.0

profile
책을 읽거나 강의를 들으며 공부한 내용을 정리합니다. 가끔 개발하는데 있었던 이슈도 올립니다.

0개의 댓글