Azure Database for MySQL의 감사 로그

적용 대상: Azure Database for MySQL - 단일 서버

Important

Azure Database for MySQL 단일 서버는 사용 중지 경로에 있습니다. Azure Database for MySQL 유연한 서버로 업그레이드하는 것이 좋습니다. Azure Database for MySQL 유연한 서버로 마이그레이션하는 방법에 대한 자세한 내용은 Azure Database for MySQL 단일 서버에 대한 새로운 소식을 참조하세요.

Azure Database for MySQL에서는 사용자에게 감사 로그를 제공합니다. 감사 로그는 데이터베이스 수준 작업을 추적하는 데 사용할 수 있으며, 일반적으로 규정 준수에 사용됩니다.

감사 로깅 구성

Important

서버 성능이 크게 영향을 받지 않고 최소한의 데이터가 수집되도록 하려면 감사 목적에 필요한 이벤트 형식 및 사용자만 기록하는 것이 좋습니다.

기본값으로 감사 로그는 비활성화됩니다. 사용하려면 audit_log_enabled을 ON으로 설정합니다.

조정할 수 있는 다른 매개 변수는 다음과 같습니다.

  • audit_log_events: 이벤트가 기록되도록 제어합니다. 특정 감사 이벤트는 아래 표를 참조하세요.
  • audit_log_include_users: 로깅에 포함할 MySQL 사용자입니다. 이 매개 변수의 기본값은 비어 있으며, 로깅에 모든 사용자가 포함됩니다. 이는 audit_log_exclude_users보다 우선 순위가 높습니다. 매개 변수의 최대 길이는 512자입니다.
  • audit_log_exclude_users: 로깅에서 제외할 MySQL 사용자입니다. 매개 변수의 최대 길이는 512자입니다.

참고 항목

audit_log_include_usersaudit_log_exclude_users보다 우선 순위가 높습니다. 예를 들어 audit_log_include_users = demouseraudit_log_exclude_users = demouser인 경우 audit_log_include_users 의 우선 순위가 높으므로 사용자가 감사 로그에 포함됩니다.

이벤트 설명
CONNECTION - 연결 시작(성공 또는 실패)
- 사용자가 세션 중에 다른 사용자/암호를 사용하여 다시 인증
- 연결 종료
DML_SELECT SELECT 쿼리
DML_NONSELECT INSERT/DELETE/UPDATE 쿼리
DML DML = DML_SELECT + DML_NONSELECT
DDL “DROP DATABASE”와 같은 쿼리
DCL “GRANT PERMISSION”과 같은 쿼리
ADMIN “SHOW STATUS”와 같은 쿼리
GENERAL DML_SELECT, DML_NONSELECT, DML, DDL, DCL 및 ADMIN의 모든 항목
TABLE_ACCESS - MySQL 5.7 및 MySQL 8.0에서 사용 가능
- 테이블 읽기(예: SELECT 또는 INSERT INTO ...) SELECT
- DELETE 또는 TRUNCATE TABLE과 같은 테이블 삭제 문
- INSERT 또는 REPLACE와 같은 테이블 삽입 문
- UPDATE와 같은 테이블 업데이트 문

감사 로그 액세스

감사 로그는 Azure Monitor 진단 로그와 통합됩니다. MySQL 서버에서 감사 로그를 사용하도록 설정하면 Azure Monitor 로그, Event Hubs 또는 Azure Storage로 감사 로그를 내보낼 수 있습니다. Azure Portal에서 진단 로그를 사용하도록 설정하는 방법에 대한 자세한 내용은 감사 로그 포털 문서를 참조하세요.

참고 항목

진단 및 설정을 통해 Azure Storage로 로그를 보내는 경우 Premium Storage 계정이 지원되지 않습니다.

진단 로그 스키마

다음 섹션에서는 이벤트 유형을 기반으로 하는 MySQL 감사 로그로 출력되는 것을 설명합니다. 포함되는 필드와 이러한 필드가 표시되는 순서는 출력 방법에 따라 달라질 수 있습니다.

Connection

속성 설명
TenantId 테넌트 ID
SourceSystem Azure
TimeGenerated [UTC] UTC에 로그가 기록된 때의 타임스탬프
Type 로그의 형식 항상 AzureDiagnostics입니다.
SubscriptionId 서버가 속한 구독의 GUID
ResourceGroup 서버가 속한 리소스 그룹의 이름
ResourceProvider 리소스 공급자의 이름. 항상 MICROSOFT.DBFORMYSQL입니다.
ResourceType Servers
ResourceId 리소스 URI
Resource 서버의 이름
Category MySqlAuditLogs
OperationName LogEvent
LogicalServerName_s 서버의 이름
event_class_s connection_log
event_subclass_s CONNECT, DISCONNECT, CHANGE USER(MySQL 5.7에서만 사용 가능)
connection_id_d MySQL에 의해 생성된 고유 연결 ID
host_s 빈 템플릿
ip_s MySQL에 연결하는 클라이언트의 IP 주소
user_s 쿼리를 실행하는 사용자의 이름
db_s 연결 대상 데이터베이스의 이름
\_ResourceId 리소스 URI

일반

