消息日志的安全性问题

本主题介绍如何防止敏感数据在消息日志中公开,以及消息日志记录生成的事件。

安全问题

记录敏感信息

Windows Communication Foundation (WCF) 不会修改特定于应用程序的标头和正文中的任何数据。 WCF 也不跟踪应用程序特定标头或正文数据中的个人信息。

启用消息日志记录后,应用程序特定的标头(如查询字符串)中的个人信息;和正文信息(如信用卡号)可以在日志中可见。 应用程序部署程序负责对配置和日志文件强制实施访问控制。 如果不希望显示此类信息,则应禁用日志记录,或者如果要共享日志,应筛选出部分数据。

以下提示可帮助你防止无意中公开日志文件的内容:

  • 确保日志文件在 Web 主机和自承载方案中都受到访问控制列表(ACL)的保护。

  • 选择不能轻松通过 Web 请求访问的文件扩展名。 例如,.xml 文件扩展名不是安全的选择。 可以查看 Internet Information Services (IIS) 管理指南,查看可以提供的扩展列表。

  • 指定日志文件位置的绝对路径,该位置应位于 Web 主机 vroot 公共目录之外,以防止外部方使用 Web 浏览器对其进行访问。

默认情况下,密钥和个人身份信息(如用户名和密码)不会记录在跟踪和记录的消息中。 但是,计算机管理员可以使用 Machine.config 文件的 machineSettings 元素中的 enableLoggingKnownPII 属性,以允许计算机上运行的应用程序记录已知的个人身份信息(PII)。 以下配置演示如何执行此操作:

<configuration>
   <system.serviceModel>
      <machineSettings enableLoggingKnownPii="true"/>
   </system.serviceModel>
</configuration>

然后,应用程序部署程序可以使用 App.config 或 Web.config 文件中的 logKnownPii 属性来启用 PII 日志记录,如下所示:

<system.diagnostics>
  <sources>
      <source name="System.ServiceModel.MessageLogging"
        logKnownPii="true">
        <listeners>
                 <add name="messages"
                 type="System.Diagnostics.XmlWriterTraceListener"
                 initializeData="c:\logs\messages.svclog" />
          </listeners>
      </source>
    </sources>
</system.diagnostics>

只有当两个设置都为 true 时,才会启用 PII 日志记录。 结合两个开关,可以灵活地记录每个应用程序的已知个人识别信息(PII)。

重要

在 .NET Framework 4.6.1 中,还必须将 logEntireMessagelogKnownPii 标志设置为 Web.config 文件中 true 或 App.config 文件以启用 PII 日志记录,如以下示例 <system.serviceModel><messageLogging logEntireMessage="true" logKnownPii="true" …所示。

应注意,如果在配置文件中指定两个或多个自定义源,则只读取第一个源的属性。 而忽略其他源的属性。 这意味着,对于以下 App.config 文件,即使已为第二个源显式启用了 PII 日志记录,也不会同时为这两个源记录 PII。

<system.diagnostics>
   <sources>
      <source name="System.ServiceModel.MessageLogging"
              logKnownPii="false">
              <listeners>
                 <add name="messages"
                      type="System.Diagnostics.XmlWriterTraceListener"
                      initializeData="c:\logs\messages.svclog" />
              </listeners>
            </source>
      <source name="System.ServiceModel"
              logKnownPii="true">
              <listeners>
                 <add name="traces"
                      type="System.Diagnostics.XmlWriterTraceListener"
                      initializeData="c:\logs\traces.svclog" />
              </listeners>
      </source>
   </sources>
</system.diagnostics>

如果 <machineSettings enableLoggingKnownPii="Boolean"/> 元素存在于 Machine.config 文件之外,系统将引发 ConfigurationErrorsException

仅当应用程序启动或重启时,更改才有效。 当两个属性都设置为 true时,在启动时记录事件。 如果 logKnownPii 设置为 trueenableLoggingKnownPii 设置为 false,也会记录一个事件。

使用这两个开关时,计算机管理员和应用程序部署器应格外小心。 如果启用了 PII 日志记录,则会记录安全密钥和 PII。 如果禁用,则敏感数据和应用程序特定的数据仍记录在消息标头和正文中。 有关隐私和保护 PII 免受公开的更深入的讨论,请参阅 用户隐私

谨慎

在格式不正确的消息中不会隐藏 PII。 此类消息将被记录 as-is,不进行任何修改。 前面提到的属性对此没有影响。

自定义跟踪侦听器

在消息日志记录跟踪源上添加定义跟踪侦听器是一种只限于管理员的特权。 这是因为可以将恶意自定义侦听器配置为远程发送消息,从而导致敏感信息泄露。 此外,如果将自定义侦听器配置为在网络上发送消息(例如远程数据库),则应对远程计算机上的消息日志强制实施适当的访问控制。

消息日志记录触发的事件

下面列出了消息日志记录发出的所有事件。

  • 启用消息日志记录:当在配置中或通过 WMI 启用消息日志记录时发出此事件。 此事件的内容是“消息日志记录已打开。 敏感信息可能以明文形式记录,即使这些信息是在网络上加密的,例如消息正文。

  • 禁用消息日志记录:当通过 WMI 禁用消息日志记录时发出此事件。 事件的内容是“消息日志记录功能已被关闭”。

  • 启用记录已知 PII:当启用记录已知 PII 时发出此事件。 当 Machine.config 文件的 machineSettings 元素中的 enableLoggingKnownPii 属性设置为 true,App.config 或 Web.config 文件中 source 元素的 logKnownPii 属性设置为 true时,就会发生这种情况。

  • 不允许记录已知 PII:当不允许记录已知 PII 时发出此事件。 当 App.config 或 Web.config 文件中 source 元素的 logKnownPii 属性设置为 true,但 Machine.config 文件的 machineSettings 元素中的 enableLoggingKnownPii 属性设置为 false时,就会发生这种情况。 不会引发异常。

可以在 Windows 附带的事件查看器工具中查看这些事件。 有关详细信息,请参阅 事件日志记录

另请参阅