データベース監査のセットアップ

DataStax Enterpriseデータベースのアクティビティーをログファイルまたはテーブルに捕捉します。

logback.xml

logback.xmlファイルの場所は、インストールのタイプによって異なります。
パッケージ・インストール /etc/dse/cassandra/logback.xml
tarボール・インストール installation_location/resources/cassandra/conf/logback.xml
DataStax Enterprise(DSE)データベースのアクティビティーをログ・ファイルまたはテーブルに捕捉します。各ノードは、ローカルで発生したイベントのみを記録します。構成を使用して、捕捉するイベントのタイプを調整できます。DSEでは以下のカスタマイズが可能です。
  • キースペースのフィルター処理 - すべてのキースペースのアクティビティー、またはターゲット・キースペースのみのアクティビティーを捕捉します。正規表現を使用してキースペース名をフィルター処理します。
  • カテゴリーのフィルター処理 - イベント・カテゴリーを使用して、捕捉するイベントの数を制限します。
  • ロールのフィルター処理 - ログイン・ロール名に基づいて特定のユーザーまたはグループのアクティビティーを追跡します。
  • ノード固有 - 1つ以上のノードの監査を有効にします。特定のノードのみ、データ・センター全体、またはクラスター全体の監査を許可します。
ヒント: ログ・レベルを構成し、機密データをマスクし、ログ・ファイルのファイル名、場所、サイズのしきい値、および最大ログ・ファイルをlogback.xml ファイルで設定します。

ファイルまたはテーブルの選択

監査ログ・オプションはノードごとに設定するため、ノードごとに変えることができます。DataStax Enterprise(DSE)は、以下の方法でデータベース・アクティビティーを記録することをサポートしています。
  • ログ・ファイル(ノードごと) - 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.logファイルのデータ暗号化はサポートされていません。暗号化は、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_optionsdse.yaml ファイルで設定します。
audit_logging_options:
    enabled: true
    logger: SLF4JAuditWriter
  • 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テーブルにイベントを捕捉するには:
  1. audit_logging_optionsdse.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';
  2. (オプション)デフォルトでは、NodeSyncはaudit_logテーブルに対して無効になっています。NodeSyncを使用してデータの一貫性を維持するには、これを有効にします。
    ALTER TABLE dse_audit.audit_log WITH 
    nodesync = { 'enabled' : true };
  3. キースペース・レプリケーション・ストラテジをNetworkTopologyStrategyに設定し、監査が有効になっているクラスター内の各データ・センターのレプリケーション係数を設定します。
    ALTER KEYSPACE dse_audit WITH 
    replication = {
                   'class': 'NetworkTopologyStrategy', 
                   'datacenter1' : 2, 
                   'datacenter2' : 1   };
  4. 次のいずれかの方法を使用して、新しく追加されたデータ・センターにデータ・レプリケーションを強制します。
    • 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

イベント・カテゴリーのフィルター処理

ログに記録するイベント・カテゴリーを設定します。

dse.yaml

dse.yamlファイルの場所は、インストールのタイプによって異なります。
パッケージ・インストール /etc/dse/dse.yaml
tarボール・インストール installation_location/resources/dse/conf/dse.yaml
捕捉するカテゴリーを、 dse.yamlaudit_logging_optionsセクションで構成します。
audit_logging_options:
    enabled: true
    logger: logger_name
#    included_categories:
#    excluded_categories:
logger_nameは、SLF4JAuditWriterまたはCassandraAuditWriterです。
デフォルトでは、両方のカテゴリー・パラメーターがコメントアウトされているため、すべてのイベントが捕捉されます。捕捉するイベントを制限するには、以下のパラメーターのいずれか1つのみを使用します。
  • included_categories - 記載されているカテゴリーのみを含め、他はすべて除外します。
  • excluded_categories - 記載されているカテゴリー除外し、他はすべて含めます。
カテゴリー・キーワードは、以下のとおりです。

カテゴリーの種類

デフォルトでは、監査が有効な場合、DataStax Enterpriseはすべてのイベント・カテゴリーを捕捉します。included_categoriesまたはexcluded_categoriesパラメーターを使用して、捕捉するカテゴリーを制限します。

すべてのイベントには、カテゴリーとタイプの両方があります。タイプは、通常、CQLコマンドに直接マップされます。以下に、カテゴリーごとのすべてのタイプを示します。
QUERY
以下のタイプのデータ取得イベントをログに記録します。
  • CQL_SELECT - SELECT
  • SOLR_QUERY - 検索インデックスによってフィルター処理されるSELECTステートメント
  • GRAPH_TINKERPOP_TRAVERSAL - グラフ探索インスタンス(g)を使用してテーブルを呼び出します。「グラフと走査に関するプロパティの検出」を参照してください
  • RPC_CALL_STATEMENT
DML
(データ操作言語)以下のタイプのデータ変更のログを記録します。
DDL
(データ定義言語)以下のタイプのデータベース・スキーマの変更に関するログを記録します。
DCL
(データ制御構文) - 以下のタイプのロールおよびパーミッションの管理イベントを記録します。
AUTH
(認識)以下のタイプの認識関連イベントをログに記録します。
  • LOGIN - 成功したログイン。LOGINおよびDataStaxドライバーから送信されたログイン要求。
  • LOGIN_ERROR - 失敗したログイン。
  • UNAUTHORIZED_ATTEMPT
注: 捕捉されなかったメッセージには、以下が含まれていました。
  • DSEは、成功したKerberos認証イベントをログに記録しません。KDS(Kerberos Distribution Server)からのKerberos認証を監査してください。DataStax Enterpriseログに、失敗したKerberos認証要求がタイプLOGIN_ERRORとして記録されています。
  • キースペースがホワイトリストに含まれているときは、included_keyspacesAUTHメッセージが捕捉されません。
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
捕捉するキースペースを、 dse.yamlaudit_logging_optionsセクションで構成します。
audit_logging_options:
    enabled: true
    logger: logger_name
