오디트 로깅

오디트 로깅 (Audit Logging)

Cassandra의 오디트 로깅은 Cassandra 노드에 들어오는 모든 CQL 명령 요청과 인증(성공/실패 로그인)을 기록해요. 현재 두 가지 구현이 제공됩니다. 커스텀 로거를 구현하고 cassandra.yaml 파일의 파라미터로 클래스 이름을 주입할 수 있어요.

  • BinAuditLogger: 이벤트를 바이너리 형식으로 파일에 기록하는 효율적인 방법(성능 측면에서 커뮤니티가 권장하는 로거)
  • FileAuditLogger: slf4j 로거를 사용해 이벤트를 audit/audit.log 파일에 기록

출처: 문서

본문

오디트 로깅이 캡처하는 것

오디트 로깅은 다음 이벤트를 캡처합니다:

  • 성공 및 실패한 로그인 시도
  • 네이티브 CQL 프로토콜을 통해 시도되거나 성공적으로 실행된 모든 데이터베이스 명령

제한 사항

Prepared statement를 실행하면 클라이언트가 prepare 호출에서 제공한 대로 쿼리를 기록하며, 실행 타임스탬프와 기타 모든 속성(아래 참고)도 함께 기록합니다. prepared statement 실행을 위해 바인딩된 실제 값은 오디트 로그에 나타나지 않아요.

오디트 로깅이 기록하는 것

각 오디트 로그 구현은 다음 속성에 접근할 수 있고, 기본 텍스트 기반 로거의 경우 이 필드들이 파이프로 연결되어 최종 메시지를 만듭니다.

  • user: 사용자 이름(사용 가능한 경우)
  • host: 명령이 실행되는 호스트 IP
  • source ip address: 요청이 시작된 소스 IP 주소
  • source port: 요청이 시작된 소스 포트 번호
  • timestamp: 유닉스 타임스탬프
  • type: 요청의 유형(SELECT, INSERT 등)
  • category: 요청의 범주(DDL, DML 등)
  • keyspace: 요청이 실행되도록 대상이 된 키스페이스(해당하는 경우)
  • scope: 해당하는 대로 테이블/애그리게이트 이름/함수 이름/트리거 이름 등
  • operation: 실행 중인 CQL 명령

구성 방법

Auditlog는 cassandra.yaml 파일로 구성할 수 있어요. 한 노드에서 오디트 로깅을 사용하려면 그 파일을 편집하거나 nodetool을 사용해 활성화하고 구성하면 됩니다.

AuditLog를 위한 cassandra.yaml 구성

다음 옵션이 지원됩니다:

  • enabled: 오디트 로그 활성화/비활성화
  • logger: 로거/커스텀 로거의 클래스 이름
  • audit_logs_dir: Auditlogs 디렉터리 위치. 설정하지 않으면 기본값은 cassandra.logdir.audit 또는 cassandra.logdir/audit/
  • included_keyspaces: 오디트 로그에 포함할 키스페이스의 쉼표로 구분된 목록. 기본값: 모든 키스페이스 포함
  • excluded_keyspaces: 오디트 로그에서 제외할 키스페이스의 쉼표로 구분된 목록. 기본값: system, system_schema, system_virtual_schema 외에는 제외하지 않음
  • included_categories: 오디트 로그에 포함할 Audit Log Category의 쉼표로 구분된 목록. 기본값: 모든 범주 포함
  • excluded_categories: 오디트 로그에서 제외할 Audit Log Category의 쉼표로 구분된 목록. 기본값: 어떤 범주도 제외하지 않음
  • included_users: 오디트 로그에 포함할 사용자의 쉼표로 구분된 목록. 기본값: 모든 사용자 포함
  • excluded_users: 오디트 로그에서 제외할 사용자의 쉼표로 구분된 목록. 기본값: 어떤 사용자도 제외하지 않음

사용 가능한 범주 목록은: QUERY, DML, DDL, DCL, OTHER, AUTH, ERROR, PREPARE입니다.

AuditLog를 활성화하는 NodeTool 명령

nodetool enableauditlog 명령은 cassandra.yaml 파일 기본값으로 AuditLog를 활성화합니다. 해당 기본값은 이 nodetool 명령의 옵션으로 재정의할 수 있어요.

nodetool enableauditlog

옵션

--excluded-categories 오디트 로그에서 제외할 Audit Log Category의 쉼표로 구분된 목록. 설정하지 않으면 cassandra.yaml 값 사용

--excluded-keyspaces 오디트 로그에서 제외할 키스페이스의 쉼표로 구분된 목록. 설정하지 않으면 cassandra.yaml 값 사용. system, system_schema, system_virtual_schema는 기본적으로 제외된다는 점을 기억하세요. 이 옵션을 nodetool로 덮어쓰는 경우, 이 키스페이스들이 오디트 로그에 있길 원하지 않는다면 다시 추가하세요

--excluded-users 오디트 로그에서 제외할 사용자의 쉼표로 구분된 목록. 설정하지 않으면 cassandra.yaml 값 사용