아래 스키마는 GENERAL, DML_SELECT, DML_NONSELECT, DML, DDL, DCL 및 ADMIN 이벤트 유형에 적용됩니다.

참고 항목

sql_text의 경우 로그가 2048자를 초과하면 잘립니다.

속성 설명
TenantId 테넌트 ID
SourceSystem Azure
TimeGenerated [UTC] UTC에 로그가 기록된 때의 타임스탬프
Type 로그의 형식 항상 AzureDiagnostics입니다.
SubscriptionId 서버가 속한 구독의 GUID
ResourceGroup 서버가 속한 리소스 그룹의 이름
ResourceProvider 리소스 공급자의 이름. 항상 MICROSOFT.DBFORMYSQL입니다.
ResourceType Servers
ResourceId 리소스 URI
Resource 서버의 이름
Category MySqlAuditLogs
OperationName LogEvent
LogicalServerName_s 서버의 이름
event_class_s general_log
event_subclass_s LOG, ERROR, RESULT(MySQL 5.6에서만 사용 가능)
event_time 쿼리 시작 시간(UTC 타임스탬프 기준)
error_code_d 쿼리가 실패한 경우의 오류 코드. 0 은 오류가 없음을 의미합니다.
thread_id_d 쿼리를 실행한 스레드의 ID
host_s 빈 템플릿
ip_s MySQL에 연결하는 클라이언트의 IP 주소
user_s 쿼리를 실행하는 사용자의 이름
sql_text_s 전체 쿼리 텍스트
\_ResourceId 리소스 URI

테이블 액세스

참고 항목

테이블 액세스 로그는 MySQL 5.7에 대해서만 출력됩니다.
sql_text의 경우 로그가 2048자를 초과하면 잘립니다.

속성 설명
TenantId 테넌트 ID
SourceSystem Azure
TimeGenerated [UTC] UTC에 로그가 기록된 때의 타임스탬프
Type 로그의 형식 항상 AzureDiagnostics입니다.
SubscriptionId 서버가 속한 구독의 GUID
ResourceGroup 서버가 속한 리소스 그룹의 이름
ResourceProvider 리소스 공급자의 이름. 항상 MICROSOFT.DBFORMYSQL입니다.
ResourceType Servers
ResourceId 리소스 URI
Resource 서버의 이름
Category MySqlAuditLogs
OperationName LogEvent
LogicalServerName_s 서버의 이름
event_class_s table_access_log
event_subclass_s READ, INSERT, UPDATE 또는 DELETE
connection_id_d MySQL에 의해 생성된 고유 연결 ID
db_s 액세스된 데이터베이스의 이름
table_s 액세스된 테이블의 이름
sql_text_s 전체 쿼리 텍스트
\_ResourceId 리소스 URI

Azure Monitor 로그에서 로그 분석

감사 로그가 진단 로그를 통해 Azure Monitor 로그로 파이프되면 감사된 이벤트에 대한 추가 분석을 수행할 수 있습니다. 다음은 시작하는 데 도움이 되는 몇 가지 샘플 쿼리입니다. 아래를 서버 이름으로 업데이트해야 합니다.

  • 특정 서버에 대한 GENERAL 이벤트 나열

    AzureDiagnostics
    | where LogicalServerName_s == '<your server name>'
    | where Category == 'MySqlAuditLogs' and event_class_s == "general_log"
    | project TimeGenerated, LogicalServerName_s, event_class_s, event_subclass_s, event_time_t, user_s , ip_s , sql_text_s 
    | order by TimeGenerated asc nulls last 
    
  • 특정 서버에 대한 CONNECTION 이벤트 나열

    AzureDiagnostics
    | where LogicalServerName_s == '<your server name>'
    | where Category == 'MySqlAuditLogs' and event_class_s == "connection_log"
    | project TimeGenerated, LogicalServerName_s, event_class_s, event_subclass_s, event_time_t, user_s , ip_s , sql_text_s 
    | order by TimeGenerated asc nulls last
    
  • 특정 서버에서 감사된 이벤트 요약

    AzureDiagnostics
    | where LogicalServerName_s == '<your server name>'
    | where Category == 'MySqlAuditLogs'
    | project TimeGenerated, LogicalServerName_s, event_class_s, event_subclass_s, event_time_t, user_s , ip_s , sql_text_s 
    | summarize count() by event_class_s, event_subclass_s, user_s, ip_s
    
  • 특정 서버의 감사 이벤트 유형 분포 그래프 작성

    AzureDiagnostics
    | where LogicalServerName_s == '<your server name>'
    | where Category == 'MySqlAuditLogs'
    | project TimeGenerated, LogicalServerName_s, event_class_s, event_subclass_s, event_time_t, user_s , ip_s , sql_text_s 
    | summarize count() by LogicalServerName_s, bin(TimeGenerated, 5m)
    | render timechart 
    
  • 감사 로그를 사용하도록 설정된 진단 로그를 사용하는 모든 MySQL 서버에서 감사된 이벤트 나열

    AzureDiagnostics
    | where Category == 'MySqlAuditLogs'
    | project TimeGenerated, LogicalServerName_s, event_class_s, event_subclass_s, event_time_t, user_s , ip_s , sql_text_s 
    | order by TimeGenerated asc nulls last
    

다음 단계