MySQL 데이터베이스 감사

이 주제에서는 MySQL용 Cloud SQL 데이터베이스 감사 및 MySQL용 Cloud SQL 감사 플러그인을 설명합니다. 데이터베이스 감사를 지금 사용하려면 MySQL 데이터베이스 감사 사용을 참조하세요.

데이터베이스 감사란?

데이터베이스 감사를 사용하면 데이터베이스에서 테이블 업데이트, 읽기 쿼리, 사용자 권한 부여와 같은 특정 사용자 작업을 추적할 수 있습니다. 데이터베이스 감사는 보안상의 이유로 사용자 활동을 추적해야 하거나 다양한 금융, 정부, ISO 규정을 준수해야 하는 조직에 유용합니다. 데이터베이스 감사는 MySQL용 Cloud SQL 5.7 및 8.0에서 지원됩니다.

MySQL용 Cloud SQL 감사 플러그인

데이터베이스 감사는 MySQL용 Cloud SQL 감사 플러그인 또는 cloudsql_mysql_audit에서 사용 설정됩니다. 이 플러그인은 개방형 MySQL 감사 API를 사용하여 MySQL에서 활동을 모니터링하고 로깅합니다. 플러그인은 Cloud Logging 데이터 액세스 감사 로그에 로그를 보냅니다. 감사 로그는 크기가 클 수 있으므로 데이터 액세스 감사 로그는 기본적으로 중지되어 있습니다. 플러그인을 사용하려면 명시적으로 로그를 사용 설정해야 합니다.

플러그인이 활성화되면 데이터베이스의 감사 로그를 생성하기 위해 만든 기존 감사 규칙이 적용됩니다. 플러그인이 비활성화되면 감사 로그가 생성되지 않습니다.

MySQL 플러그인에 대한 자세한 내용은 MySQL 서버 플러그인을 참조하세요.

누가 데이터베이스 감사를 사용하나요?

데이터베이스 감사와 관련된 사용자에는 다음과 같은 3가지 유형이 있습니다.

  • 관리자 - 데이터베이스를 관리하는 사용자입니다. 관리자는 인스턴스에 대해 감사를 사용 설정 및 중지하고 새 사용자를 만들 수 있는 감사 사용자입니다. 또한 감사자에게 감사 권한을 부여합니다. 관리자는 감사 규칙을 생성, 삭제, 업데이트할 수도 있습니다.
  • 감사관 - 감사 규칙을 생성, 삭제, 업데이트할 권한이 있는 사용자입니다. 관리자가 액세스 권한을 부여합니다.
  • 클라이언트 - 감사 규칙을 통해 활동이 감사되는 사용자이지만 감사 사용자는 아니며 관리 또는 감사 권한이 없는 사용자입니다. 관리자가 액세스 권한을 관리합니다.

관리자 및 감사자는 감사 사용자라고도 합니다.

감사 규칙

데이터베이스 감사는 감사 규칙을 사용하여 감사 로그 생성을 트리거해야 하는 사용자, 데이터베이스, 객체, 작업, 상태의 조합을 정의합니다. 감사 규칙에는 다음 정보가 포함됩니다.

  • ID - 자동 숫자 규칙 식별자입니다. 각 감사 규칙에는 규칙이 생성될 때 자동으로 감사 ID가 할당됩니다. 감사 ID는 생성된 후에는 변경할 수 없습니다.
  • 사용자 이름 - 사용자 또는 와일드 카드 패턴의 쉼표로 구분된 목록입니다. 별표(*)를 사용자와 호스트의 와일드 카드로 사용할 수 있습니다. 별표를 서픽스, 프리픽스로 또는 둘 다로 사용합니다. 또한 사용자는 호스트에만 와일드 카드 문자 %를 사용할 수 있습니다. 최대 크기는 2,048자(영문 기준)입니다.
  • Dbname - 데이터베이스 이름 또는 와일드 카드 패턴의 쉼표로 구분된 목록입니다. 별표(*)를 사용자와 호스트의 와일드 카드로 사용할 수 있습니다. 별표를 서픽스, 프리픽스 또는 둘 다로 사용합니다. 최대 크기는 2,048자(영문 기준)입니다.
  • 객체: 데이터베이스 객체(테이블, 함수, 저장 프로시저 등) 이름 또는 와일드 카드 패턴의 쉼표로 구분된 목록입니다. 별표(*)를 사용자와 호스트의 와일드 카드로 사용할 수 있습니다. 별표를 서픽스, 프리픽스로 또는 둘 다로 사용합니다. 최대 크기는 2,048자(영문 기준)입니다.
  • 작업 - 쉼표로 구분된 데이터베이스 작업 목록입니다. 플러그인은 그룹 작업(예: DDL, DML 등), 단일 작업(예: 업데이트, 삭제) 및 모든 작업의 와일드 카드(*)를 지원합니다. 지원되는 작업의 전체 목록을 참조하세요. 이 플러그인은 또한 작업 그룹을 감사하는 데 사용할 수 있는 작업 그룹을 지원합니다. 최대 크기는 2,048자(영문 기준)입니다.
  • Op_result - 작업의 결과

    • S: 성공한 작업을 감사합니다.
    • U: 실패한 작업을 감사합니다.
    • B: 성공 및 실패한 작업을 모두 추적합니다.
    • E: 독점 규칙을 만듭니다.

