在Windows和Azure中使用加密证书提高web.config的安全性

栏目: 编程工具 · 发布时间: 6年前

内容简介:数据泄密的发生越来越频繁,因此使应用尽可能安全是非常重要的。而web.config文件通常以纯文本形式存储,常常缺少安全防范。一旦入侵者可以访问该文件,那么就可以轻易地从内部或外部访问数据库和其它资源。问题并非一开始就是如此。在.NET首次推出时,很多应用运行在单个Windows域中。通常并不需要web.config文件存储密码,数据库访问权利可以直接赋予运行应用的用户账户。但对于现代应用,情况则大相径庭。在分布式环境下,数据库及其它资源通常运行在Windows域之外,可能并不受同一家企业的控制。在这种环

本文要点

  • 加密证书可限制具有机密访问权限的人数。
  • 加密证书本身并不会降低对稳健性和多层安全计划的需求。
  • pfx解密密钥文件必须存储在一个安全的离线位置,并与密码分开存储。
  • 掌握PowerShell的知识,有助于简化认证相关的任务。

数据泄密的发生越来越频繁,因此使应用尽可能安全是非常重要的。而web.config文件通常以纯文本形式存储,常常缺少安全防范。一旦入侵者可以访问该文件,那么就可以轻易地从内部或外部访问数据库和其它资源。

问题并非一开始就是如此。在.NET首次推出时,很多应用运行在单个Windows域中。通常并不需要web.config文件存储密码,数据库访问权利可以直接赋予运行应用的用户账户。

但对于现代应用,情况则大相径庭。在分布式环境下,数据库及其它资源通常运行在Windows域之外,可能并不受同一家企业的控制。在这种环境下,非常有必要正确地存储密码、应用令牌以及其它一些系统标识。

本文介绍的技术并非最新提出的。 Jouni Heikniemi 在2013年的一次演讲中就介绍过,SQL Azure团队在此之前三年也做过介绍。但是这些年来,部分 工具 已不再推荐使用,用户界面也在不断地发生变化,一些特定的操作步骤不再有效。纵是如此,其中的原始概念仍然有效。

增加安全性

在开始介绍特定的技术之前,读者应注重理解加密web.conf文件的两个方面。一是加密web.conf文件只是应用整体安全计划中的一个步骤;二是应了解加密web.conf提供了哪些方面的保护,未对哪些方面提供保护。

应用要使用web.conf文件,必须可以解密该文件。如果将解密密钥以文件形式存储在web.conf文件旁边,那么显然攻击者会在获取web.conf文件时轻易获取该文件。如果将加密密钥嵌入到应用中,虽然增加了一个额外步骤,但是也易于被攻破。攻击者仅需要对窃取的代码运行反编译。

但是解密证书则不同。证书是存储在操作系统层面的,攻击者无法轻易地从硬盘中获取。除非经用户明确允许,否则证书甚至不可能从存储的计算机中导出。

这并非说证书是一个完美的解决方案。如果攻击者获取了应用目录的写权限,那么他就可以通过更改应用去解密web.config并解读其中的内容。这意味着,对包含应用代码的目录做写保护是同等重要的。理想情况下,只有用户的构建服务器具备生产服务器应用目录的写权限。但是这部分内容超出了本文的范畴。

另一个需要关注的问题是如何保护解密证书自身的拷贝。在建立一个新的服务器时,需要拷贝解密证书。证书也可以离线保存,或是保存在其它一些安全位置。另一方面,加密证书可根据需求共享。

创建加密证书

加密证书类似于SSL/TLS证书,由公钥和私钥组成。但是加密证书是自签名的,因为不需要验证文件的创建者和加密者。过去Windows开发人员需要使用makecert.exe生成证书,但是该工具目前已经不推荐使用了(虽然在Windows SDK中依然可见)。

当前正确的工具是使用PowerShell在Windows机器上创建证书。创建证书的命令如下:( 注意:PowerShell命令需要以管理员运行。 )

$cert = New-SelfSignedCertificate -Type DocumentEncryptionCert -Subject "CN=DevConfig" -KeyExportPolicy Exportable -KeySpec KeyExchange

Export-Certificate -Cert $cert -FilePath ".\DevConfig.cer"

$mypwd = ConvertTo-SecureString -String "1234" -Force -AsPlainText

Export-PfxCertificate -Cert $cert -FilePath ".\DevConfig.pfx" -Password $mypwd

$cert

如命令名称所示, New-SelfSignedCertificate 命令自身创建证书。在本例中,证书命名为“DevConfig”,用户也可以根据个人能喜好自行定义。

