🙈 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. 参考及其它说明
- NJet使用的变量和nginx兼容,请参考 https://nginx.org/en/docs/varindex.html
- “数据消隐” 在NJet3.0开始支持