작업 유형

작업 유형은 데이터베이스에서 감사할 수 있는 여러 유형의 활동이나 작업입니다.

  • DQL - 데이터베이스에서 데이터 읽기(즉, SELECT 문)
  • DML - 데이터 추가, 삭제, 수정
  • DDL - 데이터베이스의 데이터베이스 객체 구조 만들기 또는 수정
  • DCL - 데이터베이스의 사용자의 권한 관리
  • Show - 데이터베이스에 대한 이의 설명 또는 데이터베이스 상태 제공
  • Call - 저장 프로시져 호출

감사 로깅에 영향을 미치는 고려사항

백업

백업 또는 PITR(point-in-time recovery)에서 인스턴스를 복원할 때 감사 규칙도 백업 또는 PITR로 롤백됩니다. 이는 규칙이 감사하는 대상(사용자 및 객체)과 마찬가지로 감사 규칙도 데이터베이스에 저장된 데이터의 일부이기 때문입니다.

읽기 복제본

감사 규칙은 기본 인스턴스에서 읽기 복제본으로 자동으로 복제됩니다. 고객은 읽기 복제본에 대한 감사 규칙을 추가, 삭제, 수정할 수 없습니다. 복제본의 감사 규칙을 변경하려면 기본 인스턴스의 감사 규칙을 업데이트해야 합니다.

기본 인스턴스에서 감사 로그 규칙을 업데이트하는 경우 읽기 복제본에서도 새 감사 규칙이 업데이트되도록 복제본에서 감사 규칙을 새로고침해야 합니다. 다음 명령어는 감사 규칙을 새로고침합니다.

CALL mysql.cloudsql_reload_audit_rule(1)

사용자가 기본 인스턴스와 관계없이 복제본에 감사 로깅을 사용 설정할 수 있습니다. 기본 인스턴스를 변경한 후에는 reload 명령어를 실행하거나 복제본 인스턴스를 다시 시작하여 감사 로그 규칙을 적용해야 합니다.

감사 로그 실패 시의 데이터베이스 가용성

감사 작업이 실패하면 Cloud SQL이 데이터베이스 활동을 완료하는 것을 중지하지 않습니다. 예를 들어 인스턴스에 디스크 공간이 부족하고 Cloud SQL에서 감사 로그를 생성할 수 없는 경우, 데이터베이스는 일반적으로 이 활동으로 감사 로그가 생성되더라도 사용자가 읽기 쿼리를 수행할 수 있도록 허용합니다.

읽기 전용 인스턴스

인스턴스에 read_only 플래그가 true로 설정되어 있으면 테이블에 규칙이 저장되므로 감사 규칙을 추가하거나 업데이트할 수 없습니다. 규칙을 만들거나 업데이트하거나 삭제하려면 먼저 read_only 플래그를 삭제해야 합니다.

제한사항 및 알려진 문제

바이너리 로그 적용