此后,我们使用 Export-Certificate 命令将加密证书导出为“.cer”文件。该文件就是创建加密配置文件所用的公钥。

其后两行命令使用 Export-PfxCertificate 命令将解密证书导出为“.pfx”文件。需要注意的是,该文件应该存储在一个安全的离线位置,并与使用 ConvertTo-SecureString 命令定义的密码分开存储(当然,也要避免使用“1234”这样不太安全的密码)。

用户需要知道证书指纹(thumbprint),它可能会被随后的命令所使用。最后一行命令“$cert”实现在屏幕上显示指纹。指纹本身并不被认为是秘密的。

将加密证书导入Windows

如果用户需要配置一台可加密配置文件但不用解密的机器,那么可使用如下命令。否则,跳到下一节内容。

Import-Certificate -Filepath ".\DevConfig.cer" -CertStoreLocation cert:\LocalMachine\My

详细信息,参见 Import-Certificate文档

将解密证书导入Windows

该步骤实际完成加密和解密后的证书(也就是公钥和私钥)的导入。

$mypwd = ConvertTo-SecureString -String "1234" -Force -AsPlainText

Import-PfxCertificate -FilePath ".\DevConfig.pfx" -CertStoreLocation Cert:\LocalMachine\My -Password $mypwd

如果使用 Import-PfxCertificate 命令导入证书,那么默认证书是不可导出的。这意味着其他人将不能从该机器导出证书到另一台机器。在生产环境中最好如此配置,但是在开发机器上应标记证书为可导出的。

要验证证书是否正确安装,可使用 Certificate Management Tool

将解密证书导入到Windows Azure

对于Azure App Service,证书解密并非免费的服务。因此,下面的操作需要用户至少具有B1层级,支持SSL连接。

在Azure Portal中使用“SSL Settings”选项卡。然后点击“Upload Certificate”按钮安装证书。之后在屏幕下方可看到如下图所示界面信息:

在Windows和Azure中使用加密证书提高web.config的安全性

下一步,用户需要将证书暴露给应用。具体操作是将 WEBSITE_LOAD_CERTIFICATES 键值加入到“Application Setting”选项中。用户可以填写以以逗号分隔的多个指纹值,或是设置值为“*”,即将用户所有的证书暴露给Web应用。

在Windows和Azure中使用加密证书提高web.config的安全性

提供受保护配置(Protected Configuration Provider)

ProtectedConfigurationProvider 实现加密和解密的处理。在本文中,我们使用了 Pkcs12ProtectedConfigurationProvider 。该类最初是由Microsoft创建的,并为兼容Azure App Service而做了一些微小改进。

对用户代码而言,插入 Pkcs12ProtectedConfigurationProvider 到配置读取流水线是透明的。这非常有用,用户可以灵活地选择使用加密还是非加密的配置文件。

用户可以 在项目中直接添加 Pkcs12ProtectedConfigurationProvider ,也可以通过NuGet软件包 WebConfigEncrypter 下载。本文假定用户设定了使用NuGet软件包。

设置用于加密的web.config文件

一旦项目中添加了 Pkcs12ProtectedConfigurationProvider 类,用户需要设置web.config文件实现加密。

1 在web.config文件中添加如下部分:

<configuration>
  [...]
  <configProtectedData>
    <providers>
      <add name="Pkcs12Provider" thumbprint="1234123412341234123412341234123412341234" type="WebConfigEncrypter.Pkcs12ProtectedConfigurationProvider, WebConfigEncrypter" storeLocation="LocalMachine"/>
    </providers>
  </configProtectedData>

2 更改 thumbprint 属性值为用户证书值。

3 如果用户使用的是NuGet软件包,那么更新 type 属性值为 ProtectedConfigurationProvider DLL类的完全限定类名和程序集名。

加密web.config配置中的连接串

开始本步骤操作前,应确保对web.conf文件做了备份拷贝。

首先,确保 aspnet 命令行工具使用的是用户的 ProtectedConfigurationProvider 类。在Visual Studio命令行输入“where aspnet_regiis”。拷贝下列文件到输出结果指定的目录中。

  • WebConfigEncrypter.dll
  • System.Configuration.ConfigurationManager.dll
  • System.Security.Cryptography.Xml.dll

然后,在web.config所在的文件夹中运行下面的命令:

aspnet_regiis -pef "connectionStrings" "." -prov "Pkcs12Provider"

加密配置部分的内容如下:

