6.3.12.4 감사 로그 플러그인의 로깅 제어
이 섹션에서는 audit_log
플러그인에서 로깅을 수행하는 방법 및 로깅 발생 방법을 제어하는 시스템 변수에 대해 설명합니다. 섹션 6.3.12.3 "감사 로그 파일" 에 설명 된 로그 파일 형식을 잘 알고있는 것이 전제가되고 있습니다.
감사 로그 플러그인은 로그 파일을 열면 XML 선언 및 시작 루트 요소 태그 <AUDIT>
을 쓸 필요가 있는지 여부를 확인하고 그 경우 그 태그를 씁니다. 감사 로그 플러그인이 종료하면 종료 태그 </AUDIT>
를 파일에 기록합니다.
로그 파일을 열 때 존재하면 플러그인 파일이 </AUDIT>
태그로 종료 여부를 확인하고 그 경우는 그것을 절단 한 다음 모든 <AUDIT_RECORD>
요소를 씁니다. 로그 파일이 존재하지만, </AUDIT>
태그에서 종료하지 않거나 </AUDIT>
태그를자를 수없는 경우 플러그인은 파일 형식을 부정하고, 초기화에 실패했다고 간주 합니다. 이것은 서버가 충돌 한 경우 나, 감사 로그 플러그인 실행 중에 강제 종료 된 경우에 발생할 수 있습니다. 로깅은 문제가 해결 될 때까지 발생하지 않습니다. 오류 로그를 확인하고 진단 정보를 확인하십시오.
[ERROR] Plugin 'audit_log'init function returned error.
이 문제를 해결하려면 잘못된 형식의 로그 파일을 삭제하거나 파일 이름을 변경 한 후 서버를 다시 시작해야합니다.
MySQL 서버는 클라이언트로부터 수신 된 SQL 문 실행이 완료 될 때 등 감사 가능한 이벤트가 발생할 때마다 감사 로그 플러그인을 호출하여 <AUDIT_RECORD>
요소를 씁니다. 일반적으로 서버 시작 후 처음으로 기록 된 <AUDIT_RECORD>
요소는 서버의 설명 및 부팅 옵션이 포함되어 있습니다. 그 나머지의 요소는 클라이언트 연결 및 분리 이벤트 SQL 문 실행 등의 이벤트를 나타냅니다. 최상위 문만이 기록 된 트리거 및 저장 프로 시저 등의 저장 프로그램에서 명령문의 로그가 기록되지 않습니다. LOAD DATA INFILE
과 같은 명령문에서 참조되는 파일의 내용은 기록되지 않습니다.
로깅의 발생 방법에 대한 제어를 허용하기 위해 audit_log
플러그인은 다음에 설명하는 같은 여러 시스템 변수가 준비되어 있습니다. 자세한 내용은 섹션 6.3.12.6 "감사 로그 플러그인 옵션 및 시스템 변수" 를 참조하십시오.
감사 로그 파일 이름 지정
감사 로그 파일 이름을 제어하려면 서버를 시작할 때 audit_log_file
시스템 변수를 설정합니다. 기본적으로 서버의 데이터 디렉토리의 audit.log
라고합니다. 보안상의 이유로 감사 로그 파일은 MySQL 서버 및 로그를 표시하는 정당한 이유를 가진 사용자 만 액세스 할 수있는 디렉토리에 저장해야합니다.
감사 로깅 전략
감사 플러그인은 로그 기록에 관한 여러 전략 중 하나를 사용할 수 있습니다. 전략을 지정하려면 서버를 시작할 때 audit_log_strategy
시스템 변수를 설정합니다. 기본적으로 전략 값은 ASYNCHRONOUS
이며, 플러그인은 비동기 적으로 로그 버퍼에 기록하고 버퍼가 꽉 차면 대기합니다. 파일 시스템 캐싱을 사용하거나 ( SEMISYNCHRONOUS
) 각 쓰기 요청 후에 sync()
를 호출하여 출력을 강제하면 ( SYNCHRONOUS
) 대기하지 않도록 ( PERFORMANCE
) 또는 동 기적으로 기록하기 같은 플러그인에 지시 할 수 있습니다.
비동기 로깅 전략에는 다음과 같은 특성이 있습니다.
서버의 성능과 확장성에 대한 영향을 최소화합니다.
가능한 한 최단 시간 (즉, 버퍼를 할당 시간과 버퍼에 이벤트를 복사하는 시간을 더한 시간)에서 감사 이벤트를 생성하는 스레드를 차단합니다.
출력은 버퍼에 기록됩니다. 별도의 스레드가 버퍼에서 로그 파일에 기록을 해결할 수 있습니다.
PERFORMANCE
전략의 단점은 버퍼가 가득 찬 경우 이벤트가 취소되는 점입니다. 부하가 높은 서버는 감사 로그에 이벤트가 누락 될 가능성이 높아집니다.
비동기 로깅을 사용하면 파일에 기록 문제가 발생했을 경우 나 플러그인이 정상적으로 종료되지 않는 경우 (예를 들어, 서버 호스트가 충돌 한 경우)에 로그 파일의 무결성이 위험에 노출 될 수 성이 있습니다. 이러한 위험을 줄이기 위해 동기화 로깅이 사용되도록 audit_log_strategy
을 설정합니다. 전략에 관계없이 로깅은 최선형 베이시스에서 발생하기 때문에 일관성이 보장되지 않습니다.
감사 로그 영역 관리
감사 로그 플러그인에 해당 로그 파일에 사용되는 공간을 관리 할 수있는 여러 시스템 변수가 준비되어 있습니다.
audit_log_buffer_size
: 비동기 기록을위한 버퍼 크기를 설정하려면이 변수를 서버 시작시에 설정합니다. 이 플러그인은 초기화시에 할당 종료시 삭제되는 단일 버퍼가 사용됩니다. 이 플러그인은 로깅이 비동기 경우에만이 버퍼를 할당합니다.audit_log_rotate_on_size
,audit_log_flush
:이 변수를 사용하여 감사 로그 파일 회전 및 플래시가 허용됩니다. 감사 로그 파일이 매우 커져 많은 양의 디스크 공간이 소모 될 수 있습니다. 사용되는 영역을 관리하려면 자동 로그 회전을 사용하거나 수동으로 감사 파일의 이름을 변경하고 로그를 플러시하여 새 파일을 엽니 다. 필요에 따라 이름이 변경된 파일을 삭제하거나 백업 할 수 있습니다.기본적으로
audit_log_rotate_on_size=0
이며, 로그 회전은 발생하지 않습니다. 이 경우audit_log_flush
값이 무효로부터 유효하게 변경되면 감사 로그 플러그인은 로그 파일을 닫았다가 다시 엽니 다. 로그 파일 이름의 변경은 서버 외부에서 실행해야합니다. 이름을audit.log.1
에서audit.log.3
에서 순환시키는 3 가지 최근의 로그 파일을 유지한다고 가정합니다. Unix에서 다음과 같이 수동으로 회전을 수행합니다.명령 행에서 현재 로그 파일 이름을 변경합니다.
shell>
mv audit.log.2 audit.log.3
shell>mv audit.log.1 audit.log.2
shell>mv audit.log audit.log.1
이 시점에서 플러그인은 이어
audit.log.1
에 이름이 변경된 현재 로그 파일에 기록합니다.서버에 연결하여 로그 파일을 플래시합니다. 그러면 플러그인은 로그 파일을 닫고 새
audit.log
파일 로그를 다시 엽니 다.mysql>
SET GLOBAL audit_log_flush = ON;
audit_log_rotate_on_size
가 0보다 큰 경우audit_log_flush
을 설정해도 효과가 없습니다. 이 경우 파일에 쓰기에 의해 그 크기가audit_log_rotate_on_size
값을 초과 할 때마다 감사 로그 플러그인은 로그 파일을 닫았다가 다시 엽니 다. 이 플러그인은 타임 스탬프 확장자가 추가되도록 원래의 파일 이름을 변경합니다. 예를 들어,audit.log
는audit.log.13440033615657730
라는 변경 될 수 있습니다. 마지막 7 자리는 소수입니다. 처음 10 자리는FROM_UNIXTIME()
함수를 사용하여 해석 할 수있는 Unix 타임 스탬프 값입니다.mysql>
SELECT FROM_UNIXTIME(1344003361);
+---------------------------+ | FROM_UNIXTIME(1344003361) | +---------------------------+ | 2012-08-03 09:16:01 | +---------------------------+
감사 로그 필터링
감사 로그 플러그인은 감사 이벤트를 필터링 할 수 있습니다. 그러면 이벤트의 발생원의 계정 및 이벤트 상태에 따라 감사 로그 파일에 이벤트를 기록할지 여부를 제어 할 수 있습니다. 상태 필터링은 연결 이벤트 및 문 이벤트에 대해 개별적으로 발생합니다.
계정 별 이벤트 필터링
MySQL 5.6.20 시점에서 발생원의 계정에 따라 감사 이벤트를 필터링하려면 서버 시작시 또는 실행시에 다음 시스템 변수 중 하나를 설정합니다.
audit_log_include_accounts
: 감사 기록에 포함 계정. 이 변수가 설정되어있는 경우 이러한 계정 만 감사합니다.audit_log_exclude_accounts
: 감사 로깅에서 제외 계정. 이 변수가 설정되어있는 경우 이러한 계정을 제외한 모든 감사됩니다.
하나의 변수의 값은 NULL
또는 쉼표로 구분 된 하나 이상의 계정 이름을 포함하는 문자열을 지정할 수 있습니다. 각각의 형식은
입니다. 기본적으로 두 변수가 user_name
@ host_name
NULL
되어 있습니다. 이 경우 계정의 필터링은 실행되지 않고 모든 계정에서 감사가 발생합니다.
예 : user1
과 user2
로컬 호스트의 계정에서만 감사 로깅을 활성화하려면 다음과 같이 audit_log_include_accounts
시스템 변수를 설정합니다.
SET GLOBAL audit_log_include_accounts = 'user1 @ localhost, user2 @ localhost';
동시에 NULL
이외로 설정할 수는 audit_log_include_accounts
과 audit_log_exclude_accounts
중 하나뿐입니다.
audit_log_include_accounts
을 설정하면 서버는audit_log_exclude_accounts
를NULL
로 설정합니다.audit_log_include_accounts
가NULL
이 아닌 경우를 제외하고audit_log_exclude_accounts
을 설정하려고하면 오류가 발생합니다. 이 경우 먼저audit_log_include_accounts
를NULL
로 설정하여 클리어해야합니다.
- This sets audit_log_exclude_accounts to NULL SET GLOBAL audit_log_include_accounts =value
; - This fails because audit_log_include_accounts is not NULL SET GLOBAL audit_log_exclude_accounts =value
; - To set audit_log_exclude_accounts, first set - audit_log_include_accounts to NULL SET GLOBAL audit_log_include_accounts = NULL; SET GLOBAL audit_log_exclude_accounts =value
;
하나의 변수의 값을 조사하려면 SHOW VARIABLES
로 NULL
이 빈 문자열로 표시되는 것에주의하십시오. 이 문제를 해결하려면 대신 SELECT
를 사용하십시오.
mysql>SHOW VARIABLES LIKE 'audit_log_include_accounts';
+----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | audit_log_include_accounts | | +----------------------------+-------+ mysql>SELECT @@audit_log_include_accounts;
+------------------------------+ | @@audit_log_include_accounts | +------------------------------+ | NULL | +------------------------------+
쉼표 나 공백 또는 기타 특수 문자가 포함되어 있기 때문에 사용자 이름과 호스트 이름을 따옴표로 묶어야 있으면 작은 따옴표를 사용하여 묶습니다. 변수의 값 자체가 작은 따옴표로 둘러싸여있는 경우, 내부의 각 작은 따옴표를 이중으로 입력하거나 백 슬래시를 사용하여 이스케이프합니다. 다음 문은 각각 로컬 root
계정 감사 로깅을 사용합니다. 따옴표 스타일이 다르지만 모두 동일합니다.
SET GLOBAL audit_log_include_accounts = 'root @ localhost'; SET GLOBAL audit_log_include_accounts = '' 'root'@ 'localhost' ''; SET GLOBAL audit_log_include_accounts = '\'root \ '@ \'localhost \ ''; SET GLOBAL audit_log_include_accounts = " 'root'@ 'localhost'";
ANSI_QUOTES
SQL 모드에서는 큰 따옴표는 문자열의 인용이 아닌 식별자 지수를 나타 내기 때문에이 모드가 활성화되어있는 경우에는 마지막 문이 작동하지 않습니다.
상태 별 이벤트 필터링
MySQL 5.6.20의 시점에서, 상태에 따라 감사 이벤트를 필터링하려면 서버 시작시 또는 실행시에 다음의 시스템 변수를 설정합니다.
audit_log_connection_policy
: 연결 이벤트의 로깅 정책입니다audit_log_statement_policy
: 문 이벤트 로깅 정책입니다
각 변수는 ALL
(관련된 모든 이벤트를 기록합니다. 이것이 기본값입니다) ERRORS
(실패한 이벤트 로그 만 기록합니다) 또는 NONE
(이벤트 로그를 기록하지 않습니다) 값이 지정됩니다. 예를 들어, 문 이벤트 로그는 모든 기록, 접속 로그 이벤트는 실패한 것만을 기록하려면 다음 설정을 사용합니다.
SET GLOBAL audit_log_statement_policy = ALL; SET GLOBAL audit_log_connection_policy = ERRORS;
MySQL 5.6.20 이전에는 audit_log_connection_policy
및 audit_log_statement_policy
을 사용할 수 없습니다. 대신 서버 시작시 또는 실행시 audit_log_policy
을 사용합니다. 여기에는 ALL
(모든 이벤트를 기록합니다. 이것이 기본값입니다) LOGINS
(연결 이벤트를 기록합니다) QUERIES
(문 이벤트를 기록합니다) 또는 NONE
(이벤트 로그를 기록하지 않습니다) 값이 지정됩니다. 이러한 값 중 하나를 지정해서 감사 로그 플러그인은 성공과 실패를 구분하지 않고 선택한 이벤트 로그를 기록합니다.
MySQL 5.6.20 시점에서 audit_log_policy
는 계속 사용 가능하지만, 서버가 시작될 때만 설정할 수 없습니다. 실행시 읽기 전용 변수입니다. 시작할 때 사용하면 다음과 같이 작동합니다.
audit_log_policy
을 설정하지 않거나 기본값ALL
로 설정 한 경우에도audit_log_connection_policy
또는audit_log_statement_policy
를 명시 적으로 설정하면 지정한대로 적용됩니다. 지정하지 않으면 기본값이ALL
로 설정됩니다.audit_log_policy
을ALL
이외의 값으로 설정하면 다음 표와 같이 그 값이 우선되어audit_log_connection_policy
및audit_log_statement_policy
을 설정하는 데 사용됩니다. 또한 이러한 변수 중 하나를 기본ALL
이외의 값으로 설정하는 경우, 서버는 그 값이 재정의되고 있음을 나타내는 메시지를 오류 로그에 기록합니다.시작 audit_log_policy 값 결과로 반환되는 audit_log_connection_policy 값 결과로 반환되는 audit_log_statement_policy 값 LOGINS
ALL
NONE
QUERIES
NONE
ALL
NONE
NONE
NONE
이벤트 필터링 보고서
다음 상태 변수의 값을 조사하면 필터링 결과를 확인할 수 있습니다.
Audit_log_events
: 필터링 정책에 따라 로그에 기록되었는지 여부에 관계없이 감사 로그 플러그인에 의해 처리 된 이벤트 수.Audit_log_events_filtered
: 필터링 정책에 따라 감사 로그 플러그인에 의해 필터링 된 (로그에 기록되지 않은) 이벤트의 수.Audit_log_events_written
: 감사 로그에 기록 된 이벤트의 수.
MySQL 5.6.20 시점에서는 이러한 변수를 사용할 수 있습니다.