비밀번호 관리

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

MySQL

목록 보기
51/74
post-thumbnail

고수준 비밀번호

  • MySQL 서버의 비밀번호는 다음 기능을 가지고 있다.
    • 유효기간이나 이력 관리를 통한 재사용 금지 기능
    • 비밀번호를 쉽게 유추할 수 있는 단어들이 사용되지 않게 글자의 조합을 강제하거나 금칙어를 설정하는 기능

비밀번호 유효성 체크 규칙

validate_password 컴포넌트

  • MySQL 서버에서 비밀번호의 유효성 체크 규칙을 적용하려면 validate_password 컴포넌트를 이용한다.
    • 우선 validate_password 컴포넌트를 설치해야 한다.

      ## validate_password 컴포넌트 설치
      INSTALL COMPONENT 'file://component_validate_password';
      
      ## 설치된 컴포넌트 확인
      SELECT * FROM mysql.component;
  • validate_password 컴포넌트가 설치되면 컴포넌트에서 제공하는 시스템 변수를 확인할 수 있다.
    SHOW GLOBAL VARIABLES LIKE 'validate_password%';
  • MySQL 5.7 버전까지는 validate_password 가 플러그인 형태로 제공됐었다.
    • 플러그인의 단점을 보완하기 위해 MySQL 8.0부터 컴포넌트가 도입됐다.

    • 사용자 측면에서는 플러그인이나 컴포넌트 모두 거의 동일한 기능을 제공하며, 단지 제공되는 시스템 변수의 이름에만 차이가 있다.

      ## 플러그인 확인
      SELECT * FROM mysql.plugin WHERE name='validate_password'

비밀번호 정책

  • 비밀번호 정책은 크게 다음 3가지 중에서 선택할 수 있다.
    • LOW
      • 비밀번호의 길이만 검증
    • MEDIUM
      • 기본값
      • 비밀번호의 길이를 검증하며, 숫자와 대소문자, 그리고 특수문자의 배합을 검증
    • STRONG
      • MEDIUM 레벨의 검증을 모두 수행하며, 금칙어가 포함됐는지 여부까지 검증
  • 비밀번호의 길이는 validate_password.length 시스템 변수에 설정된 길이 이상의 비밀번호가 사용됐는지를 검증한다.
  • 숫자와 대소문자, 특수문자는 다음 시스템 변수에 설정된 글자 수 이상을 포함하고 있는지 검증한다.
    • validate_password.mixed_case_count
    • validate_password.number_count
    • validate_password.special_char_count
  • 금칙어는 validate_password.dictionary_file 시스템 변수에 설정된 사전 파일에 명시된 단어를 포함하고 있는지를 검증한다.

금칙어 파일

  • MySQL 서버에서는 기본적으로 비밀번호에 연속된 단어를 사용해도 아무런 에러 없이 설정된다.
    • 예를 들어, ‘qwerty’나 ‘1234’
  • 높은 수준의 보안을 요구하는 서비스에서는 비밀번호를 사전에 명시되지 않은 단어들로 생성하도록 제어해야 할 수도 있다.
  • 이러한 요구사항이 필요한 경우에는 validate_password.dictionary_file 시스템 변수에 금칙어들이 저장된 사전 파일을 등록하면 된다.
  • 금칙어 파일은 금칙어들을 한 줄에 하나씩 기록해서 저장한 텍스트 파일로 작성하면 된다.
    • 금칙어를 하나씩 입력해서 금칙어 파일을 준비하는 것은 상당히 시간 소모적인 일이므로 이미 만들어져 있는 파일을 내려받아 더 필요한 것을 추가해서 사용하는 것도 좋다.
    • 깃허브 혹은 검색을 통해 쉽게 찾을 수 있다.
  • MySQL 서버에 금칙어 파일을 등록하는 방법은 다음과 같다.
    • 비밀번호 금칙어는 validate_password.policy 시스템 변수가 ‘STRONG’으로 설정된 경우에만 작동하므로, 해당 시스템 변수도 함께 변경해야 한다.

      -- 금칙어 파일 적용
      SET GLOBAL validate_password.dictionary_file='prihibitive_word.data';
      
      -- 비밀번호 정책을 STRONG으로 설정
      SET GLOBAL validate_password.policy='STRONG';