#    included_categories:
#    excluded_categories:
#    included_keyspaces:
#    excluded_keyspaces:
logger_nameは、SLF4JAuditWriterまたはCassandraAuditWriterです。
デフォルトでは、両方のキースペース・パラメーターがコメントアウトされているため、すべてのイベントが捕捉されます。捕捉するイベントを制限するには、以下のパラメーターのいずれか1つのみを使用します。
  • included_keyspaces - 一致するキースペースのみを含め、他はすべて除外します。
    注: キースペースがホワイトリストに含まれているときは、included_keyspacesAUTHメッセージが捕捉されません。
  • excluded_keyspaces - 一致するキースペースを除外し、他はすべて含めます。

名前のカンマ区切りのリストまたは1つの正規表現を使用してキースペースを一致させます。

システム・ローカル・キースペースは、ログインするたびにクエリーされます。以下の除外項目は、system_localキースペースへの追加クエリーを表示せずにログイン・イベントを表示します。
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
特定のログイン・ロールのアクティビティー追跡を、dse.yamlaudit_logging_optionsセクションで設定します。
audit_logging_options:
    enabled: true
    logger: logger_name
#    included_categories:
#    excluded_categories:
#    included_keyspaces:
#    excluded_keyspaces:
#    included_roles:
#    excluded_roles:
logger_nameは、SLF4JAuditWriterまたはCassandraAuditWriterです。
デフォルトでは、両方のロール・パラメーターがコメントアウトされているため、すべてのロールのイベントが捕捉されます。アクティビティーを追跡するロールを制限するには、以下のパラメーターのいずれか1つのみを使用します。
  • included_roles - 一致するロールのみを含め、他はすべて除外します。
  • excluded_keyspaces - 一致するロールのみを含め、他はすべて除外します。

名前のカンマ区切りリストを使用してロールを一致させます。

dse_adminjimを除くすべてのロールのイベントが捕捉されます。
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)を構成して、ログ・メッセージ内の文字列を置き換えて機密データをマスクすることができます。置換機能では正規表現を使用してデータを変更します。置き換えフィルターの使用方法の詳細については、ログバックのドキュメントを参照してください。

さらに、監査はファイル・システム内のテキスト・ファイルを使用して構成されるため、このファイルはOSレベルのセキュリティ侵害に対して脆弱です。監査ファイルのパーミッションを0600に設定すると、ファイルをセキュリティ保護できます。他のツールを使用してデータを確認する場合は、この設定を変更すると読み取り問題が発生する可能性があることに注意してください。あるいは、監査ファイルをVormetricなどOSレベルの暗号化されたファイル・システムに格納することもできます。
ヒント: ログ・ファイルを共有する前に、機密データを編集します。

logback.xml

logback.xmlファイルの場所は、インストールのタイプによって異なります。
パッケージ・インストール /etc/dse/cassandra/logback.xml
tarボール・インストール installation_location/resources/cassandra/conf/logback.xml

手順

  1. テキスト・エディターで logback.xml ファイルを開きます。
  2. パターン要素を特定します。
    <!--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>
  3. メッセージ・テキストに置換機能を使用して、最初の用語を2番目の用語に置き換えます。たとえば、任意の文字に設定されたパスワードを検索し、そのパスワード文字をxxxxxに置き換える場合は、次のようにします。
    %replace(%msg){"password\s*=\s*'.*'", "password='xxxxx'"}
    注: DataStaxは、CREATE ROLEコマンドで指定されたパスワードを自動的にマスクします。
  4. ノードを再起動するか、構成が自動的に再度読み込まれるのを待ちます。

監査ロガー設定の管理

SLF4JAuditWriterログ・ファイルの場所、名前、ロール頻度、および名前を変更します。

この logback.xml ファイルには、場所、名前、ロール頻度と保持、レベルなどの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>
警告: ほとんどのデータベース・アクティビティー・レベルはINFOです。

logback.xml

logback.xmlファイルの場所は、インストールのタイプによって異なります。
パッケージ・インストール /etc/dse/cassandra/logback.xml
tarボール・インストール installation_location/resources/cassandra/conf/logback.xml

手順

  1. テキスト・エディターで logback.xml ファイルを開きます。
  2. データ監査を構成するには、プロパティを変更します。
    • file - ロケーション・システム上のログファイルのパス。
    • pattern - ログ・メッセージを書き込む変数。機密データを非表示にするには、「監査ログの機密データの置換」を参照してください。
    • immediateFlush - イベント・メッセージをすぐにログに書き込むかどうか。
    • fileNamePattern - ログ・ファイルがロールされるときの名前の規則。
    • maxFileSize - ログをロールするしきい値(最大ログ・サイズ)。
  3. ノードを再起動するか、構成が自動的に再度読み込まれるのを待ちます。

認証のデバッグを有効にする

認証デバッグ・メッセージを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

手順

  1. logback.xml ファイルを見つけて、その末尾に以下の行を含めます。
       <logger name="com.datastax.bdp.transport.server" level="TRACE"/>
       <logger name="com.datastax.bdp.cassandra.auth" level="TRACE"/>
    ローカル・ノードからのアクティビティーのみが記録されます。認証のトラブル・シューティングを行うノードで認証トレースを有効にします。
  2. ノードを再起動するか、構成が自動的に再度読み込まれるのを待ちます。
  3. debug.logを追跡します。
    tail -f /etc/dse/cassandra/debug.log
  4. 外部サーバーのアカウントを使用してログインします。

成功したLDAPログインからの出力:
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

失敗したLDAPログインからの出力:
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
...