最有可能从日志文件中删除的密钥列表?

时间:2017-04-11 13:41:02

标签: security logging

最近我注意到一些敏感数据被写入我正在处理的应用程序中的日志文件中。我查看了它,我们的应用程序有一个键列表,它会在写出来之前从我们的日志中删除,但是列表让我感觉它可以扩展。

是否有一个公共密钥的列表,应该在找到时从日志文件中删除?

例如,以下键及其变体可能永远不会记录在日志文件的任何位置

return View("~/Views/UserDemographics/Manage.cshtml");

请注意,我已经看过OWASP Logging cheat sheet,但它似乎没有任何细节,只是概括。

1 个答案:

答案 0 :(得分:0)

到目前为止,我能够提出的最好的是以下内容,我通过搜索"编辑密码令牌"找到了我最好的结果。在谷歌。

在名称中具有以下任何位置的Redact键

  • 记住密钥可以通过以下任何一种方式显示:x=y, x:y, 'x':y, "x":y <x>y</x>
  • 令牌
  • 秘密
  • 密码
  • 会话
  • 连接
  • JWT

考虑删除所有用户名变体,例如:

  • 用户名
  • USER_NAME
  • 用户
  • 电子邮件
  • 凭证

看起来像

的Redact值
  • 信用卡号码
  • 社会保险号码
  • 可能是电子邮件地址

Cloudera has a page详细说明用于编辑某些数据值的正则表达式,而不是键:

  

信用卡号码(带分隔符)
  \ d {4} [^ \ w] \ d {4} [^ \ w] \ d {4} [^ \ w] \ d {4}

     

社会安全号码(带分隔符)\ d {3} [^ \ w] \ d {2} [^ \ w] \ d {4}

     

电子邮件地址\ b([A-Za-z0-9] | [A-Za-z0-9] [A-Za-z0-9 -._] \    [A-Za-z0-9])@(([A-Za-z0-9] | [A-Za-z] \ [A-Za-z0-9 - ] [A -Za-z0-9])。)+([A-Za-z0-9] \   | [A-ZA-Z0-9] [A-ZA-Z0-9 - ] * [A-ZA-Z0-9])\ B'/ P>      

主机名\ b(([A-Za-z] | [A-Za-z] [A-Za-z0-9-] \    [A-Za-z0-9])。)+([A-Za-z0-9] \ | [A-Za-z0-9] [A-Za-z0-9 - ] [A-ZA-Z0-9])\ b'/ p>

用于编辑数据的节点模块

https://github.com/watson/redact-secrets

注意:我的同事为我提供了一个Java样本密钥值的Java示例,使用正则表达式来消除包含`session,secret,token,password,passwd,connection&#39的键值。 ;在xml和json中,以及引用的变体。

import java.security.GeneralSecurityException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Redact {
  private static final String prefix = "[\"']?(session|(auth_)?token|password|passwd|secret|connection)[\"']?";
  private static final String capture = "([\"']?)([\\w\\d!#$%()*+,-./:<=>?@[\\\\]^_`{|}~]+)([\"']?)";
  private static Pattern pattern = Pattern.compile(prefix + "\\s*(=|:)\\s*" + capture, Pattern.CASE_INSENSITIVE);

  public static String encryptSensitiveInfo(String message) {
    try {
      if (message == null) 
        return message;

      StringBuffer newStr = new StringBuffer(message);
      int lenDiff = 0;
      Matcher m = pattern.matcher(message);

      // Loop over message until all sensitive data is redacted
      while (m.find()) {
        String keyAndValue = m.group(0);
        String value = m.group(5);
        String REDACTED = "REDACTED";
        String replacementText = keyAndValue.replace(value, REDACTED);

        // Replace the key/value in the message with the new redacted
        // value, adjusting for where it is in the redacted version of
        // the input
        newStr = newStr.replace(m.start() - lenDiff, m.end() - lenDiff, replacementText);
        lenDiff += keyAndValue.length() - replacementText.length();
      }
      return newStr.toString();
    } catch (Exception e) {
      return message;
    }
  }
}