安全/加密log4j文件

sha*_*eef 17 java encryption log4j

我有个问题 ; 安全要求我有java swing应用程序,它具有log4j生成的日志文件,用于跟踪错误时的支持问题.

我必须ecrypt/cypher/secure文件,以便客户端无法打开它们并看到它们(至少不是人类可读的方式),同时当支持技术团队获取这些文件时,他们将知道如何阅读(解密)它们.

我做了很多搜索,我尝试了我发现的最佳选项,即通过扩展构建自定义appender SkeletonAppender.

现在知道我有log4j工作得很好,如下面的配置,但我创建了新的类来加密它,但我不能让它工作,即使简单的设置它不会创建文件,所以我可以继续在ecnryption部分.

任何帮助,链接都很好.

工作...版本

<appender name="cache" class="com.MyAppender">  
            <param name="Threshold" value="ALL" />
            <param name="ImmediateFlush" value="true" />  
            <param name="File" value="${home}/logs/cache.log"/> 
            <param name="Append" value="true"/>
            <param name="Threshold" value="ALL" />
            <param name="Encoding" value="UTF-8" />

            <layout class="org.apache.log4j.EnhancedPatternLayout">
            <param name="ConversionPattern" value="%-5p %d{MMM-dd-yyyy HH:mm:ss,SSS} %c{1} - %m%n" />
        </layout>
    </appender>
Run Code Online (Sandbox Code Playgroud)

不工作......版本

   <appender name="cache" class="com.MyAppender">   
            <param name="Threshold" value="ALL" />
            <param name="ImmediateFlush" value="true" />  
            <param name="File" value="${home}/logs/cache.log"/> 
            <param name="Append" value="true"/>
            <param name="Threshold" value="ALL" />
            <param name="Encoding" value="UTF-8" />

            <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
                 <param name="FileNamePattern"
            value="${home}/logs/cache.%d{yyyy-MM-dd-HH}.gz" />
                 <param name="ActiveFileName" value="${home}/logs/cache.log" />
             </rollingPolicy> 

            <layout class="org.apache.log4j.EnhancedPatternLayout">
            <param name="ConversionPattern"
                value="%-5p %d{MMM-dd-yyyy HH:mm:ss,SSS} %c{1} - %m%n" />
        </layout>
    </appender>
Run Code Online (Sandbox Code Playgroud)

简单的班级考试

http://www.javaworld.com/article/2075817/core-java/customized-appender-extending-org-apache-log4j-fileappender.html

package com.MyAppender;

import org.apache.log4j.spi.LoggingEvent;

public class MyAppender extends org.apache.log4j.RollingFileAppender {

    private String file;
    private boolean initialized = false;
    private String baseFileName = null;

    // private static final Log log = LogFactory.getLog(MyAppender.class);

    /**
     * 
     * write to ActivityLog
     * 
     * @param event
     *            logging event invoked.
     * 
     */
    @Override
    protected void subAppend(LoggingEvent event) {
        if (!initialized) {
            createNewFile();
        }
        synchronized (this) {
            super.subAppend(event);
        }
    }

    /**
     * 
     * create a new ActivityLog File
     * 
     */
    public void createNewFile() {
        try {
            baseFileName = file;
            super.setFile(baseFileName);
            super.activateOptions();
            initialized = true;
        } catch (Exception e) {
            // log.error("*#*Error in configuration of log4j params,unable to create ActivityLog file");
        }
    }

    /**
     * 
     * invokes File Appender's activateOptions() which controls the creation of
     * log files.
     * 
     */
    @Override
    public void activateOptions() {
        super.setFile(file);
        super.activateOptions();
    }

    /**
     * 
     * Close and rename the current ActivityLog file and reset counter and
     * timestamp.
     * 
     */
    public void rollOver() {
        closeFile();
        initialized = false;
    }

    @Override
    public void setFile(String file) {
        this.file = file;
    }

}
Run Code Online (Sandbox Code Playgroud)

然后我计划在Cipher OutputStream中实现代码

Zim*_*oot 9

该问题的一个可能的解决方法是将日志写入支持加密的嵌入式数据库,例如H2本身支持加密,SQLite具有开源加密扩展 - 这样您就可以使用JDBCAppender并让数据库负责加密而无需担心自定义appender.


这个问题,SQLite配置看起来像

<appender name="jdbcAppender" class="org.apache.log4j.jdbc.JDBCAppender">
    <param name="URL" value="jdbc:sqlite:D:/download/mapLogic/sf_log.db" />
    <param name="user" value="" />
    <param name="password" value="" />
    <param name="driver" value="org.sqlite.JDBC" />
    <param name="sql"
        value="INSERT INTO Log(Message,Priority,Logger,Date) VALUES ('%m','%p','%c','%d{ABSOLUTE}')" />
</appender>
Run Code Online (Sandbox Code Playgroud)

您的日志表的样子

CREATE TABLE Log (
    LogId        INTEGER PRIMARY KEY,
    Date         DATETIME NOT NULL,
    Level        VARCHAR(50) NOT NULL,
    Logger       VARCHAR(255) NOT NULL,
    Message      TEXT DEFAULT NULL
);
Run Code Online (Sandbox Code Playgroud)

有关的文档JDBCAppender可以在这里找到


SQLite 的官方加密扩展以及至少一个第三方开源扩展; 我从来没有必要加密SQLite,但如果我必须这样做,那么除非我遇到问题,否则我会使用官方扩展.


如果你在客户端上运行它,那么理想情况下你将能够在启动时让程序电话回家以获取数据库加密密钥,以便密钥永远不会存在于客户端的磁盘驱动器上(忽略它的可能性)到交换文件) - 客户端仍然可以使用调试器或其他任何东西来尝试获取密钥内存,但可能他们对解密日志没有足够的兴趣来解决这个问题.如果你必须在客户端存储密钥,那么你可以在使用它之前至少对它进行几次哈希处理,例如在程序中硬编码base_key,然后在启动时通过运行base_key创建actual_key.通过SHA512(或其他)几次; 客户端仍然可以通过使用调试器来确定您正在做什么,但他们希望他们再也不希望遇到麻烦.


hay*_*lem 6

选项1:使用自定义SocketAppender

作为Zim-Zam关于使用支持JDBC的appender的回答的替代方法(顺便说一下,如果沿着这条路线走下去,请记住启用安全传输),您还可以考虑使用SocketAppender并推出自己的加密方法.

选项2:使用Flume和FlumeAppender

请参阅有关appenderlog4j文档,并查看使用FlumeAppender支持事件加密的a:

使用主代理和辅助代理配置的FlumeAppender配置示例,压缩主体,使用RFC5424Layout格式化主体,并将加密事件持久保存到磁盘.此示例"压缩正文,使用RFC5424Layout格式化正文,并将加密事件持久保存到磁盘:"

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
  <Appenders>
    <Flume name="eventLogger" compress="true" type="persistent" dataDir="./logData">
      <Agent host="192.168.10.101" port="8800"/>
      <RFC5424Layout enterpriseNumber="18060" includeMDC="true" appName="MyApp"/>
      <Property name="keyProvider">MySecretProvider</Property>
    </Flume>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="eventLogger"/>
    </Root>
  </Loggers>
</Configuration>
Run Code Online (Sandbox Code Playgroud)

有趣的读物

这不会直接回答您的问题,但也非常有趣:创建加密的日志文件