rdsrepladmin_priv_checks_user – Aurora MySQL 3.07.1 신규 계정

Aurora MySQL 3.07.1 이후 바이너리 로그 복제를 위해 추가된 rdsrepladmin_priv_checks_user 권한에 대해 자세히 알아보세요. 복제 프로세스를 안전하고 효율적으로 설정하는 방법을 소개합니다.

rdsrepladmin_priv_checks_user - Aurora MySQL 3.07.1 신규 계정
Overlay Image Overlay Image
rdsrepladmin_priv_checks_user - Aurora MySQL 3.07.1 신규 계정

rdsrepladmin_priv_checks_user 라는 명칭의 계정이 Aurora MySQL 3.07.1에 새로 추가 되었습니다. 이 계정은 초기 구성시 부터 존재하는 것은 아니지만, 바이너리 로그 복제 설정 과정 중에 생성되어, 이후 복제 과정중에 사용되는 계정입니다. rdsrepladmin_priv_checks_user 계정이 어떠한 내용의 계정인지 세부 정보를 확인해봅시다.

RDS 바이너리 로그 복제 – 권한 확인 유저

Amazon Aurora MySQL 버전 3.07.1에서 Binary log Replication 기능 사용 중 권한 확인을 위한 유저 (PRIVILEGE_CHECKS_USER)로써 rdsrepladmin_priv_checks_user를 신규 도입하였습니다. 이 유저는 복제 프로세스의 보안을 유지하고 필요한 액세스 제어 정책을 준수하는 데 중요한 역할을 합니다.

rdsrepladmin_priv_checks_user 개요

  • 목적: 이 사용자는 바이너리 로그 복제를 위한 권한 확인을 처리하도록 설계되었습니다.
  • 권한: rds_superuser_role과 함께 replication_applier 권한을 보유합니다.
  • 생성: 바이너리 로그 복제를 활성화하기 위해 mysql.rds_start_replication 저장 프로시저를 호출하면 rdsrepladmin_priv_checks_user가 자동으로 생성됩니다.
  • 예약된 사용자: rdsrepladmin_priv_checks_user@localhost는 예약된 사용자로, 이 사용자를 수정하거나 삭제하지 않는 것이 좋습니다.

참고 : 릴리즈노트, 레퍼런스매뉴얼

간략 정리

  1. Aurora MySQL 3.07.1 이 후의 버전을 사용하면서, 오로라 자체 복제 기능이 아닌, MySQL 기본 제공 복제 기능일 바이너리 로그 복제 기능을 활성화 하려 한다면, (리전간의 복제나, 온프레미스로의 복제등을 목적으로 활성화)
  2. mysql.rds_start_replication 이라는 스토어드 프로시저가 호출되고
  3. 이 프로시저가 실행되는 도중에 mysql.rds_configure_privilege_checks_user 라는 스토어드 프로시저가 호출됩니다.
  4. 이, rds_configure_privilege_checks_user 프로시저가 수행되는 와중에 ‘rdsrepladmin_priv_checks_user’@’localhost’ 라는 계정을 생성하고
  5. 이 계정에 ‘rds_superuser_role ‘ 라는 롤을 부여하고, 이 롤을 디폴트 롤로 설정합니다.
  6. 그리고 ‘replication_applier‘ 라는 권한을 부여합니다.
  7. 그리고 ‘CHANGE REPLICATION SOURCE TO PRIVILEGE_CHECKS_USER =’ 구문을 수행하여 이 계정을 지정합니다.

정확한 이해를 위한 상세 정보

rds_superuser_role 권한

rds_superuser_role은 Aurora RDS에서 최상위 권한 역할로, 다음과 같은 권한을 포함합니다:

  • 데이터베이스 관리: 모든 데이터베이스에 대한 읽기, 쓰기 및 수정 권한.
  • 사용자 및 권한 관리: 새 사용자 생성, 기존 사용자 삭제, 권한 설정.
  • 복제 관리: 복제 관련 작업 수행 및 설정 변경.
  • 시스템 설정: 데이터베이스 서버 수준 설정 수정.

replication_applier 권한

replication_applier는 복제 프로세스에서 필요한 권한으로, 다음과 같은 작업을 허용합니다:

  • 복제 로그 적용: 바이너리 로그 상의 변경 사항을 적용.
  • 복제 연결 관리: 복제 프로세스의 연결 상태를 유지.

이 권한은 RDS 전용 권한이 아니라, 기본 MySQL에도 존재하는 권한입니다.

스토어드 프로시저: mysql.rds_start_replication

mysql.rds_start_replication 스토어 프로시저는 복제 프로세스를 시작하는 데 사용됩니다. 이 프로시저는 복제를 시작할 뿐만 아니라 rdsrepladmin_priv_checks_user가 적절히 구성되었는지 확인합니다. 아래는 프로시저의 정의입니다:

