SecurityLockdown 示例演示如何通过以下方式控制 Windows Communication Foundation (WCF) 服务的多个安全相关功能:
加密服务的配置文件中的敏感信息。
锁定配置文件中的元素,以便嵌套服务子目录无法替代设置。
控制跟踪和消息日志中的个人身份信息 (PII) 日志记录。
讨论
每个功能都可以单独使用或一起使用来控制服务安全性的各个方面。 这不是保护 WCF 服务的明确指南。
.NET Framework 配置文件可以包含敏感信息,例如用于连接到数据库的连接字符串。 在共享的 Web 托管方案中,可能需要在服务的配置文件中加密此信息,以便配置文件中包含的数据能够抵御随意查看。 .NET Framework 2.0 及更高版本能够使用 Windows 数据保护应用程序编程接口(DPAPI)或 RSA 加密提供程序加密配置文件的某些部分。 使用 DPAPI 或 RSA 的 aspnet_regiis.exe 可以加密配置文件的选择部分。
在 Web 托管方案中,可以在其他服务的子目录中提供服务。 用于确定配置值的默认语义允许嵌套目录中的配置文件重写父目录中的配置值。 在某些情况下,出于各种原因,这可能是不可取的。 WCF 服务配置支持锁定配置值,这样,在使用重写的配置值运行某一嵌套服务时,嵌套的配置会生成异常。
此示例演示如何控制跟踪和消息日志(如用户名和密码)中已知个人身份信息的日志记录。 默认情况下,禁用已知 PII 的日志记录,但在某些情况下,PII 日志记录在调试应用程序时可能很重要。 此示例基于入门指南。 此外,此示例使用跟踪和消息日志记录。 有关详细信息,请参阅 跟踪和消息日志记录 示例。
加密配置文件元素
出于安全考虑,在共享 Web 托管环境中,可能需要加密某些配置元素,例如可能包含敏感信息的数据库连接字符串。 可以使用 .NET Framework 文件夹中找到的 aspnet_regiis.exe 工具加密配置元素,例如,%WINDIR%\Microsoft.NET\Framework\v4.0.20728。
对示例的 Web.config 中的 appSettings 节中的值进行加密
使用 Start-Run> 打开命令提示符...
cmd
键入并单击“确定”。通过发出以下命令导航到当前的 .NET Framework 目录:
cd %WINDIR%\Microsoft.NET\Framework\v4.0.20728
发出以下命令,加密 Web.config 文件夹中的 appSettings 配置设置:
aspnet_regiis -pe "appSettings" -app "/servicemodelsamples" -prov "DataProtectionConfigurationProvider"
有关加密配置文件部分的详细信息,请参阅 ASP.NET 配置(生成安全 ASP.NET 应用程序:身份验证、授权和安全通信)中的 DPAPI 的操作方法,以及在 ASP.NET 配置中有关 RSA 的方法(如何:在 ASP.NET 2.0 中使用 RSA 加密配置节)。
锁定配置文件元素
在 Web 托管方案中,可以在服务的子目录中具有服务。 在这些情况下,子目录中的服务的配置值是通过检查 Machine.config 中的值并连续合并父目录中的任何 Web.config 文件,然后向下移动目录树,最后合并包含服务的目录中的 Web.config 文件来计算。 大多数配置元素的默认行为是允许子目录中的配置文件替代父目录中设置的值。 在某些情况下,可能需要防止子目录中的配置文件重写父目录配置中设置的值。
.NET Framework 提供了一种锁定配置文件元素的方式,当配置重写锁定的配置元素时会引发运行时异常。
可以通过在配置文件中指定 lockItem
节点的属性来锁定配置元素,例如,若要在配置文件中锁定 CalculatorServiceBehavior 节点,以便嵌套配置文件中的计算器服务无法更改行为,可以使用以下配置。
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior" lockItem="true">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
可以更具体地锁定配置元素。 可以将元素列表指定为锁定子元素集合中的一组元素的值 lockElements
。 可以将属性列表指定为 lockAttributes
的值,以便在元素中锁定一组属性。 可以通过在节点上指定 lockAllElementsExcept
或 lockAllAttributesExcept
属性来锁定元素或属性的整个集合,但指定的列表除外。
PII 日志记录配置
PII 的日志记录由两个开关控制:一个是计算机范围设置,位于 Machine.config 中,允许计算机管理员批准或拒绝 PII 的日志记录;另一个是应用程序设置,允许应用程序管理员在 Web.config 或 App.config 文件中为每个源切换 PII 的日志记录。
计算机范围的设置通过在 Machine.config 的 machineSettings
元素中将 enableLoggingKnownPii
设置为 true
或 false
进行控制。例如,下面的设置允许应用程序打开 PII 日志记录。
<configuration>
<system.serviceModel>
<machineSettings enableLoggingKnownPii="true" />
</system.serviceModel>
</configuration>
注释
Machine.config 文件具有默认位置:%WINDIR%\Microsoft.NET\Framework\v2.0.50727\CONFIG。
如果 Machine.config中不存在该 enableLoggingKnownPii
属性,则不允许记录 PII。
通过在Web.config 或 App.config 文件中,将源元素的logKnownPii
属性设置为true
或false
,即可为应用程序启用 PII 日志记录。 例如,下面的设置对消息日志记录和跟踪日志记录启用 PII 日志记录。
<configuration>
<system.diagnostics>
<sources>
<source name="System.ServiceModel.MessageLogging" logKnownPii="true">
<listeners>
...
</listeners>
</source>
<source name="System.ServiceModel" switchValue="Verbose, ActivityTracing">
<listeners>
...
</listeners>
</source>
</sources>
</system.diagnostics>
</configuration>
如果未指定该 logKnownPii
属性,则不会记录 PII。
只有在enableLoggingKnownPii
设置为true
,且logKnownPii
设置为true
时,才会记录 PII。
注释
System.Diagnostics 忽略除配置文件中列出的第一个属性之外的所有源上的所有属性。 将 logKnownPii
属性添加到配置文件中的第二个源不起作用。
重要
若要运行此示例,需要手动修改 Machine.config。务必小心,在修改 Machine.config 时,若设置为不正确的值或语法,可能会阻止所有 .NET Framework 应用程序无法运行。
还可以使用 DPAPI 和 RSA 加密配置文件元素。 有关详细信息,请参阅以下链接:
设置、生成和运行示例
确保已为 Windows Communication Foundation 示例 执行One-Time 安装过程。
编辑 Machine.config,将
enableLoggingKnownPii
属性设置为true
,如有必要添加父节点。若要生成解决方案的 C# 或 Visual Basic .NET 版本,请按照 生成 Windows Communication Foundation 示例中的说明进行操作。
要使用单机配置或跨计算机配置运行示例,请按照运行 Windows Communication Foundation 示例中的说明进行操作。
清除示例
- 编辑 Machine.config 以将
enableLoggingKnownPii
属性设置为false
.