ZooKeeper監査ログ
ZooKeeper監査ログ
Apache ZooKeeperはバージョン3.6.0から監査ログをサポートしています。デフォルトでは、監査ログは無効になっています。監査ログを有効にするには、conf/zoo.cfgでaudit.enable=trueを設定します。監査ログはすべてのZooKeeperサーバーに記録されるのではなく、以下の図に示すように、クライアントが接続しているサーバーでのみ記録されます。
監査ログは、監査対象として選択された操作の詳細な情報をキャプチャします。監査情報は、以下のキーに対して、key=valueのペアのセットとして書き込まれます。
キー | 値 |
---|---|
セッション | クライアントセッションID |
ユーザー | クライアントセッションに関連付けられているユーザーのコンマ区切りリスト。詳細については、監査ログでユーザーとして扱われるのは誰ですか?を参照してください。 |
ip | クライアントIPアドレス |
操作 | 監査対象として選択された操作のいずれか。可能な値は(serverStart, serverStop, create, delete, setData, setAcl, multiOperation, reconfig, ephemeralZNodeDeleteOnSessionClose)です。 |
znode | znodeのパス |
znodeのタイプ | 作成操作の場合のznodeのタイプ |
acl | znode 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.cfgでaudit.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つしかありません。
- IPAuthenticationProvider
- SASLAuthenticationProvider
- X509AuthenticationProvider
- DigestAuthenticationProvider
ユーザーは、構成された認証プロバイダーに基づいて決定されます。
- IPAuthenticationProviderが構成されている場合、認証されたIPがユーザーとして扱われます。
- SASLAuthenticationProviderが構成されている場合、クライアントプリンシパルがユーザーとして扱われます。
- X509AuthenticationProviderが構成されている場合、クライアント証明書がユーザーとして扱われます。
- DigestAuthenticationProviderが構成されている場合、認証されたユーザーがユーザーとして扱われます。
カスタム認証プロバイダーは、ユーザー名を提供するために、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