在日志文件中隐藏敏感/机密信息

时间:2009-09-23 15:53:42

标签: security language-agnostic logging privacy

如何隐藏敏感信息进入日志文件?是的,您可以有意识地选择不首先记录敏感的信息位,但是可能会出现一些情况,您在调查问题等时会在发生故障或跟踪消息时盲目地记录错误消息,并最终导致敏感信息登陆您的日志文件。

例如,您可能尝试将包含客户信用卡号的订单记录插入数据库。在数据库发生故障时,您可能希望记录刚刚执行的SQL语句。然后,您将在日志文件中获得客户的信用卡号。

是否有一种设计范例可用于将某些信息“标记”为敏感信息,以便通用日志管道可以过滤掉它们?

7 个答案:

答案 0 :(得分:7)

我目前针对此案例的做法是记录此类敏感信息的哈希值。这使我们能够识别属于特定声明的日志记录(例如特定的信用卡号),但不会让任何人只能抓取日志并将敏感信息用于其恶意目的。

当然,这样做始终涉及良好的编码实践。我通常选择使用toString重载(在Java或.NET中)记录所有对象,这些重载序列化了应用了Sensitive属性标记的字段的值的哈希值。

当然,SQL字符串更有问题,但我们更多地依靠ORM来保持数据持久性,并在各个阶段记录系统状态,然后记录SQL查询,因此它变得没有问题。

答案 1 :(得分:5)

我个人认为日志文件本身就是敏感信息,并确保限制对它们的访问。

答案 2 :(得分:2)

记录信用卡号可能是PCI违规。如果您不符合PCI标准,则需要支付更高的卡处理费。要么不记录敏感信息,要么加密整个日志文件。

您对“标记”敏感信息的想法很有趣。您可以拥有Sensitive信息的特殊数据类型,它包含真实的基础数据类型。每当此对象呈现为字符串时,它只返回"***"或其他任何内容。

然而,这可能需要广泛的编码更改,并且需要一定程度的警惕,类似于首先避免记录敏感信息所需的警惕。

答案 3 :(得分:1)

在您的示例中,您应该加密信用卡号码,或者更好的是,甚至不将其存储在首位。

如果您正在记录其他内容,例如登录,则可能需要使用*****明确替换密码。

然而,这可以巧妙地避免回答你首先提出的问题。通常,在处理敏感信息时,应该将其加密到任何形式的永久存储,无论是数据库文件还是日志文件。假设一个坏人将能够得到他们的手,并相应地保护信息。

答案 4 :(得分:1)

如果您知道要尝试过滤的内容,可以在记录前通过Regex清理表达式运行日志输出。

答案 5 :(得分:1)

特别是关于SQL语句,如果您的语言支持它,您应该使用参数而不是在语句本身中放置值。换句话说:

select * from customers where credit_card = ?

然后将参数设置为信用卡号。

当然,如果您计划使用填写的参数记录SQL语句,则需要使用其他方法来过滤掉敏感数据。

答案 6 :(得分:0)

请参阅此工具,该工具专为此用例创建。

如果要仅记录选定的字段,请在记录期间保留其他字段值。你可以试试这个。

https://github.com/senthilaru/sp-util

<dependency>
    <groupId>com.immibytes</groupId>
    <artifactId>sp-utils</artifactId>
    <version>1.0.0-RELEASE</version>
</dependency>