【问题标题】:Are "normal" environment variables more secure than IIS environment variables?“正常”环境变量是否比 IIS 环境变量更安全?
【发布时间】:2020-08-15 11:48:58
【问题描述】:

我有一个在 IIS 上运行的 ASP.Net Core 网站。我需要存储网站在生产中需要访问的一些密码。我没有可用的付费密码存储系统。我选择将我的密码存储在环境变量中。所以在我的生产机器上:

  • 服务帐号my_prod_service_account
  • my_prod_service_account 下运行的应用程序池MyProdAppPool
  • MyProdAppPool 中运行的网站MyDotNetCoreSite

方法一:普通环境变量

我以my_prod_service_account 身份登录生产机器,并在Powershell 中为该用户设置环境变量:

[Environment]::SetEnvironmentVariable("Pwd1", "MyPrecioussss1", "User");
[Environment]::SetEnvironmentVariable("Pwd2", "MyPrecioussss2", "User");

MyDotNetCoreSite 之后就可以读取这些环境变量了。

方法二:system.webServer\aspNetCore 环境变量

在生产机器上使用%WINDIR%\system32\inetsrv\config\applicationHost.config(IIS 配置文件)可以实现类似的效果。可以手动编辑,也可以through UI,但最后看起来是这样的:

<configuration>
    <location path="MyDotNetCoreSite">
        <system.webServer>
            <aspNetCore>
                <environmentVariables>
                    <environmentVariable name="Pwd1" value="MyPrecioussss1" />
                    <environmentVariable name="Pwd2" value="MyPrecioussss2" />
                </environmentVariables>
            </aspNetCore>
        </system.webServer>            
    </location>
</configuration>

iisresetMyDotNetCoreSite 之后可以将这些值作为环境变量读取。

问题

我想将我的密码存储方法从方法 1 更改为方法 2。前者为每个用户设置环境变量,后者为每个站点设置环境变量(我认为这更简洁)。但是我找不到足够的文档来判断方法 2 是否具有与方法 1 相同的安全级别。设置“正常”环境变量将其存储在注册表中 HKEY_Users\my_prod_service_account SID\Environment\Pwd1。访问注册表通常需要提升权限,如果有人闯入,我们将比知道 Pwd1 的黑客面临更大的问题。 applicationHost.config 和注册表一样安全吗?我可以放心地在其中存储密码吗?

【问题讨论】:

标签: asp.net-core iis environment-variables


【解决方案1】:

我只能提出一些令人头疼的问题/疑虑:
我很好奇,您是否在命令行中完成了set 并检查了输出中是否以明文形式列出了任何不需要的密码?
此外,如果您将所有密码存储在一个文件中,例如方法#2,这将是一个不错的蜜罐。 Lex Li 提到,我不知道加密的效果如何。

【讨论】:

  • 显然,如果我以 my_prod_service_account 身份登录并执行set,它将以纯文本形式列出所有密码。但这需要破解 my_prod_service_account 或可以访问注册表并查看每个人的环境变量的管理员帐户。
猜你喜欢
  • 2011-02-11
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 2014-09-30
  • 2021-04-28
  • 2020-12-07
相关资源
最近更新 更多