CREATE DEFINER=`rdsadmin`@`localhost` PROCEDURE `rds_start_replication`()
    READS SQL DATA
    DETERMINISTIC
BEGIN
  DECLARE v_autocommit_status BOOLEAN;
  DECLARE v_mysql_version VARCHAR(20);
  DECLARE v_threads_running INT;
  DECLARE v_replica_parallel_workers INT;
  DECLARE v_called_by_user VARCHAR(50);
  DECLARE v_sleep INT;
  DECLARE sql_logging BOOLEAN;
  DECLARE EXIT HANDLER FOR SQLEXCEPTION
  BEGIN
    SET @@sql_log_bin=sql_logging;
    SET @@autocommit=v_autocommit_status;
    RESIGNAL;
  END;
  SET v_autocommit_status=@@autocommit;
  SET @@autocommit=1;
  SELECT @@sql_log_bin INTO sql_logging;
  SELECT user() INTO v_called_by_user;
  SELECT version() INTO v_mysql_version;
  SELECT COUNT(1) INTO v_threads_running FROM (SELECT service_state FROM performance_schema.replication_applier_status UNION ALL SELECT service_state FROM performance_schema.replication_connection_status) t WHERE service_state='ON';
  SELECT @@replica_parallel_workers into v_replica_parallel_workers;
  IF v_threads_running <= 1
  THEN
    SET @@sql_log_bin = OFF;
    CALL mysql.rds_configure_privilege_checks_user();
    UPDATE mysql.rds_replication_status SET called_by_user=v_called_by_user,action='start slave', mysql_version=v_mysql_version where action is not null;
    COMMIT;
    SELECT sleep(1) INTO v_sleep;
    START REPLICA;
    SELECT sleep(1) INTO v_sleep;
    SELECT COUNT(1) INTO v_threads_running FROM (SELECT service_state FROM performance_schema.replication_applier_status UNION ALL SELECT service_state FROM performance_schema.replication_connection_status) t WHERE service_state='ON';
    IF v_threads_running = 2
    THEN
      INSERT INTO mysql.rds_history (called_by_user,action,mysql_version) VALUES (v_called_by_user,'start slave', v_mysql_version);
      COMMIT;
      SELECT 'Replica running normally.' AS Message;
    ELSE
      SELECT 'Replica has encountered an error. Run SHOW REPLICA STATUS; to see the error.' AS Message;
    END IF;
  ELSE
    IF v_threads_running > 1
    THEN
      SELECT 'Replica may already be running. Call rds_stop_replication to stop replication;' AS Message;
    END IF;
  END IF;
  SET @@sql_log_bin=sql_logging;
  SET @@autocommit=v_autocommit_status;
END;

28번째 라인을 보시면 CALL mysql.rds_configure_privilege_checks_user(); 라는 내용을 확인 가능합니다.

저장 프로시저: mysql.rds_configure_privilege_checks_user

이 프로시저는 rds_start_replication에 의해 내부적으로 호출되어 rdsrepladmin_priv_checks_user를 구성합니다. 해당 계정을 생성 후, 필요한 권한을 부여하고 복제 설정이 일관되게 유지되도록 보장합니다.

