MySQL 데이터베이스 감사 사용

이 주제에서는 MySQL용 Cloud SQL 감사 플러그인을 사용 설정하고 사용하는 방법을 설명합니다. 개요는 MySQL 데이터베이스 감사를 참조하세요. MySQL 플러그인에 대한 자세한 내용은 MySQL 플러그인 로드를 참조하세요.

시작하기 전에

데이터 액세스 감사 로그

데이터 액세스 감사 로그를 사용 설정하고 구성합니다. 데이터 액세스 감사 로그 구성을 참조하세요.

감사 사용자에게 필요한 권한

이를 실행하려면 감사 저장 프로시져에 대한 EXECUTE 권한이 있어야 합니다. 관리자가 감사 저장 프로시져에 대한 감사관의 액세스 권한을 변경해야 하는 경우 mysql 클라이언트에서 GRANT 또는 REVOKE 명령어를 사용해야 합니다. 사용자 권한에 대한 자세한 내용은 MySQL 사용자 권한을 참조하세요. 예를 들어 관리자가 user라는 감사관에 대한 액세스 권한을 부여하여 감사 규칙을 관리하려면 다음 문을 사용하여 권한을 부여하면 됩니다.

CREATE USER 'user'@'%' IDENTIFIED BY 'password';
GRANT EXECUTE ON PROCEDURE mysql.cloudsql_list_audit_rule TO 'user'@'%';

나중에 이 관리자가 감사관의 액세스 권한을 취소하려면 다음 문을 사용하여 권한을 취소하면 됩니다.

REVOKE ALL ON PROCEDURE mysql.cloudql_list_audit_rule FROM 'user'@'%';

기본적으로 Cloud SQL을 사용하여 생성된 사용자(IAM 사용자 제외)는 FILESUPER를 제외한 모든 권한을 보유한 관리자이며 여기에는 감사 저장 프로시져에 대한 모든 권한도 포함됩니다. IAM 데이터베이스 사용자는 기본적으로 권한이 없습니다.

MySQL용 Cloud SQL 감사 플러그인 사용 설정

MySQL용 Cloud SQL 감사 플러그인(cloudsql_mysql_audit)은 특정 데이터베이스 인스턴스의 감사 동작을 제어합니다. 플러그인을 사용하려면 먼저 Cloud SQL 인스턴스에서 이를 사용 설정해야 합니다.

cloudsql_mysql_audit 플러그인을 사용 설정하려면 다음 옵션 중 하나를 사용합니다.

  • --cloudsql_mysql_audit=ON

    플러그인을 사용 설정하도록 서버에 지시합니다. 플러그인이 초기화되지 않으면 플러그인이 중지된 상태로 서버가 실행됩니다.

  • --cloudsql_mysql_audit=FORCE

    플러그인을 사용 설정하도록 서버에 지시하지만 플러그인 초기화에 실패하는 경우 서버가 시작되지 않습니다. 즉, 이 옵션은 플러그인이 사용 설정된 상태거나 아예 플러그인이 없는 상태로 서버가 실행되도록 강제합니다.

  • --cloudsql_mysql_audit=FORCE_PLUS_PERMANENT

    FORCE와 비슷하지만 런타임에서 플러그인이 로드 취소되지 않습니다. 사용자가 UNINSTALL PLUGIN으로 플러그인을 로드 취소하려고 하면 오류가 발생합니다.

플러그인 활성화 상태는 INFORMATION_SCHEMA.PLUGINS 테이블의 PLUGIN_STATUS 열에 표시됩니다.

콘솔

  1. Google Cloud 콘솔에서 Cloud SQL 인스턴스 페이지로 이동합니다.

    Cloud SQL 인스턴스로 이동

  2. 인스턴스를 열고 수정을 클릭합니다.
  3. 플래그 섹션까지 아래로 스크롤합니다.
  4. 이전에 인스턴스에 설정되지 않은 플래그를 설정하려면 플래그 추가를 클릭하고 드롭다운 메뉴에서 cloudsql_mysql_audit를 선택하고 값을 ON으로 설정합니다.
  5. 저장을 클릭하여 변경사항을 저장합니다.
  6. 개요 페이지의 플래그에서 변경사항을 확인합니다.

gcloud

다음을 바꿉니다.

  • INSTANCE_NAME: 플래그를 설정할 인스턴스의 이름입니다.
gcloud sql instances patch INSTANCE_NAME \
           --database-flags cloudsql_mysql_audit=ON

