본문 바로가기
데이터베이스/pg extension

pgAudit

by 열정주니어 2023. 8. 2.
반응형

pgAudit

  • PostgreSQL Audit Extension(pgAudit)은 standard PostgreSQL 로깅 기능을 통해 자세한 세션 및/또는 객체 감사 로깅을 제공

표준 로깅

  • 표준 로깅 기능은 사용자가 요청한 내용을 표시
    • 기본 명령문 로깅은 log_statement = all인 표준 로깅 기능으로 제공
    • 기본 로깅은 모니터링 및 기타 용도에 허용되지만 일반적으로 감사에 필요한 세부 수준을 제공하지 않음
    • 감사 로깅은 데이터베이스에 대해 수행된 모든 작업 목록을 갖는 것만으로는 충분하지 않고, 감사인이 관심을 가질 특정 진술을 찾는 것이 가능해야 함

pgAudit

  • pgAudit은 데이터베이스가 요청을 만족하는 동안 발생한 세부 정보에 중점을 둠
    • pgAudit의 목표:  PostgreSQL 사용자에게 정부, 금융 또는 ISO 인증을 준수하는 데 종종 필요한 감사 로그를 생성하는 기능을 제공하는 것
    • 감사는 일반적으로 독립 기관에서 개인 또는 조직의 계정을 공식적으로 검사하는 것으로, pgAudit에서 수집한 정보를 감사 추적 또는 감사 로그라고 함

 

pgAudit Example

  • 감사자는 문서화된 유지 관리 기간 내에 특정 테이블이 생성되었는지 확인하고자 함(의도적으로 난독화된 예제)

표준로깅

  • 테이블이 동적으로 생성되는 경우 관심 있는 테이블을 찾으려면 코드에 대한 지식 필요
  • 테이블 이름만 검색하는 것이 더 좋기 때문에 이상적이지 않음
  • pgAudit은 동일한 입력에 대해 로그를 다음과 같이 생성

pgAudit

  • DO 블록 뿐만 아니라 하위 명령문에는 명령문 유형, 객체 유형 및 완전한 이름이 포함된 CREATE TABLE의 전체 텍스트가 포함되어 검색을 쉽게 함
    • SELECT 및 DML 문을 기록할 때 문에서 참조되는 각 관계에 대해 별도의 항목을 기록하도록 pgAudit를 구성할 수 있음
    • 특정 테이블과 관련된 모든 명령문을 찾기 위해 구문 분석이 필요하지 않음
  •  목표는 명령문 텍스트가 주로 심층 포렌식을 위해 제공되며 감사에 필요하지 않아야 한다는 것

 

Format

  • 감사 항목은 표준 로깅 기능에 기록되며 쉼표로 구분된 형식으로 다음 열을 포함
    • 출력은 각 로그 항목의 로그 줄 접두사 부분이 제거된 경우에만 규격 CSV 형식

  • 감사 로그 요구 사항을 충족하는데 필요한 다른 필드를 추가하려면 log_line_prefix를 사용
  • 일반적인 log line prefix는 각 감사 로그에 대한 날짜/시간, 사용자 이름, 데이터베이스 이름 및 프로세스 ID를 제공하는 '%m %u %d [%p]: 일 수 있음

 

Settings

  • 설정은 수퍼유저만 수정할 수 있음
    • 일반 사용자가 설정을 변경하도록 허용하면 감사 로그의 포인트가 무효화됨
  • 설정은 전역적(postgresql.conf 또는 ‘ALTER SYSTEM ... SET’ 사용), 데이터베이스 수준(ALTER DATABASE ... SET 사용) 또는 역할 수준(ALTER ROLE ... SET 사용)에서 지정할 수 있음
    • 설정은 일반적인 역할 상속을 통해 상속되지 않으며 SET ROLE은 사용자의 pgAudit 설정을 변경하지 않음
    • 이것은 역할 시스템의 제한 사항이며 pgAudit 고유의 것이 아님
  • pgAudit 확장은 shared_preload_libraries에 로드되어야 하며, 그렇지 않으면 로드 시 오류가 발생하고 감사 로깅이 발생하지 않음
  • 적절한 pgaudit 기능을 보장하려면 pgaudit.log가 설정되기 전에 CREATE EXTENSION pgaudit를 호출해야 함
    • 확장 프로그램은 DDL에 대한 추가 감사를 추가하는 이벤트 트리거를 설치함
    • 따라서, pgAudit은 확장이 설치되지 않은 상태에서 작동하지만 DDL 문에는 개체 유형 및 이름에 대한 정보가 없을 수 있음
  • pgaudit 확장을 삭제하고 다시 만들어야 하는 경우 pgaudit.log를 먼저 설정 해제해야 하며, 그렇지 않으면 오류가 발생함

 

Session Audit Logging

  • 세션 감사 로깅은 백엔드에서 사용자가 실행한 모든 명령문에 대한 자세한 로그를 제공

