记录/安全考虑和敏感数据

10

我正在处理与Web应用程序的日志记录和安全相关的一般“架构”问题。据我所知,日志记录所有请求/响应数据(不仅是访问日志,还包括请求/响应正文)被视为最佳做法。这对于安全分析、调试目的、审计等都很有好处。

但是有一个问题,部分请求中会传输敏感信息,例如密码和/或信用卡数据。

(请注意:当然,我使用的是HTTPS,但是密码和/或信用卡数据将出现在日志或日志文件中的明文形式。顺便说一下,我不存储信用卡数据,因为我不符合PCI DSS合规要求,我们将此类数据传输给我们的合作伙伴,他是符合PCI DSS合规要求的。)

目前,我记录并存储异地访问日志(不包含请求/响应正文,但包含GET参数数据),并在应用程序代码中记录请求/响应正文数据(因此我能够决定将哪种数据记录到日志中,并在写入日志之前擦除敏感数据)。

但是,我考虑通过某个模块(例如mod_dumpio或类似模块)在应用程序之外实现日志记录(请求/响应正文),但在这种情况下,记录敏感信息可能是一个大问题。

我该如何实现/配置它?


如果您能告诉我们您正在使用哪种日志框架,那么对我们来说会更容易。如果您正在使用log4j,请尝试阅读此链接:https://dev59.com/KXE95IYBdhLWcg3wGZ9_。 - RamPrakash
3
“...密码和/或信用卡数据将以明文形式出现在日志文件中。”不管你做任何事情,绝对不要记录信用卡信息或密码!!! - Mogsdad
2个回答

9
处理敏感数据时,您应该考虑几个最佳实践。
首先,尽量减少传输的敏感数据。在架构中尽早对密码进行哈希处理,可以确保任何下游组件都不会有泄露敏感数据的风险。
其次,与前面的点相关,您应该限制/隔离接收此敏感信息的组件。对于密码来说,只有身份验证服务器才需要这些信息 - 其他组件只需要处理授权令牌或类似内容。至于信用卡,这应该只与那些需要它的服务相关联,例如系统的结账/计费组件。
第三,在那些需要获取敏感信息实际值的系统(例如信用卡)中,您应该考虑创建/使用类似令牌的系统。这基本上是一个地方,您可以存储敏感信息并提供替换原始敏感数据元素的ID引用(例如,将信用卡号码替换为信用卡号码ID)。
最后,尽可能靠近边缘(例如捕获信用卡的地方)交换敏感数据,以获得此令牌。在获得正确的授权后,交换此令牌以获得敏感信息值,然后在最后一刻使用它。最后,请审核在这些敏感点处执行的日志记录,确保它没有以明文形式记录。
这种设计模式是全球一些最大的电子商务网站采用的方法。(抱歉,我不能透露是哪些网站。)希望这有所帮助!

你会建议加密存储在数据库中的敏感数据吗?还是数据库的访问控制已经足够了? - Vidya
“在传输和静态存储数据时加密”的旧规则仍然适用,因此,是的,您应该加密驻留在数据库中的数据。有很多原因,但也许最简单的方法是举例说明。如果您只考虑某人备份磁盘并恢复它 - 如果数据未加密,则该系统可能会被攻击。最后一件事,您可能需要考虑对字段级别的数据进行加密 - 而不仅仅是整个数据库。这将为您提供更多灵活性,以便在未来如何管理该数据 - 例如分片或归档等方面。 - Shannph Wong

4
您不应该将敏感信息(例如用户密码或信用卡详细信息)存储在日志文件中,如果使用信用卡详细信息进行此操作,将意味着您违反了PCI合规性(如您所指出的)。对于用户密码,不应该记录它们 - 您应该使用您使用的任何方法进行哈希处理的用户输入密码与您在数据库中存储的密码进行比对。
不知道您使用的技术是什么,最佳实践建议过滤这些参数。例如,Ruby on Rails框架有(已经?)一个filter_parameter_loggingmethod,您可以将要过滤的输入传递给它 - 这些输入将在日志文件中被屏蔽。值得在您的应用程序中实现类似的功能,以便任何名为“password”、“card_number”或您定义的黑名单的字段都不会被记录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接