이 명령어는 이전에 설정한 모든 데이터베이스 플래그를 덮어씁니다. 이전에 설정된 플래그를 유지하고 새 플래그를 추가하려면 인스턴스에 설정하려는 모든 플래그의 값을 포함합니다. 명확하게 포함되지 않은 플래그는 기본값으로 설정됩니다. 값을 가지지 않는 플래그의 경우 플래그 이름 뒤에 등호(=)를 지정합니다.

REST v1beta4

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • project-id: 프로젝트 ID
  • instance-id: 인스턴스 ID

HTTP 메서드 및 URL:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

JSON 요청 본문:

{
  "settings":
  {
    "databaseFlags":
    [
      {
        "name": "cloudsql_mysql_audit",
        "value": "ON"
      }
    ]
  }
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

REST v1

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • project-id: 프로젝트 ID
  • instance-id: 인스턴스 ID

HTTP 메서드 및 URL:

PATCH https://sqladmin.googleapis.com/sql/v1/projects/project-id/instances/instance-id

JSON 요청 본문:

{
  "settings":
  {
    "databaseFlags":
    [
      {
        "name": "cloudsql_mysql_audit",
        "value": "ON"
      }
    ]
  }
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

MySQL용 Cloud SQL 감사 플러그인 설정

다음 플래그를 사용하여 MySQL용 Cloud SQL 감사 플러그인의 동작을 미세 조정할 수 있습니다. 데이터베이스를 다시 시작하지 않고 모든 플래그를 변경할 수 있습니다. 플래그를 관리하는 방법은 데이터베이스 플래그 구성을 참조하세요.

  • cloudsql_mysql_audit_data_masking_regex

    Perl 호환 정규 표현식(PCRE)을 따르는 데이터 마스킹에 사용되는 정규 표현식입니다.

    기본적으로 출력 감사 로그에서 사용자 비밀번호(<psw>)는 비밀번호 마스크 ***로 대체됩니다.

    정규식은 cloudsql_mysql_audit_data_masking_cmds를 사용하여 지정한 명령어 유형의 문에만 적용됩니다. gcloud를 사용하는 경우 플래그 파일을 사용하여 복잡한 특수문자로 값을 설정해야 합니다.

    이 플래그의 기본값은 다음과 같습니다.

    
    identified(?:/\*.*?\*/|\s)*?by(?:/\*.*?\*/|\s)*?(?:password)?(?:/\*.*?\*/|
    \s)*?['|"](?<psw>.*?)(?<!\\)['|"]|password(?:/\*.*?\*/|\s)*?\((?:/\*.*?\*/|
    \s)*?['|"](?<psw>.*?)(?<!\\)['|"](?:/\*.*?\*/|\s)*?\)|password(?:/\*.*?\*/|
    \s)*?(?:for(?:/\*.*?\*/|\s)*?\S+?)?(?:/\*.*?\*/|\s)*?=(?:/\*.*?\*/|\s)*?[
    '|"](?<psw>.*?)(?<!\\)['|"]|password(?:/\*.*?\*/|\s)*?['|"](?<psw>.*?)
    (?<!\\)['|"]
    
    

    다음 예시를 참조하세요.

    • cloudsql_mysql_audit_data_masking_regex가 없으면 create user 명령어를 설명하는 감사 로그 항목이 다음과 같이 표시됩니다.

      {..."cmd":"create_user","query":"create user user1@'localhost' identified
      by 'pw'"}
      
    • 기본값이 cloudsql_mysql_audit_data_masking_regex이면 동일한 감사 로그가 다음과 같이 변경됩니다.

      {..."cmd":"create_user","query":"create user user1@'localhost' identified by
      '***'"}
      
    • cloudsql_mysql_audit_data_masking_regex(?<psw>.*)로 설정하면 Cloud SQL에서 모든 쿼리 콘텐츠를 필터링할 수 있습니다.

      {..."cmd":"create_user","query":"***"}
      
  • cloudsql_mysql_audit_data_masking_cmds

    데이터 마스킹 정규식(cloudsql_mysql_audit_data_masking_regex)이 적용되는 쉼표로 구분된 명령어 목록입니다. 필터링을 중지하려면 빈 문자열("")을 설정합니다. gcloud를 사용하는 경우 플래그 파일을 사용하여 쉼표로 구분된 목록을 설정해야 합니다. 기본값에는 다음 비밀번호 절이 포함된 MySQL 명령어가 포함됩니다.

    create_user,alter_user,grant,update
    
  • cloudsql_mysql_audit_max_query_length

    감사 로그에 기록할 쿼리의 최대 길이를 제어합니다. 쿼리 세부정보를 확인할 필요가 없으면 0을 사용하면 됩니다. 즉, 쿼리가 감사 로그에 기록되지 않습니다. 이렇게 하면 로그의 저장공간이 절약되어 비용이 절감됩니다. -1은 제한 없음을 의미합니다. 기본값은 -1입니다.

  • cloudsql_mysql_audit_log_write_period

    이 플래그 옵션에 설정한 밀리초 수에 도달한 후 또는 버퍼가 가득 찼을 때 작성자 스레드가 버퍼의 콘텐츠를 디스크에 쓰는 로그 쓰기 기간입니다. 이 플래그 옵션을 0으로 설정하면 사용자 스레드가 쓰기가 완료되었다는 작성자 스레드의 알림을 기다려야 합니다. 기본값은 500(밀리초)입니다.

콘솔

  1. Google Cloud 콘솔에서 Cloud SQL 인스턴스 페이지로 이동합니다.

    Cloud SQL 인스턴스로 이동

  2. 인스턴스를 열고 수정을 클릭합니다.
  3. 플래그 섹션까지 아래로 스크롤합니다.
  4. 이전에 인스턴스에 설정되지 않은 플래그를 설정하려면 플래그 추가를 클릭하고 드롭다운 메뉴 위의 목록에서 데이터베이스 플래그를 선택하여 값을 설정합니다.
  5. 저장을 클릭하여 변경사항을 저장합니다.
  6. 개요 페이지의 플래그에서 변경사항을 확인합니다.

gcloud

다음을 바꿉니다.

  • INSTANCE_NAME: 플래그를 설정할 인스턴스의 이름입니다.
  • FLAG_NAME: 구성 플래그의 이름입니다.
  • FLAG_VALUE: 플래그에 사용할 값입니다.

        gcloud sql instances patch INSTANCE_NAME /
                   --database-flags FLAG_NAME=FLAG_VALUE
    

REST v1beta4

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • project-id: 프로젝트 ID
  • instance-id: 인스턴스 ID

HTTP 메서드 및 URL:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

JSON 요청 본문:

{
  "settings":
  {
    "databaseFlags":
    [
      {
        "name": "flag_name",
        "value": "flag_value"
      }
    ]
  }
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

REST v1

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • project-id: 프로젝트 ID
  • instance-id: 인스턴스 ID

HTTP 메서드 및 URL:

PATCH https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id

JSON 요청 본문:

{
  "settings":
  {
    "databaseFlags":
    [
      {
        "name": "flag_name",
        "value": "flag_value"
      }
    ]
  }
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

데이터베이스 감사 구성

감사 규칙 관리

Cloud SQL은 저장 프로시져 모음을 사용하여 MySQL용 Cloud SQL 감사 플러그인 감사 규칙을 관리합니다. 감사 규칙을 생성, 나열, 업데이트, 삭제하는 데 사용할 수 있는 4가지 저장 프로시져가 있습니다.

각 저장 프로시져는 @outval@outmsg 등 두 변수를 반환합니다. 이러한 변수는 각각 저장 프로시져의 상태 코드와 오류 메시지를 나타냅니다. 별표(*)를 와일드 카드로 사용하여 사용자, 호스트, 데이터베이스, 테이블 이름을 검색할 수 있습니다. 별표를 서픽스, 프리픽스로 또는 둘 다로 사용합니다. 또한 호스트에만 와일드 카드 문자 %를 사용할 수 있습니다. 백틱(`)을 사용하여 문자열을 문자 그대로 사용해야 함을 나타낼 수 있습니다. 예를 들어 `ta*ble`은 문자 그대로 일치합니다.

새 변경사항을 적용하려면 입력 매개변수 reload_mode=1로 저장 프로시져를 실행하거나 mysql.cloudsql_reload_audit_rule(1)을 호출하여 새 변경사항을 적용해야 합니다.

감사 규칙 만들기

mysql.cloudsql_create_audit_rule을 사용하여 새 감사 규칙을 만들 수 있습니다.

감사 규칙을 만들고 한 호출로 다시 로드하려면 다음 문을 사용합니다.

CALL mysql.cloudsql_create_audit_rule('user@host','db','obj','ops','op_result',1, @outval,@outmsg);
SELECT @outval, @outmsg;

규칙을 만들고 별도의 호출로 다시 로드하려면 다음 문을 사용합니다.

CALL mysql.cloudsql_create_audit_rule('user@host','db','obj','ops','op_result',0, @outval,@outmsg);
SELECT @outval, @outmsg;
CALL mysql.cloudsql_reload_audit_rule(1);

앞의 명령어를 사용하면 여러 규칙을 만든 후 모든 변경사항을 한 번에 다시 로드할 수 있습니다.

다음 표에서는 이전 명령어의 입력 및 출력 매개변수를 보여줍니다.

입력 매개변수
이름 유형 설명 예시
user@host 또는 user@ip 문자열 감사할 데이터베이스 사용자의 쉼표로 구분된 목록입니다. user@host 또는 user@ip 형식을 사용하세요.

user1@localhost,
user1@*,
user1@%,
user@ip
db 문자열 감사할 데이터베이스의 쉼표로 구분된 목록입니다. db1,db2,db3*
obj 문자열 감사할 데이터베이스 객체의 쉼표로 구분된 목록입니다. table1,table2,table3*
ops 문자열 감사할 데이터베이스 작업의 쉼표로 구분된 목록입니다. select,delete,insert
op_result 문자열 감사 성공(S), 실패(U) 또는 둘 다(B) 성공 및 실패 작업입니다. S,U 또는 B
reload_mode 정수 규칙을 다시 로드하지 않으려면 0을, 다시 로드하려면 1을 사용합니다. 0 또는 1
출력 매개변수
이름 유형 설명 예시
@outval 정수 저장 프로시져의 상태 코드입니다. 성공 시 0, 실패 시 1입니다.
@outmsg 문자열 저장 프로시져의 오류 메시지입니다.

감사 규칙에는 다음과 같은 제한사항이 있습니다.

제한사항
user, db, obj, ops의 길이 최대 크기는 2,048자(영문 기준)입니다.
user, db, obj ,ops의 조합 수 최대 1,000개의 조합을 사용할 수 있습니다. 예를 들어 user1,user2, db1, db2, table1,table2, select,delete를 감사하는 감사 규칙은 2 x 2 x 2 x 2 = 16개 조합을 생성합니다.

감사 규칙 나열

감사관은 mysql.cloudsql_list_audit_rule을 사용하여 기존 감사 규칙을 나열할 수 있습니다.

감사 규칙 1과 2를 나열하려면 다음 명령어를 사용합니다.

CALL mysql.cloudsql_list_audit_rule('1,2',@outval,@outmsg);
SELECT @outval, @outmsg;

모든 감사 규칙을 나열하려면 다음을 수행합니다.

CALL mysql.cloudsql_list_audit_rule('*',@outval,@outmsg);
SELECT @outval, @outmsg;

다음 표에서는 이전 명령어의 입력 및 출력 매개변수를 보여줍니다.

입력 매개변수
이름 유형 설명 예시
rule_id 문자열 삭제할 규칙 ID의 쉼표로 구분된 목록입니다. 1,2,3
출력 매개변수
이름 유형 설명 예시
@outval 정수 저장 프로시져의 상태 코드입니다. 성공 시 0, 실패 시 1입니다.
@outmsg 문자열 저장 프로시져의 오류 메시지입니다.

감사 규칙 업데이트

mysql.cloudsql_update_audit_rule을 사용하여 기존 감사 규칙을 업데이트할 수 있습니다.

감사 규칙을 업데이트하고 한 호출로 다시 로드하려면 다음 문을 사용합니다.

CALL mysql.cloudsql_update_audit_rule(1,'user@host','db','obj','ops','op_result',1,@outval,@outmsg);
SELECT @outval, @outmsg;

규칙을 다시 로드하기 전에 한 세션에서 감사 규칙 여러 개를 업데이트하려 할 수 있습니다. 다음 저장 프로시져를 사용하여 한 단계에서 규칙을 업데이트한 후 이후 단계에서 해당 규칙을 다시 로드할 수 있습니다.

CALL mysql.cloudsql_update_audit_rule(1,'user@host','db','obj','ops','op_result',0,@outval,@outmsg);
SELECT @outval, @outmsg;
CALL mysql.cloudsql_reload_audit_rule(1);

다음 표에서는 이전 명령어의 입력 및 출력 매개변수를 보여줍니다.

입력 매개변수
이름 유형 설명 예시
rule_id 정수 업데이트할 규칙의 ID입니다. 5
user@host 문자열 감사할 데이터베이스 사용자의 쉼표로 구분된 목록입니다. user@host 형식을 사용합니다.

user1@localhost,user1@*
user1@%
db 문자열 감사할 데이터베이스의 쉼표로 구분된 목록입니다. db1,db2,db3*
obj 문자열 감사할 데이터베이스 객체의 쉼표로 구분된 목록입니다. table1,table2,table3*
ops 문자열 감사할 데이터베이스 작업의 쉼표로 구분된 목록입니다. SELECT,DELETE,INSERT
op_result 문자열 감사 성공(S), 실패(U) 또는 둘 다(B) 성공 및 실패 작업입니다. S,U 또는 B
reload_mode 정수 규칙을 다시 로드하지 않으려면 0을, 다시 로드하려면 1을 사용합니다. 0 또는 1
출력 매개변수
이름 유형 설명 예시
@outval 정수 저장 프로시져의 상태 코드입니다. 성공 시 0, 실패 시 1입니다.
@outmsg 문자열 저장 프로시져의 오류 메시지입니다.

감사 규칙에는 다음과 같은 제한사항이 있습니다.

제한사항
user, db, obj, ops의 길이 최대 크기는 2,048자(영문 기준)입니다.
user, db, obj, ops의 조합 수 최대 1,000개의 조합을 사용할 수 있습니다. 예를 들어 user1,user2, db1, db2, table1,table2, select,delete를 감사하는 감사 규칙은 2 x 2 x 2 x 2 = 16개 조합을 생성합니다.

감사 규칙 삭제

mysql.cloudsql_delete_audit_rule을 사용하여 기존 감사 규칙을 삭제할 수 있습니다.

감사 규칙을 삭제하고 한 호출로 다시 로드하려면 다음 문을 사용합니다.

CALL mysql.cloudsql_delete_audit_rule('1,2',1,@outval,@outmsg);
SELECT @outval, @outmsg;

규칙을 삭제하고 별도의 호출로 다시 로드하려면 다음 문을 사용합니다.

CALL mysql.cloudsql_delete_audit_rule('1,2',0,@outval,@outmsg);
SELECT @outval, @outmsg;
CALL cloudsql_reload_audit_rule(1);

앞의 명령어를 사용하면 여러 규칙을 삭제한 후 모든 변경사항을 한 번에 다시 로드할 수 있습니다.

다음 표에서는 이전 명령어의 입력 및 출력 매개변수를 보여줍니다.

입력 매개변수
이름 유형 설명 예시
rule_id 문자열 삭제할 규칙 ID의 쉼표로 구분된 목록입니다. 1,2,3
reload_mode 정수 규칙을 다시 로드하지 않으려면 0을, 다시 로드하려면 1을 사용합니다. 0 또는 1
출력 매개변수
이름 유형 설명 예시
@outval 정수 저장 프로시져의 상태 코드입니다. 성공 시 0, 실패 시 1입니다.
@outmsg 문자열 저장 프로시져의 오류 메시지입니다.

작업 그룹

MySQL용 Cloud SQL 감사 플러그인은 규칙 정의에서 작업 그룹을 사용하여 활동 컬렉션을 감사할 수 있습니다. 다음 작업 그룹을 사용하면 간단하게 감사 규칙을 만들 수 있습니다.

작업 그룹 포함된 작업
dql select
dml delete,delete_multi, insert, insert_select, load, replace, replace_select, truncate, update, update_multi,
ddl alter_db, alter_event, alter_function, alter_procedure, alter_table, alter_user, create_db, create_event, create_function, create_index, create_procedure, create_table, create_trigger, create_user, create_udf, create_view, drop_db, drop_event, drop_function, drop_index, drop_procedure, drop_table, drop_trigger, drop_user, drop_view, rename_table, rename_user
dcl grant, revoke, revoke_all
show show_binlog_events, show_create_func, show_create_proc, show_procedure_code, show_create_event, show_create_trigger, show_events, show_function_code, show_grants, show_relaylog_events, show_triggers,
call call_procedure

Cloud SQL 데이터베이스 감사 로그 보기

Cloud Logging에서 데이터베이스 감사 로그 레코드 보기

데이터베이스 감사 로그를 보려면 먼저 프로젝트에 데이터 액세스 감사 로그를 사용 설정했는지 확인합니다. 지정된 인스턴스에 대해 생성된 MySQL 감사 로그는 Cloud Logging에 데이터 액세스 감사 로그로 전송됩니다. 로그 탐색기 애플리케이션을 통해 생성된 MySQL 데이터베이스 감사 로그를 볼 수 있습니다.

로그 탐색기에서 다음 쿼리를 사용해 고급 필터 인터페이스로 특정 Cloud SQL 프로젝트의 모든 MySQL 데이터베이스 감사 로그를 표시하면 MySQL 감사 로그를 볼 수 있습니다.

다음을 바꿉니다.

  • PROJECT_NAME: 감사 로그를 생성할 프로젝트의 이름입니다.
    resource.type="cloudsql_database"
    logName="projects/PROJECT_NAME/logs/cloudaudit.googleapis.com%2Fdata_access"
    protoPayload.request.@type="type.googleapis.com/google.cloud.sql.audit.v1.MysqlAuditEntry"

또는 cloudaudit.googleapis.com/data_access 로그 필터를 선택해도 됩니다.

감사 로그 형식

감사 로그에는 다음과 같은 필드가 있습니다.

필드 이름 설명
msgType 감사 로그 메시지 유형을 나타내는 문자열입니다. msgType에는 값으로 activity만 사용할 수 있습니다.
status 작업 상태(success 또는 unsuccessful)입니다.
date 감사 이벤트가 생성된 시간을 나타내는 타임스탬프입니다.
threadId MySQL 스레드의 ID입니다.
queryId MySQL 쿼리 ID입니다.
user 클라이언트에서 보낸 사용자 이름을 나타내는 문자열입니다. 이 값은 privUser 값과 다를 수 있습니다.
privUser 서버가 클라이언트를 인증한 사용자를 나타내는 문자열입니다. 이 이름은 서버에서 권한 확인에 사용하는 사용자 이름입니다. 사용자 값과 다를 수 있습니다.
gcpIamAccount GCP IAM 계정이나 서비스 계정을 나타내는 문자열입니다.
ip 클라이언트 IP 주소를 나타내는 문자열입니다.
host 클라이언트 호스트 이름을 나타내는 문자열입니다.
errCode 실패한 작업의 MySQL 오류 코드입니다. MySQL 서버 오류 메시지 참조를 확인하세요.
cmd 사용할 SQL 문(작업 유형)을 나타내는 문자열입니다. 예를 들면 INSERT, UPDATE, 또는 DELETE입니다.
objects 감사 객체입니다. 일반적으로 테이블입니다. 이 필드에는 객체에 대한 다음과 같은 정보가 포함됩니다.

db 기본 데이터베이스 이름을 나타내는 문자열입니다.
name 객체 이름을 나타내는 문자열입니다. 일반적으로 테이블 이름입니다.
objType 객체 유형을 나타내는 문자열입니다. 일반적으로 TABLE입니다.
query (직접 실행한) SQL 문입니다.
chunkCount 감사 로그 쿼리 크기가 cloudsql_mysql_audit_event_split_threshold(90,000) 이상인 경우 총 청크 수입니다.
chunkIndex 청크 색인입니다. chunk_index는 1부터 시작합니다.
@type 유형은 항상 type.googleapis.com/google.cloud.sql.audit.v1.MysqlAuditEntry입니다.

다음은 감사 로그 항목 예시입니다.

{
"msgType":"activity",
"status":"unsuccessful",
"date":"2021-11-11T06:16:16.163603Z",
"threadId":"750",
"queryId":"26763",
"user":"root",
"priv_user":"root",
"ip":"",
"host":"localhost",
"errCode":"1146",
"cmd":"select",
"objects":[{"db":"test","name":"t4","obj_type":"TABLE"}],
"query":"select * from test.t4",
"chunkCount":2,
"chunkIndex":2,
"@type":"type.googleapis.com/google.cloud.sql.audit.v1.MysqlAuditEntry"
}

데이터베이스 감사 중지

MySQL용 Cloud SQL 감사 플러그인을 중지하려면 데이터베이스 플래그 cloudsql_mysql_audit를 OFF로 설정하거나 플래그를 삭제합니다.

콘솔

  1. Google Cloud 콘솔에서 Cloud SQL 인스턴스 페이지로 이동합니다.

    Cloud SQL 인스턴스로 이동

  2. 인스턴스를 열고 수정을 클릭합니다.
  3. 플래그 섹션까지 아래로 스크롤합니다.
  4. 이전에 인스턴스에 설정되지 않은 플래그를 설정하려면 플래그 추가를 클릭하고 드롭다운 메뉴에서 cloudsql_mysql_audit를 선택하고 값을 OFF으로 설정합니다.
  5. 저장을 클릭하여 변경사항을 저장합니다.
  6. 개요 페이지의 플래그에서 변경사항을 확인합니다.

gcloud

다음을 바꿉니다.

  • INSTANCE_NAME: 플래그를 설정할 인스턴스의 이름입니다.

    gcloud sql instances patch INSTANCE_NAME \
               --database-flags cloudsql_mysql_audit=OFF
    

REST v1beta4

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • project-id: 프로젝트 ID
  • instance-id: 인스턴스 ID

HTTP 메서드 및 URL:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

JSON 요청 본문:

{
  "settings":
  {
    "databaseFlags":
    [
      {
        "name": "cloudsql_mysql_audit",
        "value": "OFF"
      }
    ]
  }
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

REST v1

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • project-id: 프로젝트 ID
  • instance-id: 인스턴스 ID

HTTP 메서드 및 URL:

PATCH https://sqladmin.googleapis.com/sql/v1/projects/project-id/instances/instance-id

JSON 요청 본문:

{
  "settings":
  {
    "databaseFlags":
    [
      {
        "name": "cloudsql_mysql_audit",
        "value": "OFF"
      }
    ]
  }
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

감사 규칙의 예시

  1. 모든 사용자의 모든 활동을 감사합니다.

    CALL mysql.cloudsql_create_audit_rule('*','*','*','*','B',1,@outval,@outmsg);
    
  2. 단일 사용자 user1의 모든 활동을 감사합니다.

    CALL mysql.cloudsql_create_audit_rule('user1@*','*','*','*','B',1,@outval,@outmsg);
    
  3. user로 시작하는 모든 사용자의 모든 활동을 감사합니다.

    CALL mysql.cloudsql_create_audit_rule('user*@*','*','*','*','B',1, @outval,@outmsg);
    
  4. 모든 사용자의 모든 DML 작업을 감사합니다.

    CALL mysql.cloudsql_create_audit_rule('*','*','*','dml','B',1,@outval,@outmsg);
    
  5. 특별한 데이터베이스 db1의 선택 작업을 감사합니다.

    CALL mysql.cloudsql_create_audit_rule('*','db1','*','select','B',1,@outval,@outmsg);
    
  6. 특수문자 db~1을 사용하는 데이터베이스의 모든 활동을 감사합니다.

    CALL mysql.cloudsql_create_audit_rule('*','`db~1`','*','*','B',1,@outval,@outmsg);
    
  7. db1.table1 테이블의 선택 작업과 삭제 작업을 감사합니다.

    CALL mysql.cloudsql_create_audit_rule('*','db1','table1','select,delete','B',1,@outval,@outmsg);
    
  8. 성공한 모든 작업을 감사합니다.

    CALL mysql.cloudsql_create_audit_rule('*','*','*','*','S',1,@outval,@outmsg);
    
  9. user로 시작하는 모든 사용자의 모든 활동을 감사하지 마세요.

    CALL mysql.cloudsql_create_audit_rule('user*@*','*','*','*','E',1, @outval,@outmsg);
    

문제 해결

문제 문제 해결하기
명령어를 호출할 때 cloudsql_mysql_audit가 표시되지 않습니다.

SHOW (global) variables
cloudsql_mysql_audit는 플러그인 이름입니다. 활성 상태인지 확인하려면 다음 명령어를 사용합니다.


SHOW PLUGINS

그리고 status 항목을 확인합니다.
cloudsql_mysql_audit를 사용 설정했으나 mysql 감사 로그가 표시되지 않는 이유는 무엇인가요? 데이터 액세스 감사 로그 구성의 설명대로 데이터 액세스 감사 로그를 사용 설정해야 합니다. 또한 원하는 감사 로그를 감사하려면 MySQL용 Cloud SQL 감사 플러그인에 감사 규칙이 필요합니다. `reload_mode=1`과 함께 저장 프로시져를 사용하여 감사 규칙을 만들거나 다음 명령어를 실행하거나 새로 추가된 감사 규칙이 작동하도록 데이터베이스를 다시 시작합니다.


CALL mysql.cloudsql_reload_audit_rule(1)
데이터베이스 플래그를 업데이트할 때 다음 오류가 표시됩니다.

오류 1193: 알 수 없는 시스템 변수 'cloudsql_mysql_audit_xxx'
cloudsql_mysql_audit_xxx 플래그는 감사 플러그인이 활성 상태일 때만 작동합니다. 인스턴스에서 기존 cloudsql_mysql_audit_xxx 플래그를 삭제한 후 cloudsql_mysql_audit_xxx 플래그를 업데이트하기 전에 다음 명령어를 사용하여 플러그인을 사용 설정합니다.


cloudsql_mysql_audit=ON
감사 규칙을 설정하지 않았는데 감사 로그가 생성됩니다. 감사 규칙 테이블(mysql.audit_log_rulesmysql.audit_log_rules_expanded)과 감사 저장 프로시져(mysql.cloudsql_xxxx_audit_rule)에 대한 변경사항은 기본적으로 로깅됩니다.
기본 인스턴스를 변경한 후부터 복제본 인스턴스에 대한 감사 로그가 표시되지 않습니다. 복제 스레드와 비정상 종료 복구 스레드는 로깅되지 않습니다. Cloud SQL은 기본 인스턴스의 활동을 감사하지만 복제본 인스턴스의 작업을 감사하지 않습니다.
다음 명령어를 사용하여 쉼표로 구분된 목록에서 값을 설정하려고 했지만 실패했습니다.

gcloud instances patch --database-flags
gcloud 명령어를 사용하여 쉼표로 구분된 플래그 값 목록을 지정하는 경우 --flags-file 인수를 사용합니다. 먼저 다음 정보를 사용하여 파일을 만들어야 합니다.


--database-flags:
general_log: OFF
cloudsql_mysql_audit_max_query_length: '20'
cloudsql_mysql_audit_data_masking_cmds: select,update

그러고 나서 다음 명령어를 실행합니다.


gcloud sql instances patch --flags-file=flagfile
다음 명령어에서 오류를 반환합니다.

CALL mysql.cloudsql_create_canonical_rules
의도된 오류입니다. mysql.cloudsql_create_canonical_rules는 오직 mysql.cloudsql_create_audit_rule mysql.cloudsql_update_audit_rule에서 내부적으로 호출해야 합니다.
어떤 작업을 감사할 수 있나요? 지원되는 작업은 지원되는 작업의 전체 목록에 나와 있습니다. 다음과 같은 일부 작업은 데이터베이스에 영향을 주지 않으므로 감사되지 않습니다.


USE db_name


또는


SHOW VARIABLES


함수를 객체로 감사할 수 없는 경우도 있습니다(지원되지 않는 기능).
특정 테이블의 모든 작업을 감사하기 위해 다음 감사 규칙을 만들었습니다.

mysql.cloudsql_create_audit_rule("user@*","db", "table","*","B",1,@1,@2);
그런데 disconnectconnect와 같이 테이블과 관련 없는 감사 로그가 표시됩니다.
연결 해제 또는 연결과 같은 일부 작업은 전역으로 간주됩니다. 입력 dbobject 필드는 무시됩니다.
저장 프로시져를 사용하여 감사 규칙을 생성, 업데이트 또는 삭제하면 다음 오류가 표시됩니다.

MySQL 서버는 read-only 옵션으로 실행되기 때문에 이 문을 실행할 수 없습니다.
Cloud SQL은 읽기 전용 인스턴스에서 저장 프로시져를 변경할 수 없습니다. 인스턴스가 기본이면 read_only 플래그를 삭제합니다. 인스턴스가 복제본 인스턴스이면 기본 인스턴스에서 변경합니다. 규칙 변경사항을 복제본 인스턴스에 복제하면 복제본 인스턴스에서 다음 명령어를 실행하여 규칙을 복제본으로 다시 로드합니다.

CALL mysql.cloudsql_reload_audit_rule(1)
감사 규칙을 생성, 업데이트 또는 삭제하는 경우 성공적으로 변경되더라도 다음 오류가 표시됩니다.

0 rows affected
0 rows affected 응답은 테이블이 아닌 저장 프로시져에서 실행된 마지막 문입니다. 감사 규칙이 변경되었는지 확인하려면 다음 명령어를 사용합니다.


mysql.cloudsql_list_audit_rule
gcloud를 사용하여 cloudsql_mysql_audit_data_masking_cmdscloudsql_mysql_audit_data_masking_regexp를 설정할 수 없습니다. gcloud에서 복잡한 플래그 값(특수문자를 포함한 플래그)을 설정하려면 --flags-file 인수를 사용해야 합니다.
CREATE USER 문을 사용하여 저장 프로시져를 만들었지만 비밀번호가 마스킹되지 않습니다. 기본적으로 마스킹은 다음과 같은 cmds(작업)에서만 작동합니다.

CREATE_USER, ALTER_USER, GRANT, UPDATE.

저장 프로시져를 만드는 동안 비밀번호를 필터링하려면 create_procedurecloudsql_mysql_audit_data_masking_cmds에 추가합니다.
감사 규칙을 생성, 업데이트 또는 삭제하려고 시도하면 잠금 대기 제한 시간 초과 오류가 발생합니다. 일반적으로 이 오류는 세션 두 개 이상에서 감사 규칙을 동시에 수정하려고 하면 발생합니다. 이 문제가 자주 발생하면 innodb_lock_wait_timeout 변수 값을 올립니다. 데이터베이스 플래그를 사용하여 전역적으로 또는 예를 들어 다음 명령어를 사용하여 세션에 대해서만 올릴 수 있습니다.

SET innodb_lock_wait_timeout=120
.

다음 단계