关键数据隐藏,消除访问日志中的数据安全隐患

🙈 By 李敏 2024-07-03

1. 背景介绍

NJet目前应用最多的是做HTTP代理。为了业务跟踪及故障分析等原因,代理经常会把业务请求的日志详细记录到access.log的文件中,包括请求参数,访问耗时,访问代码等等。这个文件,会无意中泄漏出比较敏感的信息,比如查询参数中的证件号码,银行卡号,手机号码,或能够泄漏出具体位置的访问ip等等。由于日志文件的关注度不高,并随着运维流程被四处传递,这样就导致了严重的数据安全漏洞。因此必须对日志文件中的敏感数据做隐藏处理,从而符合企业的数据安全规范,保证客户的权益。

2. 实现简介

NJet针对企业越来越严格的安全要求,特意实现了名为“数据消隐”的安全加固模块,该模块主要实现了两类数据的隐藏:首先是NJet变量的隐藏,主要像客户端的IP,或某些header,比如 日志格式中配置了记录访问的client_ip, 则被隐藏后,文件中原记录的“10.0.0.x” 这样的记录则被简单的替换为“";再则是查询参数中的某些属性,原始记录中的”?phone_num=13900000000&flag=1“ 就被替换为“?phone_num=&flag=1”,如果phone_num被定义为敏感信息的话。

另外需要强调的敏感数据定义是完全动态可配置的。目前覆盖到的是客户端连接数据,查询参数,由于restful接口会把业务属性存放到uri的path中,后续“数据消隐”模块还需要把隐藏的类型扩展到path,才能更好的满足企业的要求

2.1 实现指令

新增一个配置数据隐藏的指令log_data_hidden

Syntax log_data_hidden {hidden_type} {hidden_data};
Default -
Context NJT_HTTP_MAIN_CONF|NJT_HTTP_SRV_CONF|NJT_HTTP_LOC_CONF|
NJT_HTTP_LIF_CONF|NJT_HTTP_LMT_CONF|NJT_CONF_TAKE2

参数介绍:

参数 取值 说明
hidden_type [var|query_param] var: 将整个变量隐藏,替换为''
query_param:对url后面的query_param对应的值隐藏,替换为'
'
hidden_data 变量name或者是query_param的key

说明:

  • 该指令可配置在http块的任何位置,可配置多条
  • http块的配置对所有的server和location生效
  • server块的配置对该server块下所有的location生效
  • location块的配置只对该location生效

3. 配置示例

假设某企业利用NJet做业务代理,其acess.log 采用如下的日志格式,即把业务请求中的请求地址,时间,具体的请求行都记录下来

log_format combined ‘$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '

其产生的日志行如下:

192.168.40.158 - - [03/Jul/2024:14:17:02 +0800] "GET /svc?ID=372929199605756028&status=1 HTTP/1.1" 200 9 "-" "curl/7.29.0"

因为请求的查询参数中ID是敏感的,需要隐藏。因此在配置文件中该location下配置数据隐藏

 location /svc {
            ...
            log_data_hidden query_param ID;      #query_param a隐藏
            ...
        }

隐藏后产生的日志如下

192.168.40.158 - - [03/Jul/2024:14:17:02 +0800] "GET /svc?ID=372929199605756028&status=1 HTTP/1.1" 200 9 "-" "curl/7.29.0"
192.168.40.158 - - [03/Jul/2024:14:17:48 +0800] "GET /svc?ID=*&status=1 HTTP/1.1" 200 9 "-" "curl/7.29.0"

4. 参考及其它说明