Azure Database for MySQL - 유연한 서버에서 감사 로그를 사용하여 데이터베이스 작업 추적

적용 대상: Azure Database for MySQL - 유연한 서버

Azure Database for MySQL 유연한 서버는 사용자에게 감사 로그를 구성할 수 있는 기능을 제공합니다. 감사 로그는 연결, 관리, DDL 및 DML 이벤트를 비롯한 데이터베이스 수준 활동을 추적하는 데 사용할 수 있습니다. 이러한 유형의 로그는 일반적으로 규정 준수를 위해 사용됩니다.

감사 로깅 구성

Important

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

기본적으로 감사 로그는 사용하도록 설정되어 있지 않습니다. 감사 로깅을 사용하도록 설정하려면 audit_log_enabled 서버 매개 변수를 ON으로 설정합니다. 이 작업은 Azure Portal 또는 Azure CLI를 사용하여 수행할 수 있습니다.

감사 로깅 동작을 제어하기 위해 조정할 수 있는 다른 매개 변수는 다음과 같습니다.

  • audit_log_events: 이벤트가 기록되도록 제어합니다. 특정 감사 이벤트는 아래 표를 참조하세요.
  • audit_log_include_users: 로깅에 포함할 MySQL 사용자입니다. 이 매개 변수의 기본값은 비어 있으며, 로깅에 모든 사용자가 포함됩니다. 이는 audit_log_exclude_users보다 우선 순위가 높습니다. 매개 변수의 최대 길이는 512자입니다. 예를 들어 wild카드 값 dev* 에는 "dev1,dev_user,dev_2"과 같은 키워드(keyword) dev 시작하는 항목이 있는 모든 사용자가 포함됩니다. 사용자를 포함하기 위한 야생카드 항목의 또 다른 예는 *dev 이 예제에 있습니다. "stage_dev,prod_dev,user_dev"와 같은 값 "dev"로 끝나는 모든 사용자가 감사 로그 항목에 포함됩니다. 또한 물음표를 (?) 와일드 카드 문자로 사용하는 것은 패턴에서 허용됩니다.
  • audit_log_exclude_users: 로깅에서 제외할 MySQL 사용자입니다. 매개 변수의 최대 길이는 512자입니다. 사용자에 대한 wild카드 항목도 감사 로그에서 사용자를 제외하도록 허용됩니다. 예를 들어 wild카드 값 stage* 은 "stage1,stage_user,stage_2"과 같은 키워드(keyword) stage 시작하는 항목이 있는 모든 사용자를 제외합니다. 사용자를 제외하기 위한 wild카드 항목의 또 다른 예는 *com 이 예제에서 값 com 으로 끝나는 모든 사용자가 감사 로그 항목에서 제외됩니다. 또한 물음표를 (?) 와일드 카드 문자로 사용하는 것은 패턴에서 허용됩니다.

참고 항목

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

이벤트 설명
CONNECTION - 커넥트ion 시작
- 연결 종료
CONNECTION_V2 - 커넥트온 시작(성공 또는 실패한 시도 오류 코드)
- 연결 종료
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 - SELECT 또는 INSERT INTO ... SELECT와 같은 테이블 읽기 문
- DELETE 또는 TRUNCATE TABLE과 같은 테이블 삭제 문
- INSERT 또는 REPLACE와 같은 테이블 삽입 문
- UPDATE와 같은 테이블 업데이트 문

감사 로그 액세스

감사 로그는 Azure Monitor 진단 설정과 통합됩니다. 유연한 서버에서 감사 로그를 사용하도록 설정하면 Azure Monitor 로그, Azure 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, , DISCONNECTCHANGE USER
connection_id_d MySQL에 의해 생성된 고유 연결 ID
host_s 빈 템플릿
ip_s MySQL에 연결하는 클라이언트의 IP 주소
user_s 쿼리를 실행하는 사용자의 이름
db_s 연결 대상 데이터베이스의 이름
\_ResourceId 리소스 URI
status_d 커넥트ion CONNECTIONS_V2 이벤트에 대한 오류 코드 항목입니다.

일반

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

참고 항목

sql_text_s의 경우 로그가 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

테이블 액세스

참고 항목

sql_text_s의 경우 로그가 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 Resource  == '<your server name>' //Server name must be in Upper case
    | where Category == 'MySqlAuditLogs' and event_class_s == "general_log"
    | project TimeGenerated, Resource, event_class_s, event_subclass_s, event_time_t, user_s , ip_s , sql_text_s
    | order by TimeGenerated asc nulls last
    
  • 특정 서버 status_d 의 CONNECTION_V2 이벤트를 나열합니다. 열은 연결하는 동안 클라이언트 애플리케이션이 직면한 클라이언트 연결 오류 코드를 표시합니다.

    AzureDiagnostics
    | where Resource  == '<your server name>' //Server name must be in Upper case
    | where Category == 'MySqlAuditLogs' and event_subclass_s == "CONNECT"
    | project TimeGenerated, Resource, event_class_s, event_subclass_s, user_s, ip_s, status_d
    | order by TimeGenerated asc nulls last
    
  • 특정 서버에 대한 CONNECTION 이벤트 나열

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

    AzureDiagnostics
    | where Resource  == '<your server name>' //Server name must be in Upper case
    | where Category == 'MySqlAuditLogs'
    | project TimeGenerated, Resource, 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 Resource  == '<your server name>' //Server name must be in Upper case
    | where Category == 'MySqlAuditLogs'
    | project TimeGenerated, Resource, event_class_s, event_subclass_s, event_time_t, user_s , ip_s , sql_text_s
    | summarize count() by Resource, bin(TimeGenerated, 5m)
    | render timechart
    
  • 감사 로그에 진단 로그를 사용하도록 설정하여 모든 Azure Database for MySQL 유연한 서버 인스턴스에서 감사된 이벤트 나열

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

다음 단계