--included-categories 오디트 로그에 포함할 Audit Log Category의 쉼표로 구분된 목록. 설정하지 않으면 cassandra.yaml 값 사용

--included-keyspaces 오디트 로그에 포함할 키스페이스의 쉼표로 구분된 목록. 설정하지 않으면 cassandra.yaml 값 사용

--included-users 오디트 로그에 포함할 사용자의 쉼표로 구분된 목록. 설정하지 않으면 cassandra.yaml 값 사용

--logger AuditLogging에 사용할 로거 이름. 기본 BinAuditLogger. 설정하지 않으면 cassandra.yaml 값 사용

AuditLog를 비활성화하는 NodeTool 명령

nodetool disableauditlog 명령은 AuditLog를 비활성화합니다.

nodetool disableauditlog

AuditLog 필터를 다시 불러오는 NodeTool 명령

nodetool enableauditlog 명령을 사용해 기본값이나 이전 loggername과 업데이트된 필터로 auditlog 필터를 다시 불러올 수 있어요:

nodetool enableauditlog --loggername <Default/ existing loggerName> --included-keyspaces <New Filter values>

AuditLog 파일 내용 보기

auditlogviewer는 오디트 binlog 파일의 내용을 사람이 읽을 수 있는 텍스트 형식으로 보는 데 사용합니다.

auditlogviewer <path1> [<path2>...<pathN>] [options]

옵션

  • -f, --follow: 로그의 끝에 도달하면 더 많은 레코드를 기다리며 무기한 계속
  • -r, --roll_cycle: 로그 파일이 롤된 빈도. Chronicle이 파일 이름을 올바르게 파싱하려면 필요할 수 있음(MINUTELY, HOURLY, DAILY). 기본 HOURLY
  • -h, --help: 이 도움말 메시지 표시

예를 들어 오디트 로그 파일의 내용을 콘솔로 덤프하려면:

auditlogviewer /logs/cassandra/audit

결과:

LogMessage: user:anonymous|host:localhost/X.X.X.X|source:/X.X.X.X|port:60878|timestamp:1521158923615|type:USE_KS|category:DDL|ks:dev1|operation:USE "dev1"

BinAuditLogger 구성

AuditLogging에서 BinAuditLogger를 로거로 사용하려면 cassandra.yaml 파일의 audit_logging_options 섹션에서 logger를 BinAuditLogger로 설정하세요. BinAuditLogger는 cassandra.yaml의 고급 옵션으로 더 구성할 수 있어요.

BinAuditLogger의 고급 옵션

block AuditLog가 뒤처질 때 차단할지 오디트 로그 레코드를 버릴지 나타냅니다. 기본값은 true로 설정되어 오디트 로그 레코드가 유실되지 않습니다.

max_queue_weight 오디트 로그 레코드를 차단하거나 버리기 전에 오디트 로그 파일에 기록되기를 기다리는 레코드의 인메모리 큐 최대 가중치. 기본값은 256 * 1024 * 1024입니다.

max_log_size 가장 오래된 파일을 삭제하기 전에 디스크에 보관할 롤된 파일의 최대 크기. 기본값은 16L * 1024L * 1024L * 1024L입니다.

roll_cycle 오디트 로그 세그먼트를 롤하고 잠재적으로 회수할 수 있는 빈도. 사용 가능한 옵션: MINUTELY, HOURLY, DAILY, LARGE_DAILY, XLARGE_DAILY, HUGE_DAILY. 더 많은 옵션은 net.openhft.chronicle.queue.RollCycles를 참조하세요. 기본값은 "HOURLY"입니다.

FileAuditLogger 구성

AuditLogging에서 FileAuditLogger를 로거로 사용하려면 cassandra.yaml 파일에 클래스 이름을 설정하고, 오디트 로그 이벤트가 system.log 대신 별도의 로그 파일로 흐르도록 구성하세요.

<!-- Audit Logging (FileAuditLogger) rolling file appender to audit.log -->
<appender name="AUDIT" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <file>${cassandra.logdir}/audit/audit.log</file>
  <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    <!-- rollover daily -->
    <fileNamePattern>${cassandra.logdir}/audit/audit.log.%d{yyyy-MM-dd}.%i.zip</fileNamePattern>
    <!-- each file should be at most 50MB, keep 30 days worth of history, but at most 5GB -->
    <maxFileSize>50MB</maxFileSize>
    <maxHistory>30</maxHistory>
    <totalSizeCap>5GB</totalSizeCap>
  </rollingPolicy>
  <encoder>
    <pattern>%-5level [%thread] %date{"yyyy-MM-dd'T'HH:mm:ss,SSS", UTC} %F:%L - %msg%n</pattern>
  </encoder>
</appender>

<!-- Audit Logging additivity to redirect audt logging events to audit/audit.log -->
<logger name="org.apache.cassandra.audit" additivity="false" level="INFO">
    <appender-ref ref="AUDIT"/>
</logger>

더 알아보기 (Learn more)