稽核記錄
Cassandra 中的稽核記錄會記錄每個傳入的 CQL 命令要求,以及對 Cassandra 節點的驗證 (成功/失敗登入)。目前,提供兩種實作方式。自訂記錄器可以實作並注入類別名稱,作為 cassandra.yaml
檔案中的參數。
-
BinAuditLogger
:以二進位格式將事件記錄到檔案中的有效率方式 (社群建議的效能記錄器) -
FileAuditLogger
:使用 slf4j 記錄器將事件記錄到audit/audit.log
檔案
稽核記錄記錄什麼
每個稽核記錄實作都能存取下列屬性,而對於預設的文字記錄器,這些欄位會以管線符號串接,以產生最終訊息。
-
user
:使用者名稱(如果可用) -
host
:主機 IP,執行命令的位置 -
source ip address
:啟動要求的來源 IP 位址 -
source port
:啟動要求的來源埠號 -
timestamp
:Unix 時間戳記 -
type
:要求類型(SELECT、INSERT 等) -
category
- 要求類別(DDL、DML 等) -
keyspace
- 要求目標執行所在的鍵空間(如果適用) -
scope
- 表格/聚合名稱/函數名稱/觸發器名稱等,視情況而定 -
operation
- 執行的 CQL 命令
如何設定
稽核記錄可以使用 cassandra.yaml
檔案設定。若要在一個節點上使用稽核記錄,請編輯該檔案或使用 nodetool
啟用並設定。
AuditLog 的 cassandra.yaml 設定
支援下列選項
-
enabled
:此選項啟用/停用稽核記錄 -
logger
:記錄器/自訂記錄器的類別名稱。 -
audit_logs_dir
:稽核記錄目錄位置,如果未設定,則預設為 cassandra.logdir.audit 或 cassandra.logdir
/audit/ -
included_keyspaces
:要包含在稽核記錄中的鍵空間清單(以逗號分隔),預設 - 包含所有鍵空間 -
excluded_keyspaces
:要從稽核記錄中排除的鍵空間清單(以逗號分隔),預設 - 排除 system、system_schema 和 system_virtual_schema 以外的所有鍵空間 -
included_categories
:要包含在稽核記錄中的稽核記錄類別清單(以逗號分隔),預設 - 包含所有類別 -
excluded_categories
:要從稽核記錄中排除的稽核記錄類別清單(以逗號分隔),預設 - 不排除任何類別 -
included_users
:要包含在稽核記錄中的使用者清單(以逗號分隔),預設 - 包含所有使用者 -
excluded_users
:要從稽核記錄中排除的使用者清單(以逗號分隔),預設 - 不排除任何使用者
可用類別清單:QUERY、DML、DDL、DCL、OTHER、AUTH、ERROR、PREPARE
啟用 AuditLog 的 NodeTool 命令
nodetool enableauditlog
命令會使用 cassandra.yaml
檔案預設值啟用 AuditLog。可以使用此 nodetool 命令的選項覆寫這些預設值。
nodetool enableauditlog
選項
--excluded-categories
-
要從稽核記錄中排除的稽核記錄類別清單,以逗號分隔。如果未設定,將使用 cassandra.yaml 中的值
--excluded-keyspaces
-
要從稽核記錄中排除的鍵空間清單,以逗號分隔。如果未設定,將使用 cassandra.yaml 中的值。請記住,system、system_schema 和 system_virtual_schema 預設會被排除,如果您透過 nodetool 覆寫此選項,請記得將這些鍵空間加回去,如果您不希望它們出現在稽核記錄中
--excluded-users
-
要從稽核記錄中排除的使用者清單,以逗號分隔。如果未設定,將使用 cassandra.yaml 中的值
--included-categories
-
要包含在稽核記錄中的稽核記錄類別清單,以逗號分隔。如果未設定,將使用 cassandra.yaml 中的值
--included-keyspaces
-
要包含在稽核記錄中的鍵空間清單,以逗號分隔。如果未設定,將使用 cassandra.yaml 中的值
--included-users
-
要包含在稽核記錄中的使用者清單,以逗號分隔。如果未設定,將使用 cassandra.yaml 中的值
--logger
-
要使用於稽核記錄的記錄器名稱。預設為 BinAuditLogger。如果未設定,將使用 cassandra.yaml 中的值
檢視稽核記錄檔案的內容
auditlogviewer
用於以人類可讀文字格式檢視稽核記錄二進位記錄檔的內容。
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
作為記錄器,請在 audit_logging_options
區段中的 cassandra.yaml
檔案中將記錄器設定為 BinAuditLogger
。BinAuditLogger
可使用其在 cassandra.yaml
中的高階選項進一步設定。
BinAuditLogger 的高階選項
block
-
指出稽核記錄是否應在落後時封鎖,或應捨棄稽核記錄。預設設定為
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{ISO8601} %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>