Cassandra ドキュメント

バージョン

プレリリースバージョンのドキュメントを表示しています。

監査ログ

監査ログは、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=StorageServiceAuditLogEnabled属性を使用して、監査ログが有効になっているかどうかを監視できます。

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_commandroll_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オプションで設定します。デフォルトでは、systemsystem_schemasystem_virtual_schemaが除外され、その他のキー空間はすべて含まれます。

例:

included_keyspaces: test, demo
excluded_keyspaces: system, system_schema, system_virtual_schema

included_categoriesとexcluded_categories

含めるデータベース操作のカテゴリは、included_categoriesオプションでカンマ区切りのリストとして指定します。除外するデータベース操作のカテゴリは、excluded_categoriesオプションでカンマ区切りのリストとして指定します。監査ログでサポートされるカテゴリは、AUTHDCLDDLDMLERROROTHERPREPAREQUERYです。デフォルトでは、サポートされているすべてのカテゴリが含まれ、カテゴリは除外されません。

included_categories: AUTH, ERROR, DCL
excluded_categories: DDL, DML, QUERY, PREPARE

included_usersとexcluded_users

監査ログに記録するユーザーは、included_usersexcluded_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を変更するには、次の手順を実行する必要があります。

  1. Cassandraを停止する

  2. すべての監査ログを別の場所(安全で永続的な場所)に移動またはオフロードする

  3. Cassandraを再起動する

  4. Cassandraログを確認する

  5. 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"

max_archive_retries

max_archive_retriesオプションは、アーカイブコマンドの失敗の最大再試行回数を設定します。デフォルトは10です。

例:max_archive_retries: 10

各再試行間のインターバルは、5分にハードコーディングされています。

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

監査ログの無効化

nodetool disableauditlogコマンドを使用して、監査ログを無効にします。

監査ログの表示

ロガーが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.

  1. 監査ログをデモするには、まず次の設定で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
  1. 監査ログディレクトリ/cassandra/audit/logs/hourlyを作成し、すべてのユーザーに対して読み取り、書き込み、実行のディレクトリ権限を設定します。

  1. 次に、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コマンドが監査ログディレクトリに記録されます。

  1. 監査ログディレクトリにディレクトリを変更します。

$ cd /cassandra/audit/logs/hourly
  1. 監査ログファイルとディレクトリを一覧表示します。

$ 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タイプです。

  1. 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 '*******';

ユーザー監査ログの診断イベント

ネイティブのトランスポート対応クライアントは、クラスタの問題を診断するために監査ログイベントを購読できます。これらのイベントは、外部ツールによって消費され、Cassandraユーザー監査ソリューションを実装できます。