MariaDB(MySQL)에 Audit Plugin 적용하는 방법
MariaDB에서 서버 감사 로그를 설정하여 내부 사용자 계정의 모든 쿼리 수행 내역을 기록하려면 다음 단계를 따라야 합니다. 여기에서는 server_audit
플러그인을 사용하여 쿼리 수행 내역을 기록하는 방법을 설명하겠습니다.
1. 플러그인 디렉토리 확인
MariaDB 서버의 플러그인 디렉토리를 확인합니다.
SHOW GLOBAL VARIABLES LIKE 'plugin_dir';
출력된 경로는 플러그인이 설치될 위치를 나타냅니다. 예: /usr/lib64/mysql/plugin/
2. MariaDB Audit Plugin 다운로드 및 설치
2.1 다운로드 및 설치
MariaDB Audit Plugin을 다운로드하고 플러그인 디렉토리에 복사합니다.
wget https://downloads.mariadb.com/Audit-Plugin/MariaDB-Audit-Plugin-MYSQL.tar.gz
tar -xvzf MariaDB-Audit-Plugin-MYSQL.tar.gz
sudo cp server_audit.so /usr/lib64/mysql/plugin/
2.2 플러그인 설치
MariaDB 셸에 접속하여 플러그인을 설치합니다.
mysql -u root -p
MariaDB 셸에서 다음 명령어를 실행합니다.
INSTALL PLUGIN server_audit SONAME 'server_audit.so';
3. 플러그인 설정
3.1 플러그인 설치 확인
플러그인이 성공적으로 설치되었는지 확인합니다.
SELECT * FROM information_schema.plugins WHERE plugin_name='server_audit';
3.2 감사 설정
다음 명령어들을 실행하여 감사 로그 설정을 MariaDB 서버에 실시간으로 적용합니다.
-- 감사 이벤트 설정
SET GLOBAL server_audit_events='CONNECT,QUERY_DDL,QUERY_DML';
-- 감사 로그 파일 경로 설정
SET GLOBAL server_audit_file_path='/var/lib/mysql/server_audit.log';
-- 감사 로그 파일 회전 크기 설정 (10MB)
SET GLOBAL server_audit_file_rotate_size=10000000;
-- 감사 로그 파일 회전 횟수 설정 (최대 30개 파일)
SET GLOBAL server_audit_file_rotations=30;
-- 감사 로그에 포함할 사용자 설정 (여러 사용자 포함)
SET GLOBAL server_audit_incl_users='user1,user2,user3';
-- 감사 로그에 제외할 사용자 설정 (루트 사용자 제외)
SET GLOBAL server_audit_excl_users='root';
-- 감사 로깅 활성화
SET GLOBAL server_audit_logging='on';
이 명령어들은 즉시 적용되며, 서버 재시작 후에도 지속되지는 않습니다.
4. my.cnf 설정
MariaDB 서버를 재시작한 후에도 감사 로그 설정을 유지하려면 my.cnf
파일에 다음 설정을 추가해야 합니다.
[mysqld]
# audit setting
plugin-load-add=server_audit=server_audit.so
server_audit_file_path=/var/lib/mysql/server_audit.log
server_audit=FORCE_PLUS_PERMANENT
server_audit_events=CONNECT,QUERY_DDL,QUERY_DML
server_audit_incl_users=user1,user2,user3
server_audit_file_rotate_size=10000000
server_audit_file_rotations=30
server_audit_logging=ON
server_audit_excl_users=root
이 설정들은 MariaDB 서버가 시작될 때 자동으로 로드되며, 지속적으로 유지됩니다.
각 설정의 설명
server_audit_events
CONNECT
: 사용자 연결 및 연결 해제 이벤트 기록.QUERY_DDL
: 데이터 정의 언어(DDL) 쿼리(예: CREATE, ALTER, DROP) 기록.QUERY_DML
: 데이터 조작 언어(DML) 쿼리(예: INSERT, UPDATE, DELETE) 기록.
server_audit_file_path
- 감사 로그 파일의 경로를 지정합니다.
server_audit_file_rotate_size
- 감사 로그 파일의 최대 크기를 지정합니다. 이 예에서는 30MB로 설정했습니다.
server_audit_file_rotations
- 최대 보관할 감사 로그 파일의 개수를 지정합니다. 이 예에서는 최대 45개의 파일을 보관합니다.
server_audit_incl_users
- 감사 로그에 포함할 사용자를 지정합니다. 여러 사용자를 지정하려면 쉼표로 구분합니다.
- 예:
server_audit_incl_users='user1,user2'
server_audit_excl_users
- 감사 로그에서 제외할 사용자를 지정합니다. 여러 사용자를 지정하려면 쉼표로 구분합니다.
- 예:
server_audit_excl_users='user3,user4'
server_audit_logging
- 감사 로깅을 활성화(1) 또는 비활성화(0)합니다.
5. 서비스 재시작
MariaDB 서비스를 재시작하여 설정을 적용합니다.
systemctl restart mariadb
6. 설정 확인
설정이 올바르게 적용되었는지 확인합니다.
SHOW VARIABLES LIKE 'server_audit%';
7. 로그 파일 위치 확인
감사 로그 파일이 저장될 디렉토리를 확인합니다.
SHOW GLOBAL VARIABLES LIKE 'datadir%';
보안 관점에서의 가이드 및 점검 포인트
- 로그 파일 권한 관리
- 감사 로그 파일은 민감한 정보를 포함할 수 있으므로 접근 권한을 적절하게 설정하여 비인가자가 접근하지 못하도록 합니다.
- 예:
chmod 640 /var/lib/mysql/server_audit.log
- 로그 파일 저장 위치
- 로그 파일이 저장될 디렉토리가 충분한 디스크 공간을 가지고 있는지 확인합니다.
- 디스크 공간이 부족하면 서버 동작에 문제가 생길 수 있습니다.
- 로그 모니터링 및 분석
- 정기적으로 감사 로그를 검토하여 비정상적인 활동이나 보안 위협을 탐지합니다.
- 필요 시 자동화된 모니터링 도구를 활용하여 실시간으로 로그를 분석합니다.
- 로그 보관 및 삭제 정책
- 로그 파일 회전 설정을 통해 오래된 로그 파일을 자동으로 삭제하고, 필요한 경우 보관 정책을 설정합니다.
- 로그 파일 회전 설정이 적절한지 정기적으로 검토합니다.
이와 같이 설정하고 관리하면 MariaDB에서 내부 사용자 계정의 모든 쿼리 수행 내역을 효과적으로 기록할 수 있습니다.
MySQL에서도 유사하게 내부 사용자 계정의 쿼리 수행 내역을 기록할 수 있습니다. MySQL에서는 audit_log
플러그인을 사용하여 이 작업을 수행할 수 있습니다. 다음은 MySQL에 audit_log
플러그인을 설정하고 사용자의 쿼리 수행 내역을 기록하는 방법에 대한 자세한 설명입니다.
1. MySQL 버전 확인
MySQL 버전을 확인합니다.
mysql --version
또는 MySQL에 접속하여 확인합니다.
SELECT version();
2. glibc 버전 확인
glibc 버전을 확인합니다.
ldd --version
3. 플러그인 디렉토리 확인
MySQL 플러그인이 설치될 디렉토리를 확인합니다.
SHOW VARIABLES LIKE 'plugin_dir';
4. Percona Server Audit Plugin
- Percona 다운로드 페이지로 이동합니다.
Percona Server for MySQL
에서Percona Server 8.0
을 선택합니다.Select Product Version
에서PERCONA-SERVER-8.0.x
을 선택합니다.Select Platform
에서LINUX-GENERIC
을 선택하고, 파일 링크를 복사합니다.
5. 서버에서 모듈 작업
5.1 파일 다운로드
작업 경로로 이동하여 복사한 링크로 서버에 다운로드합니다.
cd /home/_work/sample_directory
wget "https://downloads.percona.com/downloads/Percona-Server-8.0.x/binary/tarball/Percona-Server-8.0.x-Linux.x86_64.glibc2.x.tar.gz"
5.2 압축 해제
다운로드한 파일의 압축을 해제합니다.
tar zxvf Percona-Server-8.0.x-Linux.x86_64.glibc2.x.tar.gz
5.3 audit_log.so 파일 확인 및 복사
압축을 해제한 디렉토리에서 audit_log.so
파일을 확인합니다.
cd Percona-Server-8.0.x-Linux.x86_64.glibc2.x/lib/plugin
ls -al audit_log.so
플러그인 디렉토리로 audit_log.so
파일을 복사합니다.
cp audit_log.so /usr/lib64/mysql/plugin/
플러그인 로드 및 설정
실시간 적용
MySQL 서버에 실시간으로 적용할 수 있는 명령어는 다음과 같습니다.
-- 감사 플러그인 로드
INSTALL PLUGIN audit_log SONAME 'audit_log.so';
-- 감사 로그 파일 경로 설정
SET GLOBAL audit_log_file = '/var/log/mysql/audit.log';
-- 감사 로그 파일 회전 크기 설정 (10MB)
SET GLOBAL audit_log_rotate_on_size = 10000000;
-- 감사 로그 파일 회전 횟수 설정 (최대 30개 파일)
SET GLOBAL audit_log_rotations = 30;
-- 감사 로그에 포함할 사용자 설정 ('manager' 사용자만 포함)
SET GLOBAL audit_log_include_users = 'manager';
-- 감사 로그에 제외할 사용자 설정 (없음)
SET GLOBAL audit_log_exclude_users = '';
-- 감사 로깅 정책 설정
SET GLOBAL audit_log_policy = 'ALL';
이 명령어들은 즉시 적용되며, 서버 재시작 후에도 지속되지는 않습니다.
각 설정의 설명
audit_log_file
- 감사 로그 파일의 경로를 지정합니다.
audit_log_rotate_on_size
- 감사 로그 파일의 최대 크기를 지정합니다. 이 예에서는 30MB로 설정했습니다.
audit_log_rotations
- 최대 보관할 감사 로그 파일의 개수를 지정합니다. 이 예에서는 최대 45개의 파일을 보관합니다.
audit_log_include_users
- 감사 로그에 포함할 사용자를 지정합니다. 여러 사용자를 지정하려면 쉼표로 구분합니다.
- 예:
audit_log_include_users='user1,user2'
audit_log_exclude_users
- 감사 로그에서 제외할 사용자를 지정합니다. 여러 사용자를 지정하려면 쉼표로 구분합니다.
- 예:
audit_log_exclude_users='user3,user4'
audit_log_policy
- 감사 로깅 정책을 지정합니다. ALL, LOGINS, QUERIES, NONE 을 설정 할 수 있습니다.
각각의 값에 대한 내용은 아래와 같습니다.
ALL - all events will be logged
LOGINS - only logins will be logged
QUERIES - only queries will be logged
NONE - no events will be logged
- 감사 로깅 정책을 지정합니다. ALL, LOGINS, QUERIES, NONE 을 설정 할 수 있습니다.
my.cnf 설정
MySQL 서버를 재시작한 후에도 감사 로그 설정을 유지하려면 my.cnf
파일에 다음 설정을 추가해야 합니다.
[mysqld]
# audit
plugin-load-add = audit_log.so
audit_log_file = /var/lib/mysql/server_audit.log
audit_log_format = JSON
audit_log_include_accounts = 'manager@localhost'
audit_log_rotate_on_size = 10000000
audit_log_rotations = 30
audit_log_policy = ALL
이 설정들은 MySQL 서버가 시작될 때 자동으로 로드되며, 지속적으로 유지됩니다.
7. MySQL 서비스 재시작
MySQL 서비스를 재시작하여 설정을 적용합니다.
systemctl restart mysqld
8. DB에서 설정 확인
MySQL에 접속하여 설정이 올바르게 적용되었는지 확인합니다.
SHOW VARIABLES LIKE 'audit_log%';
임의의 명령어를 입력하여 로그 기록 여부를 확인합니다.
SELECT NOW();
9. 로그 확인
설정한 로그 파일 위치에서 로그를 확인합니다.
cat /var/lib/mysql/server_audit.log
이와 같이 설정하면 MySQL 8.0에서도 내부 사용자 계정의 모든 쿼리 수행 내역을 효과적으로 기록할 수 있습니다. 필요한 경우, MySQL Enterprise Edition 라이선스를 구입하여 Enterprise Audit 플러그인을 사용하는 것도 고려해볼 수 있습니다.