MySQL용 Cloud SQL 감사 플러그인은 인스턴스의 바이너리 로그와 호환되지 않습니다.

경우에 따라 MySQL용 Cloud SQL 감사 플러그인이 사용 설정된 상태에서 바이너리 로그를 적용하려고 하면 데이터베이스 인스턴스가 비정상 종료될 수 있습니다.

mysqlbinlog 유틸리티를 사용하여 바이너리 로그를 적용하려면 먼저 cloudsql_mysql_audit=OFF를 설정하여 데이터베이스 감사를 중지해야 합니다.

로그 수집 속도

Cloud SQL이 Cloud Logging에 감사 로그를 보내기 전에 감사 로그가 디스크 공간을 사용해 인스턴스의 디스크에 임시로 작성됩니다. 로그는 초당 4MB의 속도로 Cloud Logging에 업로드되었다가 디스크에서 삭제됩니다. 로그 생성으로 인한 부하가 업로드 속도를 초과하면 인스턴스의 디스크 사용량이 증가하여 데이터베이스에 디스크 부족 및 비정상 종료를 초래할 수 있습니다. 디스크 저장용량 자동 증가가 사용 설정되어 있어도 디스크 사용량이 늘면 비용이 증가합니다.

이 기능을 사용하는 동안 다음을 수행하는 것이 좋습니다.

  • 스토리지 자동 증가를 사용 설정합니다.
  • 전체 디스크 사용량을 모니터링합니다. 로그 생성 시의 부하는 별도로 모니터링할 수 없습니다. 측정항목 탐색기에서 cloudsql.googleapis.com/database/disk/utilization 측정항목을 사용합니다.
  • 필요한 경우 데이터베이스 활동을 제한하거나 감사를 줄여 로그 생성 속도를 늦춥니다.

실패한 작업 감사

감사 규칙에 실패한 작업에 대한 감사가 포함된 경우(op_result는 실패한 작업에 U로 표시되거나 실패한 작업과 성공한 작업 모두에 B로 설정됨) 일부 사용자는 실패한 작업을 지속적으로 실행하여 감사 로그로 데이터베이스 인스턴스를 과부하시킬 수 있습니다. 로그 생성 속도가 로그 수집 속도를 초과하면 디스크 사용량이 원치 않게 증가하여 디스크 공간이 고갈될 수 있습니다. 대신 실패한 작업을 감사할 때 다음을 수행합니다.

  • 인스턴스 수준에서 액세스를 제어합니다.
  • 실패한 작업 로그의 이상 증가에 대한 모니터링 또는 알림 시스템을 설정합니다.

감사 규칙

데이터베이스 인스턴스당 감사 규칙 조합을 총 1,000개까지 만들 수 없습니다. 감사 규칙 조합은 고유한 사용자, 데이터베이스, 객체, 작업 집합입니다. 예를 들어 user1,user2, db1,db2, table1,table2, select,delete를 감사하는 감사 규칙은 2 x 2 x 2 x 2 = 16개 조합을 생성합니다. 총 감사 규칙 조합 수가 1,000개를 초과하면 감사 규칙 만들기 또는 업데이트가 실패합니다.

지원되지 않는 작업

현재 다음 작업은 지원되지 않습니다.

  • 설명된 대로 사용하는 경우 다음 함수가 지원되지 않습니다.

    • UNION, INTERSECT, WHERE 절, 중첩 쿼리, 하위 쿼리 등을 포함하는 SELECT 쿼리 안에 사용
    • UPDATE, DELETE, INSERT, REPLACE 문에 사용

    예를 들어 func1 객체를 감사하는 감사 규칙이 있다면 다음 항목이 감사되지 않습니다.

    • SELECT func1() FROM table;
    • SELECT * FROM table WHERE a = func1();
    • SELECT func1() != 0;
    • SELECT func1() > 0;
    • SET @x = func1();

    연산자가 없고 WHERE 절 없이 SELECT에서 직접 호출된 함수는 감사됩니다.

    • SELECT func1();
    • SELECT db.func1();
  • 현재는 IP 주소를 기준으로 한 필터링이 지원되지 않습니다.

다음 단계