2023

ProxySQL - Audit log (감사 로그)

운좋은하루 2023. 1. 17. 10:47
728x90
반응형

개요

감사 로그는 버전 2.0.5부터 ProxySQL에 도입되었습니다.

이 기능을 사용하면 특정 연결 활동을 추적할 수 있습니다. ProxySQL은 종종 전체 데이터베이스 인프라에 대한 단일 액세스 지점으로 사용되기 때문에 ProxySQL에 대한 액세스 및 ProxySQL 자체 뒤의 데이터베이스 설정을 모니터링하는 것이 종종 매우 중요합니다. ProxySQL 감사 로그는 이 요구 사항을 정확하게 해결합니다.

mysql-auditlog_filename이 기능을 활성화하려면 로깅이 수행될 파일을 지정하도록 변수 를 구성해야 합니다. 이 변수의 기본값은 빈 문자열입니다. 기본적으로 로깅이 활성화되지 않습니다.

활성화되면 다음 이벤트가 기록됩니다.

  • MySQL 모듈에서:
    • 성공적인 인증
    • 인증 실패
    • 우아한 연결 끊기
    • 닫힌 연결
    • 스키마 변경(COM_INIT_DB)
  • 관리 모듈에서:
    • 성공적인 인증
    • 인증 실패
    • 우아한 연결 끊기
    • 닫힌 연결

향후 추가 확장이 예상됩니다. 구체적으로 다음과 같습니다.

  • MySQL 모듈에서 사용자(COM_CHANGE_USER) 변경 지원
  • SQLite3 서버 모듈의 이벤트 지원
  • ClickHouse Module의 이벤트 지원