CREATE DEFINER=`rdsadmin`@`localhost` PROCEDURE `rds_configure_privilege_checks_user`()
BEGIN
  DECLARE is_user_created BOOLEAN;
  DECLARE is_user_set BOOLEAN;
  DECLARE is_user_role_set BOOLEAN;
  DECLARE is_role_created BOOLEAN;
  DECLARE username VARCHAR(30) DEFAULT 'rdsrepladmin_priv_checks_user';
  DECLARE hostname VARCHAR(10) DEFAULT 'localhost';
  DECLARE v_replication_threads_running INT;
  DECLARE v_autocommit_status BOOLEAN;
  DECLARE sql_logging BOOLEAN;
  DECLARE EXIT HANDLER FOR SQLEXCEPTION
  BEGIN
    SET @@sql_log_bin=sql_logging;
    SET @@autocommit=v_autocommit_status;
    RESIGNAL;
  END;
  SET v_autocommit_status=@@autocommit;
  SET @@autocommit=1;
  SELECT @@sql_log_bin into sql_logging;
  SET @@sql_log_bin=off;
  SELECT COUNT(1) INTO v_replication_threads_running FROM (SELECT service_state FROM performance_schema.replication_applier_status UNION ALL SELECT service_state FROM performance_schema.replication_connection_status) t WHERE service_state='ON';
  IF v_replication_threads_running > 0 THEN
    SELECT 'Replication is already running. Call mysql.rds_stop_replication to stop replication' AS Message;
  ELSE
    SET @cmd='';
    SELECT EXISTS(SELECT * FROM mysql.user WHERE user=username AND host=hostname) INTO is_user_created;
    SELECT EXISTS(SELECT * FROM mysql.default_roles WHERE user=username AND host=hostname AND default_role_user='rds_superuser_role' AND default_role_host='%') AND EXISTS(SELECT * FROM mysql.global_grants WHERE user=username AND host=hostname AND priv='REPLICATION_APPLIER')  INTO is_user_role_set;
    SELECT EXISTS(SELECT * FROM mysql.slave_relay_log_info WHERE Privilege_checks_username=username AND Privilege_checks_hostname=hostname) INTO is_user_set;
    SELECT EXISTS(SELECT * FROM mysql.user WHERE user='rds_superuser_role' AND host='%') INTO is_role_created;
    IF is_role_created = False THEN
      SET @@sql_log_bin=sql_logging;
      SET @@autocommit=v_autocommit_status;
      SELECT 'rds_superuser_role needs to be present in order to start replication.' INTO @msg;
      SIGNAL SQLSTATE VALUE '45000' SET MESSAGE_TEXT = @msg;
    END IF;
    IF (is_user_created = True AND is_user_role_set = False) THEN
      SET @@sql_log_bin=sql_logging;
      SET @@autocommit=v_autocommit_status;
      SELECT CONCAT('Please drop the user ', QUOTE(username), '@', QUOTE(hostname), ' in order to start replication.') INTO @msg;
      SIGNAL SQLSTATE VALUE '45000' SET MESSAGE_TEXT = @msg;
    END IF;
    IF is_user_created = False THEN
      SELECT CONCAT('CREATE USER ', QUOTE(username), '@', QUOTE(hostname), " IDENTIFIED WITH 'caching_sha2_password' AS '$A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED' PASSWORD EXPIRE NEVER ACCOUNT LOCK;") INTO @cmd;
      PREPARE create_user FROM @cmd;
      EXECUTE create_user;
    END IF;
    IF is_user_role_set = False THEN
      SELECT CONCAT('GRANT rds_superuser_role TO ', QUOTE(username), '@', QUOTE(hostname)) INTO @cmd;
      PREPARE grant_user_role FROM @cmd;
      EXECUTE grant_user_role;
      SELECT CONCAT('SET DEFAULT ROLE rds_superuser_role TO ', QUOTE(username), '@', QUOTE(hostname)) INTO @cmd;
      PREPARE set_user_role FROM @cmd;
      EXECUTE set_user_role;
      SELECT CONCAT('GRANT REPLICATION_APPLIER ON *.* TO ', QUOTE(username), '@', QUOTE(hostname)) INTO @cmd;
      PREPARE set_user_applier FROM @cmd;
      EXECUTE set_user_applier;
    END IF;
    IF is_user_set = False THEN
      SELECT CONCAT('CHANGE REPLICATION SOURCE TO PRIVILEGE_CHECKS_USER = ', QUOTE(username), '@', QUOTE(hostname), ';') INTO @cmd;
      PREPARE set_priv_checks_user FROM @cmd;
      EXECUTE set_priv_checks_user;
    END IF;
  END IF;
  SET @@sql_log_bin=sql_logging;
  SET @@autocommit=v_autocommit_status;
END;

rdsrepladmin_priv_checks_user 계정이 이미 존재하는지 등을 확인하는 부분과,
계정생성 + 롤부여 + 디폴트 롤 설정 + PRIVILEGE_CHECKS_USER 변경 하는 부분으로 구성되어 있습니다.

주요 요점

  • rdsrepladmin_priv_checks_user는 MySQL 기본 기능이 아니라, RDS Aurora MySQL 전용 계정입니다. 3.07.1에서 추가되었습니다.
  • rdsrepladmin_priv_checks_user는 바이너리 로그 복제 설정 중에 생성됩니다. RDS 초기 구성시부터 생성되는 계정은 아닙니다.
  • rdsrepladmin_priv_checks_user는 권한 확인을 중앙 집중화하여 복제 프로세스를 간소화하고 보안을 강화합니다.
  • mysql.rds_start_replicationmysql.rds_configure_privilege_checks_user와 같은 스토어드 프로시저는 복제 설정을 자동화하고 보호합니다.
  • 이 사용자 또는 관련 설정을 직접 수정하지 않는 것이 권장됩니다.

관련글

오로라 페일오버 후에도 Read-Only 오류가 발생하는 이유와 해결 방법

오로라 페일오버 후에도 Read-Only

오로라 페일오버 후에도 Read-Only 오류 발...

MySQL 쿼리 프로파일 설정

MySQL 쿼리 프로파일

쿼리 프로파일 수집 방법 간단 정리 MyS...

MySQL 데이터파일 사이즈 계산

OS 접근이 불가능할 때 대략적인

OS에서 MySQL 데이터파일 사이즈 계산하기 ...

Leave a Comment