最近两天关于log4j2的远程代码执行漏洞有很多讨论,但是很多都是非技术性的。作为一个技术博客,让我们从技术的角度来做一些讨论,同时记录自己的一些想法。
为什么需要日志功能
对于成熟的面向最终用户的软件产品,不管是目标用户是企业还是个人,都会存在或多或少的问题,缺陷,bug等。由于各种因素的限制,出现问题的时候软件开发人员不可能在线调试,定位,甚至看不到问题的表现,或者即使用户反馈了现象,但是描述是不准确的。针对这种情况,软件开发人员不能放之问题不管,只能思考其他的问题分析解决方法。日志功能是针对这种场景的一种重要手段,具体是软件在日常运行过程中,将重要的事件,行为,异常等信息记录下来,有条件还需要记录到文件中持久保存。当软件开发人员需要定位的时候,将问题发生时以及前后的日志倒出来,根据这些日志分析问题发生的原因,进而解决问题。另一种需要日志功能的场景是,软件问题偶尔出现,软件人员长时间监控软件行为耗时耗力,这个时候也需要日志功能来辅助分析问题。
对于互联网的基石网络设备来说,日志是很重要的功能,很多广泛使用的产品都有具体而详细的日志功能。比如:
https://www.cisco.com/c/en/us/td/docs/routers/access/wireless/software/guide/SysMsgLogging.html
https://support.huawei.com/enterprise/en/doc/EDOC1000178167/90adc2f5/configuring-log-output
https://www.h3c.com/en/d_201601/914610_294551_0.htm
对于手机客户端软件来说日志功能也很重要,微信的帮助页面就有上传日志功能界面,帮助微信团队分析用户遇到的问题。
对于这次Log4j2引起的远程日志漏洞来说,之所以影响这么大,就是因为很多基于java开发的网站服务,都用到了Log4j2来记录软件日志。
由上面可以知道,日志功能是软件非常重要的一项功能,甚至说其是互联网软件的基石都不为过。虽然log的api使用起来可能很简单,但是越简单的使用接口内部实现可能会越复杂,比如内存申请和释放只有alloc/free两个api,但是内存管理本身是一件非常复杂的事情。
日志有哪些重要特性
根据上述对日志的分析,以及自己使用使用中的体会,日志应该具有如下一些功能。同时rfc3164和rfc5424也定义了syslog的基本功能,可以参考一下。
- 日志输出api接口统一,格式规范。软件的各个模块可以使用统一的接口输出日志信息,便于分析日志的使用情况。
- 日志输出支持不同的级别,以便于过滤不同级别的信息,便于分析重要问题,同时不被非重要信息干扰。
- 日志输出支持不同的形式,主要有控制台打印,文件形式,内存缓存,网络报文等,便于使用不同工具分析日志。
- 日志输出支持计数统计,丢弃个数,发送或者记录失败个数,限速等各种控制功能。
- 日志功能具有高性能吞吐的特点,同时不应对系统正常功能产生影响,日志功能应该支持动态开启和关闭。
- 日志功能本身的实现要尽可能清晰和简单,不占用太多的系统资源,支持常见的软件开发平台。
log4j2的主要实现机制
https://logging.apache.org/log4j/2.x/manual/architecture.html
log4j2的优势在于哪里
https://logging.apache.org/log4j/2.x/manual/index.html
日志功能的未来发展
远程监控功能
软件调试技术
分布式数据库
扩展想法
软件基础设施建设
软件漏洞数据库CVE
软件开放源代码
参考资料
https://logging.apache.org/log4j/2.x/index.html
https://stackify.com/syslog-101/
https://www.ietf.org/rfc/rfc3164.txt
https://www.ietf.org/rfc/rfc5424.txt