이중 비밀번호

비밀번호 변경의 문제

  • 일반적으로 많은 응용 프로그램 서버들이 공용으로 데이터베이스 서버를 사용하기 때문에 데이터베이스 서버의 계정 정보는 응용 프로그램 서버로부터 공용으로 사용되는 경우가 많다.
  • 이러한 구현 특성으로 인해 데이터베이스 서버의 계정 정보는 쉽게 변경하기가 어렵다.
    • 그중에서도 데이터베이스 계정의 비밀번호는 서비스가 실행 중인 상태에서 변경이 불가능했다.
    • 그래서 서비스에서 데이터베이스 계정의 비밀번호는 처음 설정한 상태로 몇 년 동안 사용되는 경우가 많다.
  • 데이터베이스 계정의 비밀번호는 보안을 위해 주기적으로 변경해야 하지만 지금까지는 서비스를 모두 멈추지 않고서는 비밀번호를 변경하는 것은 불가능한 일이었다.
  • 이 같은 문제점을 해결하기 위해 MySQL 8.0 버전부터는 계정의 비밀번호로 2개의 값을 동시에 사용할 수 있는 기능을 추가했다.
    • MySQL 서버 매뉴얼에서는 이 기능을 ‘이중 비밀번호(Dual Password)’라고 소개한다.
    • 여기서 말하는 ‘이중’은 2개의 비밀번호 중 하나만 일치하면 로그인이 통과되는 것을 의미한다.

이중 비밀번호

  • MySQL 서버의 이중 비밀번호 기능은 하나에 계정에 대해 2개의 비밀번호를 동시에 설정할 수 있다.
  • 2개의 비밀번호는 다음 2가지로 구분된다.
    • 프라이머리(Primary) : 최근에 설정된 비밀번호
    • 세컨더리(Secondary) : 이전 비밀번호
  • 이중 비밀번호를 사용하려면 기존 비밀번호 변경 구문에 RETAIN CURRENT PASSWORD 옵션만 추가하면 된다.
    -- 비밀번호를 'qwerty'로 설정
    ALTER USER 'root'@'localhost' INDENTIFIED BY 'old_password';
    
    -- 비밀번호를 'asdfg'로 변경하면서 기존 비밀번호를 세컨더리 비밀번호로 설정
    ALTER USER 'root'@'localhost' INDENTIFIED BY 'new_password' RETAIN CURRENT PASSWORD;
    • 첫 번째 ALTER USER 명령을 실행하면 root 계정의 프라이머리 비밀번호는 ‘old_password’로 변경되고 세컨더리 비밀번호는 빈 상태가 된다.
    • 두 번째 ALTER USER 명령이 실행되면 이전 비밀번호였던 ‘old_password’는 세컨더리 비밀번호로 설정되고, 새롭게 설정한 ‘new_password’는 프라이머리 비밀번호가 된다.
    • 이 상태에서 root 계정은 두 비밀번호 중 아무거나 입력해도 로그인이 된다.
  • 이렇게 설정된 상태에서 데이터베이스에 연결하는 응용 프로그램의 소스코드나 설정 파일의 비밀번호를 새로운 비밀번호인 ‘new_password’로 변경하고 배포 및 재시작을 순차적으로 실행한다.
  • MySQL 서버에 접속하는 모든 응용 프로그램의 재시작이 완료되면 세컨더리 비밀번호는 삭제한다.
    • 꼭 삭제해야 하는 것은 아니지만, 계정의 보안을 위해 삭제하는 것이 좋다.

    • 세컨더리 비밀번호가 삭제되면 기존 비밀번호로는 로그인이 불가능하며, 새로운 비밀번호로만 로그인할 수 있게 된다.

      -- 세컨더리 비밀번호 삭제
      ALTER USER 'root'@'localhost' DISCARD OLD PASSWORD;

Reference

참고 서적

📔 Real MySQL 8.0

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

0개의 댓글