データベース監査のセットアップ
DataStax Enterpriseデータベースのアクティビティーをログファイルまたはテーブルに捕捉します。
logback.xml
logback.xmlファイルの場所は、インストールのタイプによって異なります。パッケージ・インストール | /etc/dse/cassandra/logback.xml |
tarボール・インストール | installation_location/resources/cassandra/conf/logback.xml |
- キースペースのフィルター処理 - すべてのキースペースのアクティビティー、またはターゲット・キースペースのみのアクティビティーを捕捉します。正規表現を使用してキースペース名をフィルター処理します。
- カテゴリーのフィルター処理 - イベント・カテゴリーを使用して、捕捉するイベントの数を制限します。
- ロールのフィルター処理 - ログイン・ロール名に基づいて特定のユーザーまたはグループのアクティビティーを追跡します。
- ノード固有 - 1つ以上のノードの監査を有効にします。特定のノードのみ、データ・センター全体、またはクラスター全体の監査を許可します。
ファイルまたはテーブルの選択
- ログ・ファイル(ノードごと)
- SLF4JAuditWriter
[Simple Logging Facade for Java(SLF4J)Audit Writer]ロガーは、ローカル・ノードで発生したすべてのデータベース・アクティビティーをaudit.logファイルに記録します。マルチノード要求をトレースする場合、参加していたすべてのノードからログ・ファイルを収集して解析します。 - 統合テーブル -
CassandraAuditWriter
ロガーは、ローカル・ノードで発生したすべてのデータベース・アクティビティーをdse_audit.audit_log
テーブルに記録します。ロガーが有効になっているすべてのノードのイベントが、同じテーブルに捕捉されます。これにより、複数のノードを含むレポートが簡単に作成できます。
ファイルへの監査ロギングの有効化
システム・ログ・ファイルのデータベース・アクティビティーを捕捉する監査ロガーを構成します。
Simple Logging Facade for Java(SLF4J)監査ライター(SLF4JAuditWriter
)ロガーを使用して、ローカル・ノードで発生したすべてのデータベース・アクティビティーをaudit.logファイルに記録します。標準のLinuxファイル・システム・パーミッションを使用してアクセスを制御することにより、ログ・ファイルを保護します。
dse_audit.audit_log
テーブルにのみ使用できます。dse.yaml
dse.yamlファイルの場所は、インストールのタイプによって異なります。パッケージ・インストール | /etc/dse/dse.yaml |
tarボール・インストール | installation_location/resources/dse/conf/dse.yaml |
audit.log
audit.logファイルの場所は:- /var/log/cassandra/audit/audit.log
audit.logファイルへのイベントを捕捉するには audit.log ファイルに追加します。
audit_logging_options: enabled: true logger: SLF4JAuditWriter
DataStax Enterpriseは、Cassandraログディレクトリにaudit/audit.logを作成します。ログ・ファイルが構成されているサイズしきい値に達すると、ロールオーバーされ、ログ・ファイル名が変更されます。ファイル名には、maxBackupIndex
プロパティで決められた数字のサフィックスが含まれます。
テーブルへの監査ロギングの有効化
データベース・テーブルのデータベース・アクティビティーを捕捉する監査ロガーを構成します。
ローカル・ノードで発生したすべてのデータベース・アクティビティーをdse_audit.audit_log
テーブルに記録するには、CassandraAuditWriter
ロガーを使用します。すべてのノードからのイベントが同じテーブルに捕捉されるため、複数のノードを含むレポートを簡単に作成できます。
テーブル・オプションを使用すると、クラスター全体のすべてのイベントを一元管理できます。DataStaxのロール・ベースのアクセス制御(RBAC)でテーブルを保護します。「パーミッションと透過的なデータ暗号化(TDE)の割り当て」および「テーブルの暗号化」を参照してください。
dse.yaml
dse.yamlファイルの場所は、インストールのタイプによって異なります。パッケージ・インストール | /etc/dse/dse.yaml |
tarボール・インストール | installation_location/resources/dse/conf/dse.yaml |
手順
dse_audit.audit_log
テーブルにイベントを捕捉するには:-
audit_logging_optionsをdse.yaml ファイルで設定します。
audit_logging_options: enabled: true logger: CassandraAuditWriter # included_categories: # excluded_categories: # included_keyspaces: # excluded_keyspaces: # included_roles: # excluded_roles: retention_time: 12 cassandra_audit_writer_options: mode: sync batch_size: 50 flush_time: 250 queue_size: 30000 write_consistency: QUORUM # dropped_event_log: /var/log/cassandra/dropped_audit_events.log # day_partition_millis: 3600000
enabled: true
- 次回の起動後にロギングをオンにします。logger: CassandraAuditWriter
- ロガー名。retention_time: 12
-dse_audit.audit_log
テーブルでTTL(Time-To-Live)として設定する時間数。データを自動的に期限切れにするには、この設定を使用します。デフォルトは0(無効)です。- cassandra_audit_writer_optionsパラメーターを必要に応じてカスタマイズします(デフォルトは上記のとおり)。
注:audit_log
テーブルには以下の設定があります。DESC TABLE dse_audit.audit_log CREATE TABLE dse_audit.audit_log ( date timestamp, node inet, day_partition int, event_time timeuuid, authenticated text, batch_id uuid, category text, consistency text, keyspace_name text, operation text, source text, table_name text, type text, username text, PRIMARY KEY ((date, node, day_partition), event_time) ) WITH CLUSTERING ORDER BY (event_time ASC) AND bloom_filter_fp_chance = 0.01 AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'} AND comment = '' AND compaction = {'class': 'org.apache.cassandra.db.compaction.TimeWindowCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'} AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'} AND crc_check_chance = 1.0 AND default_time_to_live = 0 AND gc_grace_seconds = 7776000 AND max_index_interval = 2048 AND memtable_flush_period_in_ms = 3600000 AND min_index_interval = 128 AND nodesync = {'enabled': 'true'} AND speculative_retry = '99PERCENTILE';
-
(オプション)デフォルトでは、NodeSyncは
audit_log
テーブルに対して無効になっています。NodeSyncを使用してデータの一貫性を維持するには、これを有効にします。ALTER TABLE dse_audit.audit_log WITH nodesync = { 'enabled' : true };
-
キースペース・レプリケーション・ストラテジを
NetworkTopologyStrategy
に設定し、監査が有効になっているクラスター内の各データ・センターのレプリケーション係数を設定します。ALTER KEYSPACE dse_audit WITH replication = { 'class': 'NetworkTopologyStrategy', 'datacenter1' : 2, 'datacenter2' : 1 };
-
次のいずれかの方法を使用して、新しく追加されたデータ・センターにデータ・レプリケーションを強制します。
- NodeSyncが有効になっている場合:
nodesync -cu user_name -cp password \ validation submit dse_audit.audit_log
user_nameは、CQLテーブルにアクセスする権限を持つ内部ログイン・ロール名またはLDAP/Kerberosです。 - NodeSyncが無効になっている場合:
nodetool repair dse_audit audit_log
- NodeSyncが有効になっている場合:
イベント・カテゴリーのフィルター処理
ログに記録するイベント・カテゴリーを設定します。
dse.yaml
dse.yamlファイルの場所は、インストールのタイプによって異なります。パッケージ・インストール | /etc/dse/dse.yaml |
tarボール・インストール | installation_location/resources/dse/conf/dse.yaml |
audit_logging_options: enabled: true logger: logger_name # included_categories: # excluded_categories:logger_nameは、
SLF4JAuditWriter
またはCassandraAuditWriter
です。included_categories
- 記載されているカテゴリーのみを含め、他はすべて除外します。excluded_categories
- 記載されているカテゴリー除外し、他はすべて含めます。
カテゴリーの種類
デフォルトでは、監査が有効な場合、DataStax Enterpriseはすべてのイベント・カテゴリーを捕捉します。included_categoriesまたはexcluded_categoriesパラメーターを使用して、捕捉するカテゴリーを制限します。
- QUERY
- 以下のタイプのデータ取得イベントをログに記録します。
CQL_SELECT
- SELECTSOLR_QUERY
- 検索インデックスによってフィルター処理されるSELECTステートメントGRAPH_TINKERPOP_TRAVERSAL
- グラフ探索インスタンス(g
)を使用してテーブルを呼び出します。「グラフと走査に関するプロパティの検出」を参照してくださいRPC_CALL_STATEMENT
- DML
- (データ操作言語)以下のタイプのデータ変更のログを記録します。
SET_KS
- USEINSERT
- INSERTBATCH
- BATCHTRUNCATE
- TRUNCATECQL_UPDATE
- UPDATECQL_DELETE
- DELETECQL_PREPARE_STATEMENT
- Java - プリペアド・ステートメントなどのDataStaxドライバー・プリペアド・ステートメントSOLR_UPDATE
SOLR_COMMIT_SEARCH_INDEX_STATEMENT
- COMMIT SEARCH INDEX
- DDL
- (データ定義言語)以下のタイプのデータベース・スキーマの変更に関するログを記録します。
ADD_CF
- CREATE TABLEDROP_CF
- DROP TABLEUPDATE_CF
- ALTER TABLEADD_KS
- CREATE KEYSPACEDROP_KS
- DROP KEYSPACEUPDATE_KS
- ALTER KEYSPACECREATE_INDEX
- CREATE INDEXDROP_INDEX
- DROP INDEXCREATE_VIEW
- DROP INDEXDROP_VIEW
- DROP INDEXUPDATE_VIEW
- DROP INDEXCREATE_TYPE
- DROP INDEXDROP_TYPE
- DROP INDEXUPDATE_TYPE
- DROP INDEXCREATE_FUNCTION
- DROP INDEXDROP_FUNCTION
- DROP INDEXCREATE_AGGREGATE
- DROP INDEXDROP_AGGREGATE
- DROP INDEXSOLR_RELOAD_SEARCH_INDEX
- RELOAD SEARCH INDEXSOLR_REBUILD_SEARCH_INDEX
- REBUILD SEARCH INDEXSOLR_GET_RESOURCE
- dsetool create_coreSOLR_UPDATE_RESOURCE
- dsetool reload_coreSOLR_ALTER_SEARCH_INDEX_STATEMENT
- ALTER SEARCH INDEX CONFIGまたはALTER SEARCH INDEX SCHEMASOLR_CREATE_SEARCH_INDEX_STATEMENT
- CREATE SEARCH INDEX
- DCL
- (データ制御構文) - 以下のタイプのロールおよびパーミッションの管理イベントを記録します。
CREATE_ROLE
- CREATE ROLEALTER_ROLE
- ALTER ROLEDROP_ROLE
- DROP ROLELIST_ROLES
- LIST ROLESGRANT
- GRANTREVOKE
- REVOKERESTRICT
- RESTRICTUNRESTRICT
- UNRESTRICTRESTRICT ROWS
- RESTRICT ROWSUNRESTRICT ROWS
- UNRESTRICT ROWSLIST_PERMISSIONS
- LIST PERMISSIONS
- AUTH
- (認識)以下のタイプの認識関連イベントをログに記録します。
LOGIN
- 成功したログイン。LOGINおよびDataStaxドライバーから送信されたログイン要求。LOGIN_ERROR
- 失敗したログイン。UNAUTHORIZED_ATTEMPT
。
注: 捕捉されなかったメッセージには、以下が含まれていました。- DSEは、成功したKerberos認証イベントをログに記録しません。KDS(Kerberos Distribution Server)からのKerberos認証を監査してください。DataStax Enterpriseログに、失敗したKerberos認証要求がタイプ
LOGIN_ERROR
として記録されています。 - キースペースがホワイトリストに含まれているときは、
included_keyspaces
、AUTH
メッセージが捕捉されません。
- ERROR
- CQLステートメントの失敗を記録します。唯一のタイプは
REQUEST_FAILURE
です。 - UNKNOWN
- カテゴリーとタイプが両方とも
UNKNOWN
であるイベントをログに記録します。
例
audit_logging_options: enabled: true logger: SLF4JAuditWriter included_categories: QUERY, DDL, AUTH # excluded_categories:
キースペースのフィルター処理
イベントを捕捉するキースペースを設定します。
dse.yaml
dse.yamlファイルの場所は、インストールのタイプによって異なります。パッケージ・インストール | /etc/dse/dse.yaml |
tarボール・インストール | installation_location/resources/dse/conf/dse.yaml |
audit_logging_options: enabled: true logger: logger_name # included_categories: # excluded_categories: # included_keyspaces: # excluded_keyspaces:logger_nameは、
SLF4JAuditWriter
またはCassandraAuditWriter
です。included_keyspaces
- 一致するキースペースのみを含め、他はすべて除外します。注: キースペースがホワイトリストに含まれているときは、included_keyspaces
、AUTH
メッセージが捕捉されません。excluded_keyspaces
- 一致するキースペースを除外し、他はすべて含めます。
名前のカンマ区切りのリストまたは1つの正規表現を使用してキースペースを一致させます。
例
audit_logging_options: enabled: true logger: logger_name # included_categories: # excluded_categories: # included_keyspaces: excluded_keyspaces: system_local
ロールのフィルター処理
特定のロールのアクティビティーのみを追跡します。
dse.yaml
dse.yamlファイルの場所は、インストールのタイプによって異なります。パッケージ・インストール | /etc/dse/dse.yaml |
tarボール・インストール | installation_location/resources/dse/conf/dse.yaml |
audit_logging_options: enabled: true logger: logger_name # included_categories: # excluded_categories: # included_keyspaces: # excluded_keyspaces: # included_roles: # excluded_roles:logger_nameは、
SLF4JAuditWriter
またはCassandraAuditWriter
です。included_roles
- 一致するロールのみを含め、他はすべて除外します。excluded_keyspaces
- 一致するロールのみを含め、他はすべて除外します。
名前のカンマ区切りリストを使用してロールを一致させます。
例
dse_admin
とjim
を除くすべてのロールのイベントが捕捉されます。audit_logging_options: enabled: true logger: CassandraAuditWriter # included_categories: # excluded_categories: # included_keyspaces: # excluded_keyspaces: # included_roles: excluded_roles: dse_admin, jim
監査ログ内の機密データの置き換え
ログに書き込まれる前に、機密データをマスクするようにDSE監査ライターを構成します。
監査ログが有効になっていて、DMLカテゴリー・イベントが含まれている場合、パスワード・カラムなどの機密データが監査ログのメッセージ部分に公開されます。監査ログ・アペンダー(SLF4JAuditWriterAppender
)を構成して、ログ・メッセージ内の文字列を置き換えて機密データをマスクすることができます。置換機能では正規表現を使用してデータを変更します。置き換えフィルターの使用方法の詳細については、ログバックのドキュメントを参照してください。
logback.xml
logback.xmlファイルの場所は、インストールのタイプによって異なります。パッケージ・インストール | /etc/dse/cassandra/logback.xml |
tarボール・インストール | installation_location/resources/cassandra/conf/logback.xml |
手順
- テキスト・エディターで logback.xml ファイルを開きます。
-
パターン要素を特定します。
<!--audit log--> <appender name="SLF4JAuditWriterAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${cassandra.logdir}/audit/audit.log</file> <!-- logfile location --> <encoder> <pattern>%-5level [%thread] %date{ISO8601} %F:%L - %msg%n</pattern> <!-- the layout pattern used to format log entries --> <immediateFlush>true</immediateFlush> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>${cassandra.logdir}/audit/audit.log.%i.zip</fileNamePattern> <minIndex>1</minIndex> <maxIndex>20</maxIndex> <!-- max number of archived logs that are kept --> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>200MB</maxFileSize> <!-- The size of the logfile that triggers a switch to a new logfile, and the current one archived --> </triggeringPolicy> </appender> <logger name="SLF4JAuditWriter" level="INFO" additivity="false"> <appender-ref ref="SLF4JAuditWriterAppender"/> </logger>
-
メッセージ・テキストに置換機能を使用して、最初の用語を2番目の用語に置き換えます。たとえば、任意の文字に設定されたパスワードを検索し、そのパスワード文字を
xxxxx
に置き換える場合は、次のようにします。%replace(%msg){"password\s*=\s*'.*'", "password='xxxxx'"}
注: DataStaxは、CREATE ROLEコマンドで指定されたパスワードを自動的にマスクします。 - ノードを再起動するか、構成が自動的に再度読み込まれるのを待ちます。
監査ロガー設定の管理
SLF4JAuditWriterログ・ファイルの場所、名前、ロール頻度、および名前を変更します。
SLF4JAuditWriter
ログ・ファイル構成を設定します。<!--audit log--> <appender name="SLF4JAuditWriterAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${cassandra.logdir}/audit/audit.log</file> <!-- logfile location --> <encoder> <pattern>%-5level [%thread] %date{ISO8601} %F:%L - %msg%n</pattern> <!-- the layout pattern used to format log entries --> <immediateFlush>true</immediateFlush> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>${cassandra.logdir}/audit/audit.log.%i.zip</fileNamePattern> <minIndex>1</minIndex> <maxIndex>20</maxIndex> <!-- max number of archived logs that are kept --> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>200MB</maxFileSize> <!-- The size of the logfile that triggers a switch to a new logfile, and the current one archived --> </triggeringPolicy> </appender> <logger name="SLF4JAuditWriter" level="INFO" additivity="false"> <appender-ref ref="SLF4JAuditWriterAppender"/> </logger>
logback.xml
logback.xmlファイルの場所は、インストールのタイプによって異なります。パッケージ・インストール | /etc/dse/cassandra/logback.xml |
tarボール・インストール | installation_location/resources/cassandra/conf/logback.xml |
手順
- テキスト・エディターで logback.xml ファイルを開きます。
-
データ監査を構成するには、プロパティを変更します。
file
- ロケーション・システム上のログファイルのパス。pattern
- ログ・メッセージを書き込む変数。機密データを非表示にするには、「監査ログの機密データの置換」を参照してください。immediateFlush
- イベント・メッセージをすぐにログに書き込むかどうか。fileNamePattern
- ログ・ファイルがロールされるときの名前の規則。maxFileSize
- ログをロールするしきい値(最大ログ・サイズ)。
- ノードを再起動するか、構成が自動的に再度読み込まれるのを待ちます。
認証のデバッグを有効にする
認証デバッグ・メッセージをdebug.logに捕捉します。
最初にKerberosやLDAPなどの外部認証を設定するときは、内部、LDAP、およびKerberosデバッグ・メッセージをdebug.logに捕捉するために、server
およびauthenitcation
ロガーをTRACE
レベルで使用します。
logback.xml
logback.xmlファイルの場所は、インストールのタイプによって異なります。パッケージ・インストール | /etc/dse/cassandra/logback.xml |
tarボール・インストール | installation_location/resources/cassandra/conf/logback.xml |
手順
-
logback.xml ファイルを見つけて、その末尾に以下の行を含めます。
<logger name="com.datastax.bdp.transport.server" level="TRACE"/> <logger name="com.datastax.bdp.cassandra.auth" level="TRACE"/>
ローカル・ノードからのアクティビティーのみが記録されます。認証のトラブル・シューティングを行うノードで認証トレースを有効にします。 - ノードを再起動するか、構成が自動的に再度読み込まれるのを待ちます。
-
debug.logを追跡します。
tail -f /etc/dse/cassandra/debug.log
- 外部サーバーのアカウントを使用してログインします。
例
TRACE [IOThread-0] 2018-04-24 21:07:26,565 LdapUtils.java:484 - [ldap-fetch-user] username: dantest1 connection: org.apache.directory.ldap.client.api.LdapNetworkConnection@430680df
TRACE [IOThread-0] 2018-04-24 21:07:26,566 LdapUtils.java:499 - [ldap-fetch-user] bind to connection
TRACE [IOThread-0] 2018-04-24 21:07:26,568 LdapUtils.java:508 - [ldap-fetch-user] user_search_base: ou=users,dc=qaldap,dc=datastax,dc=lan, user_search_filter: (uid=dantest1)
TRACE [IOThread-0] 2018-04-24 21:07:26,608 LdapUtils.java:517 - [ldap-fetch-user] found entry for username: dantest1
TRACE [IOThread-0] 2018-04-24 21:07:26,610 LdapUtils.java:433 - [ldap-bind] userDN: cn=dantest1,ou=users,dc=qaldap,dc=datastax,dc=lan connection: org.apache.directory.ldap.client.api.LdapNetworkConnection@430680df
TRACE [IOThread-0] 2018-04-24 21:07:26,611 LdapUtils.java:438 - [ldap-bind] SUCCESS - bind succcessful for userDN: cn=dantest1,ou=users,dc=qaldap,dc=datastax,dc=lan
TRACE [IOThread-0] 2018-04-24 21:07:26,613 LdapUtils.java:325 - [ldap-authenticate] SUCCESS - username: dantest1, userDN: cn=dantest1,ou=users,dc=qaldap,dc=datastax,dc=lan
例
TRACE [IOThread-0] 2018-04-24 21:18:23,434 LdapUtils.java:303 - [ldap-authenticate] username: dantest1 not found in cache
TRACE [IOThread-0] 2018-04-24 21:18:23,434 LdapUtils.java:484 - [ldap-fetch-user] username: dantest1 connection: org.apache.directory.ldap.client.api.LdapNetworkConnection@430680df
TRACE [IOThread-0] 2018-04-24 21:18:23,434 LdapUtils.java:499 - [ldap-fetch-user] bind to connection
TRACE [IOThread-0] 2018-04-24 21:18:23,437 LdapUtils.java:508 - [ldap-fetch-user] user_search_base: ou=users,dc=qaldap,dc=datastax,dc=lan, user_search_filter: (uid=dantest1)
TRACE [IOThread-0] 2018-04-24 21:18:23,440 LdapUtils.java:517 - [ldap-fetch-user] found entry for username: dantest1
TRACE [IOThread-0] 2018-04-24 21:18:23,441 LdapUtils.java:433 - [ldap-bind] userDN: cn=dantest1,ou=users,dc=qaldap,dc=datastax,dc=lan connection: org.apache.directory.ldap.client.api.LdapNetworkConnection@430680df
TRACE [IOThread-0] 2018-04-24 21:18:23,451 LdapUtils.java:447 - [ldap-bind] ERROR - bind failed for userDN: cn=dantest1,ou=users,dc=qaldap,dc=datastax,dc=lan
...