Apache > ZooKeeper
 

ZooKeeper監査ログ

ZooKeeper監査ログ

Apache ZooKeeperはバージョン3.6.0から監査ログをサポートしています。デフォルトでは、監査ログは無効になっています。監査ログを有効にするには、conf/zoo.cfgでaudit.enable=trueを設定します。監査ログはすべてのZooKeeperサーバーに記録されるのではなく、以下の図に示すように、クライアントが接続しているサーバーでのみ記録されます。

Audit Logs

監査ログは、監査対象として選択された操作の詳細な情報をキャプチャします。監査情報は、以下のキーに対して、key=valueのペアのセットとして書き込まれます。

キー
セッションクライアントセッションID
ユーザークライアントセッションに関連付けられているユーザーのコンマ区切りリスト。詳細については、監査ログでユーザーとして扱われるのは誰ですか?を参照してください。
ipクライアントIPアドレス
操作監査対象として選択された操作のいずれか。可能な値は(serverStart, serverStop, create, delete, setData, setAcl, multiOperation, reconfig, ephemeralZNodeDeleteOnSessionClose)です。
znodeznodeのパス
znodeのタイプ作成操作の場合のznodeのタイプ
aclznode ACLの文字列表現(cdrwa(作成、削除、読み取り、書き込み、管理)など)。これはsetAcl操作の場合のみ記録されます。
結果操作の結果。可能な値は(成功/失敗/呼び出し済み)です。結果「呼び出し済み」は、停止がサーバーが実際に停止する前に記録されるため、serverStop操作に使用されます。

以下は、クライアントが192.168.1.2から接続され、クライアントプリンシパルがzkcli@HADOOP.COM、サーバープリンシパルがzookeeper/192.168.1.3@HADOOP.COMである場合の、すべての操作のサンプル監査ログです。

user=zookeeper/192.168.1.3 operation=serverStart   result=success
session=0x19344730000   user=192.168.1.2,zkcli@HADOOP.COM  ip=192.168.1.2    operation=create    znode=/a    znode_type=persistent  result=success
session=0x19344730000   user=192.168.1.2,zkcli@HADOOP.COM  ip=192.168.1.2    operation=create    znode=/a    znode_type=persistent  result=failure
session=0x19344730000   user=192.168.1.2,zkcli@HADOOP.COM  ip=192.168.1.2    operation=setData   znode=/a    result=failure
session=0x19344730000   user=192.168.1.2,zkcli@HADOOP.COM  ip=192.168.1.2    operation=setData   znode=/a    result=success
session=0x19344730000   user=192.168.1.2,zkcli@HADOOP.COM  ip=192.168.1.2    operation=setAcl    znode=/a    acl=world:anyone:cdrwa  result=failure
session=0x19344730000   user=192.168.1.2,zkcli@HADOOP.COM  ip=192.168.1.2    operation=setAcl    znode=/a    acl=world:anyone:cdrwa  result=success
session=0x19344730000   user=192.168.1.2,zkcli@HADOOP.COM  ip=192.168.1.2    operation=create    znode=/b    znode_type=persistent  result=success
session=0x19344730000   user=192.168.1.2,zkcli@HADOOP.COM  ip=192.168.1.2    operation=setData   znode=/b    result=success
session=0x19344730000   user=192.168.1.2,zkcli@HADOOP.COM  ip=192.168.1.2    operation=delete    znode=/b    result=success
session=0x19344730000   user=192.168.1.2,zkcli@HADOOP.COM  ip=192.168.1.2    operation=multiOperation    result=failure
session=0x19344730000   user=192.168.1.2,zkcli@HADOOP.COM  ip=192.168.1.2    operation=delete    znode=/a    result=failure
session=0x19344730000   user=192.168.1.2,zkcli@HADOOP.COM  ip=192.168.1.2    operation=delete    znode=/a    result=success
session=0x19344730001   user=192.168.1.2,zkcli@HADOOP.COM  ip=192.168.1.2    operation=create   znode=/ephemral znode_type=ephemral result=success
session=0x19344730001   user=zookeeper/192.168.1.3   operation=ephemeralZNodeDeletionOnSessionCloseOrExpire  znode=/ephemral result=success
session=0x19344730000   user=192.168.1.2,zkcli@HADOOP.COM  ip=192.168.1.2    operation=reconfig  znode=/zookeeper/config result=success
user=zookeeper/192.168.1.3 operation=serverStop    result=invoked

