監査ログ
監査ログは、Apache Cassandra 4.0の新機能です(CASSANDRA-12151)。この新機能は、ヒープメモリとディスク容量の上限を設定することでメモリ不足エラーを防ぐことができるため、本番環境でも安全に使用できます。すべてのデータベースアクティビティは、ノードごとにファイルベースのレコードとして、指定されたローカルファイルシステムディレクトリに記録されます。監査ログファイルは、設定可能な値に基づいて定期的にローテーションされます。
監査ログの機能の一部を以下に示します。
-
監査ログの保存に、追加のデータベース容量は必要ありません。
-
監査ログの保存に、特別なクエリツールは必要ありません。
-
データベース操作のレイテンシには影響がないため、パフォーマンスへの影響はありません。
-
ヒープメモリの使用量は、重み付けされたキューによって制限され、ログ記録スレッドの前に設定可能な最大重みが設定されています。
-
ディスクの使用量は、設定可能なサイズによって制限され、制限に達すると古いログセグメントが削除されます。
-
cassandra.yaml
を使用して起動時に有効化または無効化するか、JMXツールnodetool
を使用して実行時に有効化または無効化できます。 -
設定は、
cassandra.yaml
ファイルまたはnodetool
を使用して行うことができます。
監査ログには、成功したCQLリクエストと失敗したCQLリクエストの両方が含まれます。また、ログイン試行など、成功した認証イベントと失敗した認証イベントもすべてキャプチャします。完全クエリログ(FQL)と監査ログの違いは、FQLは成功したCQLリクエストのみをキャプチャし、ログの再生や比較が可能になることです。監査ログはコンプライアンスとデバッグに役立ち、FQLはデバッグ、パフォーマンスベンチマーク、テスト、およびCQLクエリの監査に役立ちます。
記録される監査情報
監査ログには以下が含まれます。
-
設定されたキー空間内のすべてのイベント
-
設定されたカテゴリ内のすべてのイベント
-
設定されたユーザーによって実行されたすべてのイベント
監査ログには以下が含まれません。
-
cassandra.yaml
ファイルで行われた設定変更 -
nodetool
コマンド -
DCLステートメントの一部として記述されたパスワード: パスワードは***として難読化されます。
-
解析に失敗したステートメントでは、「password」という単語が出現した後のすべてが***として難読化されます。
-
「password」という単語のタイプミスがあるステートメントは、難読化せずにログに記録されます。再試行時には異なるパスワードを使用してください。
-
監査ログは、一連のログエントリです。監査ログエントリには以下が含まれます。
-
keyspace (String) - リクエストが行われたキー空間
-
operation (String) - CQLコマンドなどのデータベース操作
-
user (String) - ユーザー名
-
scope (String) - テーブル/関数/集計名などのリクエストの範囲
-
type (AuditLogEntryType) - リクエストの種類
-
CQL監査ログエントリの種類
-
共通監査ログエントリの種類
-
-
source (InetAddressAndPort) - リクエストの発信元IPアドレス
-
timestamp (long) - リクエストのタイムスタンプ
-
batch (UUID) - リクエストのバッチ
-
options (QueryOptions) - CQLクエリオプション
-
state (QueryState) - 特定のクエリに関連する状態
各エントリには、パイプ(|)で連結された、指定されたイベントに適用可能なすべての属性が含まれています。
CQL監査ログエントリの種類は、次のCQLコマンドです。各コマンドは、ログに記録する特定のカテゴリに割り当てられます。
カテゴリ | CQLコマンド |
---|---|
DDL |
ALTER_KEYSPACE, CREATE_KEYSPACE, DROP_KEYSPACE, ALTER_TABLE, CREATE_TABLE, DROP_TABLE, CREATE_FUNCTION, DROP_FUNCTION, CREATE_AGGREGATE, DROP_AGGREGATE, CREATE_INDEX, DROP_INDEX, ALTER_TYPE, CREATE_TYPE, DROP_TYPE, CREATE_TRIGGER, DROP_TRIGGER, ALTER_VIEW, CREATE_VIEW, DROP_VIEW, TRUNCATE |
DML |
BATCH, DELETE, UPDATE |
DCL |
GRANT, REVOKE, ALTER_ROLE, CREATE_ROLE, DROP_ROLE, LIST_ROLES, LIST_PERMISSIONS, LIST_USERS |
その他 |
USE_KEYSPACE |
クエリ |
SELECT |
PREPARE |
PREPARE_STATEMENT |
共通監査ログエントリの種類は次のいずれかです。
カテゴリ | CQLコマンド |
---|---|
認証 |
LOGIN_SUCCESS, LOGIN_ERROR, UNAUTHORIZED_ATTEMPT |
エラー |
REQUEST_FAILURE |
可用性と耐久性
データとは異なり、監査ログエントリはレプリケートされません。 |
特定のクエリについて、対応する監査エントリは、コーディネーターノードのみに保存されます。たとえば、レプリケーションファクターが3のキー空間へのINSERTは、リクエストを処理したコーディネーターノードの1つに監査エントリが生成され、他の2つのノードには生成されません。このため、満たす必要があるコンプライアンス要件によっては、監査ログが一時的なストレージではないストレージに保存されていることを確認する必要があります。
archive_commandオプションを使用して、カスタムニーズを実現できます。
cassandra.yamlでの監査ログの設定
cassandra.yaml
ファイルを使用して、監査ログを設定および有効化できます。設定と有効化は、cassandra.yaml
ファイルの設定に応じて、各ノードで同じでも異なっていてもかまいません。
機能を有効にする際にnodetool
を使用して監査ログを設定することもでき、nodetoolを使用した監査ログの有効化で説明されているように、cassandra.yaml
ファイルに設定された値を上書きします。
監査ログは有効化された各ノードで生成されるため、各ノードのログにはそのノードのクエリが含まれます。監査ログのすべてのオプションは、cassandra.yaml
ファイルのaudit_logging_options:
の下に設定できます。
このファイルには、使用するためにコメントを外すことができる次のオプションが含まれています。
# Audit logging - Logs every incoming CQL command request, authentication to a node. See the docs
# on audit_logging for full details about the various configuration options.
audit_logging_options:
enabled: false
logger:
- class_name: BinAuditLogger
# audit_logs_dir:
# included_keyspaces:
# excluded_keyspaces: system, system_schema, system_virtual_schema
# included_categories:
# excluded_categories:
# included_users:
# excluded_users:
# roll_cycle: HOURLY
# block: true
# max_queue_weight: 268435456 # 256 MiB
# max_log_size: 17179869184 # 16 GiB
## archive command is "/path/to/script.sh %path" where %path is replaced with the file being rolled:
# archive_command:
# max_archive_retries: 10
enabled
監査ログの有効化または無効化(デフォルト)を制御します。
監査ログを有効にするには、enabled: true
に設定します。
このオプションが有効になっている場合、Cassandraの起動時に監査ログが開始されます。その後、nodetoolを使用して実行時に無効化できます。
JMX MBean org.apache.cassandra.db:type=StorageService のAuditLogEnabled 属性を使用して、監査ログが有効になっているかどうかを監視できます。 |
logger
監査ロガーの種類は、logger
オプションで設定されます。サポートされている値は次のとおりです。
-
BinAuditLogger
(デフォルト) -
FileAuditLogger
-
NoOpAuditLogger
BinAuditLogger
は、バイナリ形式でファイルをログに記録します。FileAuditLogger
は、標準のログ記録メカニズムslf4j
を使用してイベントをaudit/audit.log
ファイルにログに記録します。これは同期型のファイルベースの監査ロガーです。roll_cycleはlogback.xml
ファイルで設定されます。NoOpAuditLogger
は、監査ログが無効になっている場合に指定する必要がある、監査ロガーのno-op実装です。
例:
logger:
- class_name: FileAuditLogger
BinAuditLogger は内部でオープンソースのChronicle Queueを使用しています。監査ログを法令遵守目的で使用する場合は、このライブラリに多少なりとも精通しておくことをお勧めします。影響の例については、archive_commandとroll_cycleを参照してください。 |
audit_logs_dir
監査ログを書き込むには、audit_logs_dir
に既存のディレクトリを設定する必要があります。
このディレクトリには、読み取り、書き込み、実行を許可する適切な権限を設定する必要があります。必要に応じて、ログはディレクトリの内容を再帰的に削除します。このディレクトリには、ファイルシステムの他のセクションへのリンクを配置しないでください。例:audit_logs_dir: /non_ephemeral_storage/audit/logs/hourly
。
監査ログディレクトリは、システムプロパティcassandra.logdir.audit
を使用して設定することもできます。これはデフォルトでcassandra.logdir + /audit/
に設定されています。
included_keyspacesとexcluded_keyspaces
含めるキー空間をincluded_keyspaces
オプションで、除外するキー空間をexcluded_keyspaces
オプションで設定します。デフォルトでは、system
、system_schema
、system_virtual_schema
が除外され、その他のキー空間はすべて含まれます。
例:
included_keyspaces: test, demo
excluded_keyspaces: system, system_schema, system_virtual_schema
included_categoriesとexcluded_categories
含めるデータベース操作のカテゴリは、included_categories
オプションでカンマ区切りのリストとして指定します。除外するデータベース操作のカテゴリは、excluded_categories
オプションでカンマ区切りのリストとして指定します。監査ログでサポートされるカテゴリは、AUTH
、DCL
、DDL
、DML
、ERROR
、OTHER
、PREPARE
、QUERY
です。デフォルトでは、サポートされているすべてのカテゴリが含まれ、カテゴリは除外されません。
included_categories: AUTH, ERROR, DCL
excluded_categories: DDL, DML, QUERY, PREPARE
included_usersとexcluded_users
監査ログに記録するユーザーは、included_users
とexcluded_users
オプションで設定します。included_users
オプションは、明示的に含めるユーザーをカンマ区切りのリストで指定します。excluded_users
オプションは、明示的に除外するユーザーをカンマ区切りのリストで指定します。デフォルトでは、すべてのユーザーが含まれ、ユーザーは除外されません。
included_users:
excluded_users: john, mary
roll_cycle
roll_cycle
は、監査ログセグメントがロールされる頻度を定義します。サポートされる値は次のとおりです。
-
MINUTELY
-
FIVE_MINUTELY
-
TEN_MINUTELY
-
TWENTY_MINUTELY
-
HALF_HOURLY
-
HOURLY
(デフォルト) -
TWO_HOURLY
-
FOUR_HOURLY
-
SIX_HOURLY
-
DAILY
例:roll_cycle: DAILY
本番ノードでroll_cycle を変更する場合は、次の段落を読んでください。 |
BinLogger
実装では、監査ログが以前に有効になっていたノードでロールサイクルを変更しようとすると、Chronicle Queueのロールサイクル推論メカニズムにより、サイレントに失敗します(metadata.cq4t
ファイルを削除した場合でも)。
Cassandraログに表示されるこのようなオーバーライドの例を次に示します。
INFO [main] <DATE TIME> BinLog.java:420 - Attempting to configure bin log: Path: /path/to/audit Roll cycle: TWO_HOURLY [...] WARN [main] <DATE TIME> SingleChronicleQueueBuilder.java:477 - Overriding roll cycle from TWO_HOURLY to FIVE_MINUTE
ノードでroll_cycle
を変更するには、次の手順を実行する必要があります。
-
Cassandraを停止する
-
すべての監査ログを別の場所(安全で永続的な場所)に移動またはオフロードする
-
Cassandraを再起動する
-
Cassandraログを確認する
-
audit_logs_dir
の下にある監査ログのファイル名が新しいロールサイクルに対応していることを確認する。
block
block
オプションは、監査ログが遅延した場合に、監査ログの書き込みをブロックするか、ログレコードを破棄するかどうかを指定します。サポートされるブール値はtrue
(デフォルト)またはfalse
です。
例:レコードを破棄するにはblock: false
(監査をトラブルシューティングに使用する場合など)
法令遵守の目的では、将来のデフォルト値の変更に備えて、明示的にblock: true
を設定することがベストプラクティスです。
max_queue_weight
max_queue_weight
オプションは、ブロックまたは破棄する前に、ファイルに書き込まれるのを待っているレコードのメモリ内キューの最大重みを設定します。このオプションは正の値に設定する必要があります。デフォルト値は268435456または256 MiBです。
例:デフォルトを変更するには:max_queue_weight: 134217728 # 128 MiB
max_log_size
max_log_size
オプションは、最も古いファイルを削除する前に、ディスク上に保持するロールされたファイルの最大サイズを設定します。このオプションは正の値に設定する必要があります。デフォルトは17179869184または16 GiBです。例:デフォルトを変更するには:max_log_size: 34359738368 # 32 GiB
archive_command オプションが設定されている場合、max_log_size は無視されます。 |
archive_command
archive_command オプションが空または設定されていない場合(デフォルト)、Cassandraは、max_log_size に達した場合に最も古いファイルを削除する組み込みのDeletingArchiverを使用します。 |
archive_command
オプションは、ロールされたログファイルに対して実行するユーザー定義のアーカイブスクリプトを設定します。例:archive_command: "/usr/local/bin/archiveit.sh %path"
%path
は、ロールされているファイルの絶対ファイルパスに置き換えられます。
ユーザー定義のスクリプトを使用する場合、CassandraはDeletingArchiverを使用しないため、必要なクリーンアップを実行するのはスクリプトの責任です。
Cassandraは、ログファイルがロールされるとすぐにユーザー定義のスクリプトを呼び出します。つまり、Chronicle QueueのQueueFileShrinkManagerは、非同期で実行されるため、スパースログファイルを縮小できません。言い換えれば、実際のデータが数KBしかない場合でも、すべてのログファイルのサイズはデフォルトのブロックサイズ(80 MiB)以上になります。その結果、Cassandra system.logにいくつかの警告が表示されます。
WARN [main/queue~file~shrink~daemon] <DATE TIME> QueueFileShrinkManager.java:63 - Failed to shrink file as it exists no longer, file=/path/to/xxx.cq4
CassandraはPretoucherを使用しないため、chronicle.queue.synchronousFileShrinking JVMプロパティを使用して、ファイルを同期的に(つまり、ファイルがロールされるとすぐに)縮小するようにChronicle Queueを設定できます。たとえば、cassandra-env.sh の最後に次の行を追加できます。JVM_OPTS="$JVM_OPTS -Dchronicle.queue.synchronousFileShrinking=true" |
nodetool
を使用した監査ログの有効化
監査ログは、nodetool enableauditlog
コマンドを使用して、ノードごとに有効になります。ログディレクトリは、cassandra.yaml
ファイルのaudit_logs_dir
で定義するか、デフォルト値cassandra.logdir.audit
を使用する必要があります。
nodetool enableauditlog
コマンドの構文には、cassandra.yaml
ファイルで設定できるものと同じオプションがすべて含まれています(audit_logs_dir
を除く)。さらに、nodetool
には、コマンドを実行するホストとポート、およびコマンドに認証が必要な場合はユーザー名とパスワードを設定するためのオプションがあります。
nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]
[(-pp | --print-port)] [(-pw <password> | --password <password>)]
[(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]
[(-u <username> | --username <username>)] enableauditlog
[--excluded-categories <excluded_categories>]
[--excluded-keyspaces <excluded_keyspaces>]
[--excluded-users <excluded_users>]
[--included-categories <included_categories>]
[--included-keyspaces <included_keyspaces>]
[--included-users <included_users>] [--logger <logger>]
OPTIONS
--excluded-categories <excluded_categories>
Comma separated list of Audit Log Categories to be excluded for
audit log. If not set the value from cassandra.yaml will be used
--excluded-keyspaces <excluded_keyspaces>
Comma separated list of keyspaces to be excluded for audit log. If
not set the value from cassandra.yaml will be used
--excluded-users <excluded_users>
Comma separated list of users to be excluded for audit log. If not
set the value from cassandra.yaml will be used
-h <host>, --host <host>
Node hostname or ip address
--included-categories <included_categories>
Comma separated list of Audit Log Categories to be included for
audit log. If not set the value from cassandra.yaml will be used
--included-keyspaces <included_keyspaces>
Comma separated list of keyspaces to be included for audit log. If
not set the value from cassandra.yaml will be used
--included-users <included_users>
Comma separated list of users to be included for audit log. If not
set the value from cassandra.yaml will be used
--logger <logger>
Logger name to be used for AuditLogging. Default BinAuditLogger. If
not set the value from cassandra.yaml will be used
-p <port>, --port <port>
Remote jmx agent port number
-pp, --print-port
Operate in 4.0 mode with hosts disambiguated by port number
-pw <password>, --password <password>
Remote jmx agent password
-pwf <passwordFilePath>, --password-file <passwordFilePath>
Path to the JMX password file
-u <username>, --username <username>
Remote jmx agent username
監査ログを有効にするには、ログを有効にするクラスタ内の各ノードで次のコマンドを実行します。
$ nodetool enableauditlog
監査ログの表示
ロガーがBinAuditLogger
の場合、auditlogviewer
ツールを使用して監査ログを表示(ダンプ)します。auditlogviewer
はバイナリログファイルを人間が判読できる形式に変換します。コマンドラインオプションとして監査ログディレクトリのみを指定する必要があります。ロガーFileAuditLogger
が設定されている場合、ログファイルは既に人間が判読できる形式になっており、ファイルを閲覧するためにauditlogviewer
は必要ありません。
auditlogviewer
の構文は次のとおりです。
auditlogviewer
Audit log files directory path is a required argument.
usage: auditlogviewer <path1> [<path2>...<pathN>] [options]
--
View the audit log contents in human readable format
--
Options are:
-f,--follow Upon reaching the end of the log continue indefinitely
waiting for more records
-h,--help display this help message
-r,--roll_cycle How often to roll the log file was rolled. May be
necessary for Chronicle to correctly parse file names. (MINUTELY, HOURLY,
DAILY). Default HOURLY.
例
-
監査ログをデモするには、まず次の設定で
cassandra.yaml
ファイルを構成します。
audit_logging_options:
enabled: true
logger: BinAuditLogger
audit_logs_dir: "/cassandra/audit/logs/hourly"
# included_keyspaces:
# excluded_keyspaces: system, system_schema, system_virtual_schema
# included_categories:
# excluded_categories:
# included_users:
# excluded_users:
roll_cycle: HOURLY
# block: true
# max_queue_weight: 268435456 # 256 MiB
# max_log_size: 17179869184 # 16 GiB
## archive command is "/path/to/script.sh %path" where %path is replaced with the file being rolled:
# archive_command:
# max_archive_retries: 10
-
監査ログディレクトリ
/cassandra/audit/logs/hourly
を作成し、すべてのユーザーに対して読み取り、書き込み、実行のディレクトリ権限を設定します。
-
次に、
cqlsh
を使用してデモキー空間とテーブルを作成し、いくつかのデータを追加します。
cqlsh> CREATE KEYSPACE auditlogkeyspace
... WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 1};
cqlsh> USE auditlogkeyspace;
cqlsh:auditlogkeyspace> CREATE TABLE t (
...id int,
...k int,
...v text,
...PRIMARY KEY (id)
... );
cqlsh:auditlogkeyspace> INSERT INTO t (id, k, v) VALUES (0, 0, 'val0');
cqlsh:auditlogkeyspace> INSERT INTO t (id, k, v) VALUES (0, 1, 'val1');
サポートされているすべてのCQLコマンドが監査ログディレクトリに記録されます。
-
監査ログディレクトリにディレクトリを変更します。
$ cd /cassandra/audit/logs/hourly
-
監査ログファイルとディレクトリを一覧表示します。
$ ls -l
次のような結果が表示されます。
total 28
-rw-rw-r--. 1 ec2-user ec2-user 65536 Aug 2 03:01 directory-listing.cq4t
-rw-rw-r--. 1 ec2-user ec2-user 83886080 Aug 2 03:01 20190802-02.cq4
-rw-rw-r--. 1 ec2-user ec2-user 83886080 Aug 2 03:01 20190802-03.cq4
監査ログファイルはすべて.cq4
ファイルタイプで一覧表示されます。監査ディレクトリは.cq4t
タイプです。
-
auditlogviewer
ツールを実行して監査ログを表示します。
$ auditlogviewer /cassandra/audit/logs/hourly
このコマンドは、ログの判読可能なバージョンを返します。これは、このデモのコマンドのログの一部のサンプルです。
WARN 03:12:11,124 Using Pauser.sleepy() as not enough processors, have 2, needs 8+
Type: AuditLog
LogMessage:
user:anonymous|host:10.0.2.238:7000|source:/127.0.0.1|port:46264|timestamp:1564711427328|type :USE_KEYSPACE|category:OTHER|ks:auditlogkeyspace|operation:USE AuditLogKeyspace;
Type: AuditLog
LogMessage:
user:anonymous|host:10.0.2.238:7000|source:/127.0.0.1|port:46264|timestamp:1564711427329|type :USE_KEYSPACE|category:OTHER|ks:auditlogkeyspace|operation:USE "auditlogkeyspace"
Type: AuditLog
LogMessage:
user:anonymous|host:10.0.2.238:7000|source:/127.0.0.1|port:46264|timestamp:1564711446279|type :SELECT|category:QUERY|ks:auditlogkeyspace|scope:t|operation:SELECT * FROM t;
Type: AuditLog
LogMessage:
user:anonymous|host:10.0.2.238:7000|source:/127.0.0.1|port:46264|timestamp:1564713878834|type :DROP_TABLE|category:DDL|ks:auditlogkeyspace|scope:t|operation:DROP TABLE IF EXISTS
AuditLogKeyspace.t;
Type: AuditLog
LogMessage:
user:anonymous|host:10.0.2.238:7000|source:/3.91.56.164|port:42382|timestamp:1564714618360|ty
pe:REQUEST_FAILURE|category:ERROR|operation:CREATE KEYSPACE AuditLogKeyspace
WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 1};; Cannot add
existing keyspace "auditlogkeyspace"
Type: AuditLog
LogMessage:
user:anonymous|host:10.0.2.238:7000|source:/127.0.0.1|port:46264|timestamp:1564714690968|type :DROP_KEYSPACE|category:DDL|ks:auditlogkeyspace|operation:DROP KEYSPACE AuditLogKeyspace;
Type: AuditLog
LogMessage:
user:anonymous|host:10.0.2.238:7000|source:/3.91.56.164|port:42406|timestamp:1564714708329|ty pe:CREATE_KEYSPACE|category:DDL|ks:auditlogkeyspace|operation:CREATE KEYSPACE
AuditLogKeyspace
WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 1};
Type: AuditLog
LogMessage:
user:anonymous|host:10.0.2.238:7000|source:/127.0.0.1|port:46264|timestamp:1564714870678|type :USE_KEYSPACE|category:OTHER|ks:auditlogkeyspace|operation:USE auditlogkeyspace;
Password obfuscation examples:
LogMessage: user:cassandra|host:localhost/127.0.0.1:7000|source:/127.0.0.1|port:65282|timestamp:1622630496708|type:CREATE_ROLE|category:DCL|operation:CREATE ROLE role1 WITH PASSWORD = '*******';
Type: audit
LogMessage: user:cassandra|host:localhost/127.0.0.1:7000|source:/127.0.0.1|port:65282|timestamp:1622630634552|type:ALTER_ROLE|category:DCL|operation:ATLER ROLE role1 WITH PASSWORD = '*******';
Type: audit
LogMessage: user:cassandra|host:localhost/127.0.0.1:7000|source:/127.0.0.1|port:65282|timestamp:1622630698686|type:CREATE_ROLE|category:DCL|operation:CREATE USER user1 WITH PASSWORD '*******';
Type: audit
LogMessage: user:cassandra|host:localhost/127.0.0.1:7000|source:/127.0.0.1|port:65282|timestamp:1622630747344|type:ALTER_ROLE|category:DCL|operation:ALTER USER user1 WITH PASSWORD '*******';