본문 바로가기
서버구축 (WEB,DB)

MariaDB(MySQL)에 Audit Plugin 적용하는 방법

by 날으는물고기 2024. 7. 28.

MariaDB(MySQL)에 Audit Plugin 적용하는 방법

MySQL Security - MySQL Enterprise Audit

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 서버가 시작될 때 자동으로 로드되며, 지속적으로 유지됩니다.

각 설정의 설명

  1. server_audit_events
    • CONNECT: 사용자 연결 및 연결 해제 이벤트 기록.
    • QUERY_DDL: 데이터 정의 언어(DDL) 쿼리(예: CREATE, ALTER, DROP) 기록.
    • QUERY_DML: 데이터 조작 언어(DML) 쿼리(예: INSERT, UPDATE, DELETE) 기록.
  2. server_audit_file_path
    • 감사 로그 파일의 경로를 지정합니다.
  3. server_audit_file_rotate_size
    • 감사 로그 파일의 최대 크기를 지정합니다. 이 예에서는 30MB로 설정했습니다.
  4. server_audit_file_rotations
    • 최대 보관할 감사 로그 파일의 개수를 지정합니다. 이 예에서는 최대 45개의 파일을 보관합니다.
  5. server_audit_incl_users
    • 감사 로그에 포함할 사용자를 지정합니다. 여러 사용자를 지정하려면 쉼표로 구분합니다.
    • 예: server_audit_incl_users='user1,user2'
  6. server_audit_excl_users
    • 감사 로그에서 제외할 사용자를 지정합니다. 여러 사용자를 지정하려면 쉼표로 구분합니다.
    • 예: server_audit_excl_users='user3,user4'
  7. server_audit_logging
    • 감사 로깅을 활성화(1) 또는 비활성화(0)합니다.

5. 서비스 재시작

MariaDB 서비스를 재시작하여 설정을 적용합니다.

systemctl restart mariadb

6. 설정 확인

설정이 올바르게 적용되었는지 확인합니다.

SHOW VARIABLES LIKE 'server_audit%';

7. 로그 파일 위치 확인

감사 로그 파일이 저장될 디렉토리를 확인합니다.

SHOW GLOBAL VARIABLES LIKE 'datadir%';

보안 관점에서의 가이드 및 점검 포인트

  1. 로그 파일 권한 관리
    • 감사 로그 파일은 민감한 정보를 포함할 수 있으므로 접근 권한을 적절하게 설정하여 비인가자가 접근하지 못하도록 합니다.
    • 예: chmod 640 /var/lib/mysql/server_audit.log
  2. 로그 파일 저장 위치
    • 로그 파일이 저장될 디렉토리가 충분한 디스크 공간을 가지고 있는지 확인합니다.
    • 디스크 공간이 부족하면 서버 동작에 문제가 생길 수 있습니다.
  3. 로그 모니터링 및 분석
    • 정기적으로 감사 로그를 검토하여 비정상적인 활동이나 보안 위협을 탐지합니다.
    • 필요 시 자동화된 모니터링 도구를 활용하여 실시간으로 로그를 분석합니다.
  4. 로그 보관 및 삭제 정책
    • 로그 파일 회전 설정을 통해 오래된 로그 파일을 자동으로 삭제하고, 필요한 경우 보관 정책을 설정합니다.
    • 로그 파일 회전 설정이 적절한지 정기적으로 검토합니다.

이와 같이 설정하고 관리하면 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

  1. Percona 다운로드 페이지로 이동합니다.
  2. Percona Server for MySQL에서 Percona Server 8.0을 선택합니다.
  3. Select Product Version에서 PERCONA-SERVER-8.0.x을 선택합니다.
  4. 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';

이 명령어들은 즉시 적용되며, 서버 재시작 후에도 지속되지는 않습니다.

각 설정의 설명

  1. audit_log_file
    • 감사 로그 파일의 경로를 지정합니다.
  2. audit_log_rotate_on_size
    • 감사 로그 파일의 최대 크기를 지정합니다. 이 예에서는 30MB로 설정했습니다.
  3. audit_log_rotations
    • 최대 보관할 감사 로그 파일의 개수를 지정합니다. 이 예에서는 최대 45개의 파일을 보관합니다.
  4. audit_log_include_users
    • 감사 로그에 포함할 사용자를 지정합니다. 여러 사용자를 지정하려면 쉼표로 구분합니다.
    • 예: audit_log_include_users='user1,user2'
  5. audit_log_exclude_users
    • 감사 로그에서 제외할 사용자를 지정합니다. 여러 사용자를 지정하려면 쉼표로 구분합니다.
    • 예: audit_log_exclude_users='user3,user4'
  6. 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

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 플러그인을 사용하는 것도 고려해볼 수 있습니다.

728x90

댓글