<connectionStrings configProtectionProvider="Pkcs12Provider">
    <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
      xmlns="http://www.w3.org/2001/04/xmlenc#">
      <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes192-cbc" />
      <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
        <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
          <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
          <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
            <KeyName>rsaKey</KeyName>
          </KeyInfo>
          <CipherData>
            <CipherValue>Moy/a2XO2zvnn/HZW53DyC8aAJWo16+0KmnpC4SCSmuQZU0RT+HNFEA33pAGCzve+m6MTaRzhx6jVVRoAvpSNzfYG1bU1z7a1YnbW4OGxrmYYfdWW6cZQZ57dZnL6YSAlkJ5WlqPDGUPJa6FV/hTic3x4fJYy5vdSucmO6X3opuo1998LWNkL6fIS4WkjkG/SOFbI2Qx3HHogdN670jDHKNDON1z7bFHhLNyVj7RTO3xuQN9kF4PqbFtvwm1bYXTbZpdNxu/fcXZKONSAu8HN3QX5vTRyP/I4BG+NK7TUig3gxD4tq9GR7aSSGKJyt02PiCEO0JpyyIbHZ9xbck9kw==</CipherValue>
          </CipherData>
        </EncryptedKey>
      </KeyInfo>
      <CipherData>
        <CipherValue>TeV0yJaFlEhpyZUlQoG7M3O7sfQ7uG3ndgmhxipOrwoEsrI+Zvt1NI7arefOFWGNW4CEaoLo4mKy2Kwr4ZgK+6rAwOmx1IRyheWtF7z/8+CiGOqSRXLyGEkDQBEVOWKU0Y6TaWtPu0ZM3bp5pvKaztBnthgGnrGYmigaufu5rZW1GWPtHyL2iWdAkU9iaf+AOpA/GSvoVtZmnfJ1rwy6U8PTO0h0Ws/PdkcOKuXGkx31t/Y32ivFoy7xYPnPt/Z/aNMiHvbO7faQAwuJ/NsG9G1FFRRHCqc73TUsRdKHVuf17BEp526RG6RBZtM3F3V3o0d8/sLmyrNI9tFfksB4qcWiN4P+BRtGr0iacmBfBOvAFSozfUYxjMpx+BYPOpD1pf4fMFoKxxKeJYY31XqZoQLp75RgmWhWYm8URHq4Cjs=</CipherValue>
      </CipherData>
    </EncryptedData>
  </connectionStrings>

上面的配置适用于Windows IIS。其中, configProtectionProvider 键值指定了应用所使用的解密类和证书。如果配置未起作用,那么重新运行上面介绍的 Import-PfxCertificate 命令。

加密自定义配置部分

用户不仅可以加密连接串,而且可以加密 使用 IConfigurationSectionHandler 构建的自定义配置部分 。要实现该功能,类似于对 WebConfigEncrypter.dll 的操作,用户必须将定义用户配置类的软件库拷贝到 aspnet_regiis 所在的目录。

首先,要确定在 configSections 列表中对自定义配置使用了完全限定类名和程序集名。例如:

<configSections>
    <section name="protectedSettings" type="MyConfigSectionHandler.MyHandler, WebApplication1" />
  </configSections>

这是 aspnet_regiis 的要求的,无论用户是否只能提供类名。

然后,用户需要再次运行加密命令,并将其中的 -pef 参数替换为自定义部分名称。 

aspnet_regiis -pef "protectedSettings" "." -prov "Pkcs12Provider"

Azure App Services中的一些特殊考虑

由于Azure App Service使用当前用户而非机器存储并提供证书,因此需要对 storeLocation 属性做如下更改: 

<add name=“Pkcs12Provider” thumbprint=“1234123412341234123412341234123412341234" type=“WebConfigEncrypter.Pkcs12ProtectedConfigurationProvider, WebConfigEncrypter” storeLocation=“CurrentUser”/>

作者简介

在Windows和Azure中使用加密证书提高web.config的安全性 Jonathan Allen 在90年代后期开始为一家健康诊所开发MIS项目,将逐步从Access和Excel迁移成为一个企业解决方案。在为金融行业开发自动交易系统五年后,他成为各种项目的顾问,其中包括机器人仓库的用户界面、癌症研究软件的中间层以及大型房地产保险公司的大数据解决方案。在空闲时间,他喜欢学习有关16世纪武术的东西。

查看英文原文: Securing web.config with Encryption Certificates on Windows and Azure


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Algorithm Design Manual

The Algorithm Design Manual

Steven S Skiena / Springer / 2011-11-14 / GBP 55.07

....The most comprehensive guide to designing practical and efficient algorithms.... Written by a well-known algorithms researcher who received the IEEE Computer Science and Engineering Teaching Aw......一起来看看 《The Algorithm Design Manual》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具