변수

  • mysql-auditlog_filename: 이 변수는 감사 이벤트가 기록되는 감사 로그의 기본 이름을 정의합니다. 로그 파일의 파일 이름은 기본 이름 뒤에 8자리 진행형 숫자가 붙습니다. 기본값은 빈 문자열(")입니다.
  • mysql-auditlog_filesize: 이 변수는 현재 파일이 닫히고 새 파일이 생성될 때 감사 로그의 최대 파일 크기를 정의합니다. 기본값은 104857600(100MB)입니다.

로깅 형식

현재 구현은 JSON이라는 하나의 로깅 형식만 지원합니다.

속성:

  • client_addr: ProxySQL에 접속하는 클라이언트의 주소(IP:port)
  • proxy_addr: ProxySQL이 수신 대기 중인 바인드 인터페이스의 주소(IP:포트)(MySQL 모듈에서만 사용 가능)
  • event: 이벤트 유형. 현재 가능한 값:
    • MySQL_Client_Connect_OK: MySQL 모듈에 성공적으로 연결
    • MySQL_Client_Connect_ERR: MySQL 모듈에 대한 연결 실패
    • MySQL_Client_Close: MySQL 세션이 닫히는 중
    • MySQL_Client_Quit: 명시 COM_QUIT적을 MySQL 모듈로 보내는 클라이언트
    • MySQL_Client_Init_DB: 명시 COM_INIT_DB적을 MySQL 모듈로 보내는 클라이언트
    • Admin_Connect_OK: Admin Module에 성공적으로 연결됨
    • Admin_Connect_ERR: Admin Module 연결 실패
    • Admin_Close: 관리 세션 종료 중
    • Admin_QuitCOM_QUIT: Admin Module 에 명시적을 보내는 클라이언트
  • time: 사람이 읽을 수 있는 이벤트 발생 시간(밀리초 단위)
  • timestamp: epoch 시간(밀리초)
  • ssl: SSL 사용 여부를 지정하는 부울 값
  • schemaname: 성공적으로 설정된 연결에 대한 현재 스키마
  • username: 클라이언트의 사용자 이름
  • thread_id: 클라이언트에 할당된 thread_id(세션 ID)
  • creation_time: 세션이 생성된 시점, 해당 세션이 종료된 경우에만 정보 제공
  • duration: 세션이 생성된 이후의 시간(밀리초), 세션이 종료된 경우에만 정보 제공
  • extra_info: 추가 정보를 제공하는 속성입니다. 현재 세션이 닫히는 코드 부분을 설명하는 데만 사용됩니다.

감사 로그 예

다음은 몇 가지 감사 로그 예입니다.

자세한 예 #1:

아래 위의 예에서 지정된 시간( "time":"2019-05-20 18:48:47.631","timestamp":1558342127631)에 클라이언트( )가 SSL( )을 사용하지 않고 사용자 이름 "admin"( )을 사용하여 "client_addr":"127.0.0.1:39954"관리자( )에 연결하지 못했습니다 . 연결 에 ( ) 의 내부가 지정되었습니다 ."event":"Admin_Connect_ERR""ssl":false"username":"admin"thread_id2"thread_id":2

{
 "client_addr":"127.0.0.1:39954",
 "event":"Admin_Connect_ERR",
 "schemaname":"",
 "ssl":false,
 "thread_id":2,
 "time":"2019-05-20 18:48:47.631",
 "timestamp":1558342127631,
 "username":"admin"
}

다음으로, 위에서 설명한 동일한 연결이 ( "event":"Admin_Close") 직후 에 연결이 끊어집니다( "duration":"0.000ms"). 추가 정보도 제공됩니다: "extra_info":"MySQL_Thread.cpp:2652:~MySQL_Thread()".

{
  "client_addr":"127.0.0.1:39954",
  "creation_time":"2019-05-20 18:48:47.631",
  "duration":"0.000ms",
  "event":"Admin_Close",
  "extra_info":"MySQL_Thread.cpp:2652:~MySQL_Thread()",
  "schemaname":"",
  "ssl":false,
  "thread_id":2,
  "time":"2019-05-20 18:48:47.631",
  "timestamp":1558342127631,
  "username":"admin"
}

자세한 예 #2:

다음 출력에서 ​​사용자 이름을 사용하여 SSL() 없이 "event":"Admin_Connect_OK"에서 관리 모듈() 에 성공적으로 로그인했음을 식별할 수 있습니다 ."client_addr":"127.0.0.1:43266""ssl":falseadmin

{
  "client_addr":"127.0.0.1:43266",
  "event":"Admin_Connect_OK",
  "schemaname":"main",
  "ssl":false,
  "thread_id":3,
  "time":"2019-05-20 19:16:53.313",
  "timestamp":1558343813313,
  "username":"admin"
}

다음으로 위에 나열된 클라이언트는 명시적으로 COM_QUIT명령( "event":"Admin_Quit")을 보냅니다.

{
  "client_addr":"127.0.0.1:43266",
  "event":"Admin_Quit",
  "schemaname":"main",
  "ssl":false,
  "thread_id":3,
  "time":"2019-05-20 19:16:56.513",
  "timestamp":1558343816513,
  "username":"admin"
}

마지막으로, 클라이언트 연결이 생성 "event":"Admin_Close"된 ~3.2초( ) 후에 위 클라이언트의 세션이 닫힙니다( )."duration":"3200.191ms"

{
  "client_addr":"127.0.0.1:43266",
  "creation_time":"2019-05-20 19:16:53.313",
  "duration":"3200.191ms", "event":"Admin_Close",
  "extra_info":"MySQL_Thread.cpp:2652:~MySQL_Thread()",
  "schemaname":"main",
  "ssl":false,
  "thread_id":3,
  "time":"2019-05-20 19:16:56.513",
  "timestamp":1558343816513,
  "username":"admin"
}

자세한 예 #3:

이 예에서 클라이언트( )는 SSL( ) 없이 지정된 바인드 인터페이스( )에서 "client_addr":"127.0.0.1:40822"MySQL 모듈( )에 성공적으로 연결합니다 . 사용자 이름( ) 및 스키마 이름( )이 기록됩니다."event":"MySQL_Client_Connect_OK""proxy_addr":"0.0.0.0:6033""ssl":false"username":"sbtest""schemaname":"mysql"

{
  "client_addr":"127.0.0.1:40822",
  "event":"MySQL_Client_Connect_OK",
  "proxy_addr":"0.0.0.0:6033",
  "schemaname":"mysql",
  "ssl":false,
  "thread_id":4,
  "time":"2019-05-20 19:20:26.668",
  "timestamp":1558344026668,
  "username":"sbtest"
}

몇 초 후 동일한 클라이언트가 ( )를 발행하고 스키마 이름 COM_INIT_DB( ) "event":"MySQL_Client_Init_DB"을 전환 "schemaname":"sbtest"합니다. 다음과 같이 기록됩니다.

{
  "client_addr":"127.0.0.1:40822",
  "event":"MySQL_Client_Init_DB",
  "proxy_addr":"0.0.0.0:6033",
  "schemaname":"sbtest",
  "ssl":false,
  "thread_id":4,
  "time":"2019-05-20 19:20:29.902",
  "timestamp":1558344029902,
  "username":"sbtest"
}

같은 예에서 클라이언트는 몇 초 후에 COM_QUIT( "event":"MySQL_Client_Quit")를 발행합니다. 다음과 같이 기록됩니다.

{
  "client_addr":"127.0.0.1:40822",
  "event":"MySQL_Client_Quit",
  "proxy_addr":"0.0.0.0:6033",
  "schemaname":"sbtest",
  "ssl":false,
  "thread_id":4,
  "time":"2019-05-20 19:20:35.759",
  "timestamp":1558344035759,
  "username":"sbtest"
}

마지막으로 proxysql "event":"MySQL_Client_Close"은 ~9초 동안 지속된 세션( )을 종료합니다( "duration":"9091.966ms").

{
  "client_addr":"127.0.0.1:40822",
  "creation_time":"2019-05-20 19:20:26.668",
  "duration":"9091.966ms",
  "event":"MySQL_Client_Close",
  "extra_info":"MySQL_Thread.cpp:3733:process_all_sessions()",
  "proxy_addr":"0.0.0.0:6033",
  "schemaname":"sbtest",
  "ssl":false,
  "thread_id":4,
  "time":"2019-05-20 19:20:35.760",
  "timestamp":1558344035760,
  "username":"sbtest"
}
728x90
반응형