ZooKeeper監査ログ設定

デフォルトでは、監査ログは無効になっています。監査ログを有効にするには、conf/zoo.cfgaudit.enable=trueを設定します。監査ログはlogbackを使用して行われます。以下は、conf/logback.xmlの監査ログのデフォルトのlogback構成です。

<!--
  zk audit logging
-->
<!--property name="zookeeper.auditlog.file" value="zookeeper_audit.log" />
<property name="zookeeper.auditlog.threshold" value="INFO" />
<property name="audit.logger" value="INFO, RFAAUDIT" />

<appender name="RFAAUDIT" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <File>${zookeeper.log.dir}/${zookeeper.auditlog.file}</File>
  <encoder>
    <pattern>%d{ISO8601} %p %c{2}: %m%n</pattern>
  </encoder>
  <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <level>${zookeeper.auditlog.threshold}</level>
  </filter>
  <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
    <maxIndex>10</maxIndex>
    <FileNamePattern>${zookeeper.log.dir}/${zookeeper.auditlog.file}.%i</FileNamePattern>
  </rollingPolicy>
  <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
    <MaxFileSize>10MB</MaxFileSize>
  </triggeringPolicy>
</appender>

<logger name="org.apache.zookeeper.audit.Slf4jAuditLogger" additivity="false" level="${audit.logger}">
  <appender-ref ref="RFAAUDIT" />
</logger-->

上記の構成を変更して、監査ログファイル、バックアップ数、最大ファイルサイズ、カスタム監査ロガーなどをカスタマイズします。

監査ログでユーザーとして扱われるのは誰ですか?

デフォルトでは、認証プロバイダーは4つしかありません。

ユーザーは、構成された認証プロバイダーに基づいて決定されます。

カスタム認証プロバイダーは、ユーザー名を提供するために、org.apache.zookeeper.server.auth.AuthenticationProvider.getUserName(String id)をオーバーライドできます。認証プロバイダーがこのメソッドをオーバーライドしていない場合、org.apache.zookeeper.data.Id.idに格納されているものがユーザーとして扱われます。通常、このフィールドにはユーザー名のみが格納されますが、カスタム認証プロバイダーがそこに何を格納するかは自由です。監査ログの場合、org.apache.zookeeper.data.Id.idの値がユーザーとして扱われます。

ZooKeeperサーバーでは、すべての操作がクライアントによって実行されるのではなく、一部の操作はサーバー自体によって実行されます。たとえば、クライアントがセッションを閉じると、一時的なznodeはサーバーによって削除されます。これらの削除はクライアントによって直接実行されるのではなく、サーバー自体によって実行されます。これらはシステム操作と呼ばれます。これらのシステム操作の場合、これらの操作を監査ログに記録する際に、ZooKeeperサーバーに関連付けられているユーザーがユーザーとして扱われます。たとえば、ZooKeeperサーバーのプリンシパルがzookeeper/hadoop.hadoop.com@HADOOP.COMの場合、これがシステムユーザーになり、すべてのシステム操作はこのユーザー名で記録されます。

user=zookeeper/hadoop.hadoop.com@HADOOP.COM operation=serverStart result=success

ZooKeeperサーバーに関連付けられたユーザーが存在しない場合、ZooKeeperサーバーを開始したユーザーがユーザーとして扱われます。たとえば、サーバーがrootによって開始された場合、rootがシステムユーザーとして扱われます。

user=root operation=serverStart result=success

単一のクライアントは、複数の認証スキームをセッションに添付できます。この場合、認証されたすべてのスキームがユーザーとして扱われ、コンマ区切りリストとして表示されます。たとえば、クライアントがプリンシパルzkcli@HADOOP.COMとip 127.0.0.1で認証されている場合、znodeを作成する監査ログは次のようになります。

session=0x10c0bcb0000 user=zkcli@HADOOP.COM,127.0.0.1 ip=127.0.0.1 operation=create znode=/a result=success