구성

  • 세션 로깅은 pgaudit.log 설정으로 활성화됨

  • 모든 DML 및 DDL에 대한 세션 로깅을 활성화하고 DML 문의 모든 테이블을 기록

  • MISC를 제외한 모든 명령에 대해 세션 로깅을 활성화하고 감사 로그 메시지를 NOTICE로 표시

Example

  • 예에서 세션 감사 로깅은 DDL 및 SELECT 문 로깅에 사용됨
  • WRITE 클래스가 활성화되지 않았기 때문에 삽입 문은 기록되지 않음

 

Object Audit Logging

  • 객체 감사 로깅은 특정 테이블에 영향을 주는 문을 기록하는 것으로 SELECT, INSERT, UPDATE 및 DELETE 명령만 지원되며 TRUNCATE는 객체 감사 로깅에 포함되지 않음
  • 객체 감사 로깅은 pgaudit.log = 'read, write'를 보다 세분화하여 대체하기 위한 것
    • 세션 로깅을 사용하여 각 명령문을 캡처한 다음 특정 테이블에 대한 자세한 정보를 얻기 위해 객체 로깅으로 이를 보완하는 방식으로 사용 가능

구성

  • 객체 수준 감사 로깅은 역할 시스템을 통해 구현됨
    • pgaudit.role 설정은 감사 로깅에 사용될 역할을 정의함
    • 테이블(TABLE, VIEW 등)은 감사 역할이 실행된 명령에 대한 권한이 있거나 다른 역할에서 권한을 상속할 때 감사 기록됨
    • 이를 통해 모든 컨텍스트에 단일 마스터 역할이 있더라도 효과적으로 여러 감사 역할을 가질 수 있음

  • pgaudit.role을 감사자로 설정하고 계정 테이블에 대한 SELECT 및 DELETE 권한을 부여하면 계정 테이블의 모든 SELECT 또는 DELETE 문이 기록됨

Example

  • 예에서 객체 감사 로깅은 SELECT 및 DML 문의 로깅에 대해 세분화된 접근 방식을 취하는 방법을 설명하는 데 사용됨
  • account_role_map 테이블에 대한 로깅은 테이블 수준인 반면 계정 테이블에 대한 로깅은 열 수준 권한에 의해 제어 됨

 

고려사항 및 주의 사항

사용 고려 사항

1. 설정에 따라 pgAudit이 엄청난 양의 로깅을 생성할 수 있음

- 과도한 로깅을 방지하려면 환경에서 감사 로깅이 필요한 항목을 정확히 결정해야 함

- 로그 파일은 텍스트로 표현되기 때문에 로그 파일의 크기는 삽입의 실제 데이터 크기의 몇 배일 가능성이 높음

 

2. 로그는 일반적으로 OS와 함께 저장되기 때문에 이로 인해 디스크 공간이 매우 빠르게 소모될 수 있음

 

3. 감사 로깅을 특정 테이블로 제한할 수 없는 경우, 테스트 동안 성능 영향을 평가하고 로그 볼륨에 충분한 공간을 할당해야 함

- 삽입 볼륨이 높지 않더라도 감사 로깅의 성능 영향은 여전히 대기 시간에 눈에 띄게 영향을 미칠 수 있음

 

4. SELECT 및 DML 문에 대해 기록되는 관계 감사의 수를 제한하려면 객체 감사 로깅 사용을 고려

- 객체 감사 로깅을 사용하면 기록할 관계를 선택하여 전체 로그 볼륨을 줄일 수 있음

- 그러나 새 관계가 추가되면 개체 감사 로깅에 명시적으로 추가되어야 함

- 이 경우 지정된 테이블이 로깅에서 제외되고 다른 모든 테이블이 포함되는 프로그래밍 방식 솔루션이 좋은 옵션이 될 수 있음

 

주의 사항

1. 객체 이름 변경시 객체 이름은변경된 이름으로 기록됨

 

2. 명령이 두 번 이상 기록될 수 있음

- ex) 지정된 기본 키를 사용하여 테이블을 생성하면 기본 키에 대한 인덱스가 독립적으로 기록되고 생성 항목 아래 인덱스에 대해 다른 감사 로그가 생성됨

 

3. Autovacuum 및 Autoanalyze는 기록되지 않음

 

4. 트랜잭션이 중단된 상태에 들어간 후 실행되는 명령문은 감사 로그에 기록되지 않음

- 오류를 일으킨 문과 중단된 트랜잭션에서 실행된 후속 문은 표준 로깅 기능에 의해 ERROR로 기록됨

 

5. pgAudit을 사용하여 수퍼유저를 안정적으로 감사할 수 없음

- 해결책은 수퍼유저 계정에 대한 액세스를 제한하고 필요한 경우 set_user 확장을 사용하여 권한을 에스컬레이션하는 것

 

Reference

https://github.com/pgaudit/pgaudit#session-audit-logging

 

GitHub - pgaudit/pgaudit: PostgreSQL Audit Extension

PostgreSQL Audit Extension. Contribute to pgaudit/pgaudit development by creating an account on GitHub.

github.com

 

반응형