使用EC2参数存储保护应用程序机密

在开发个简单的应用程序时,决定如何处理应用程序机密是重要的先期步骤。

这些可以是API键、数据库密码或应用程序在最佳状态下需要的其他特殊配置值,但您不希望每个人都能访问这些值。通常情况下,开发人员会由于时间的限制或围绕最佳实践的不确定性对应用程序的秘密存储采取不安全的或难以管理的(或两种)方法。

使用EC2参数存储保护应用程序机密

使用EC2参数存储保护应用程序机密

在本文中,我们将学习如何保护您的应用程序机密—EC2参数存储。但是,首先,让我们看看一些不太安全的方法来管理依旧常用的应用程序机密。

在源代码控制中存储纯文本机密

尽管这似乎是管理机密的一种便捷方式,但它的关键缺陷是即使是在一个封闭的、私有的项目中,它也会将您的应用程序机密暴露给任何有阅读访问权限的人。这种方法肯定不会通过审核,即使您的项目没有任何正式的合规要求,安全性也相当可观。

在服务器上存储纯文本机密

另一种方法是在运行的应用程序的服务器上存储机密。这能以应用程序配置文件的形式出现,该文件不会被提交到源代码控制中。在web应用程序的情况下,您可以将机密存储在web服务器配置中,以便将其作为环境变量注入到应用程序的运行时间中。

这是一种比在源代码控制中使用明文机密更安全的方法,因为它限制了可以访问它们的人数,但是它有一个很大的以前的方法没有出现过的缺点:运行不方便。

假设您有12个服务器在运行相同的应用程序。您将如何修改现有的应用程序机密或创建新的应用程序?单独登录每个服务器需要一段时间,而且非常不方便。您可以在配置管理中引入一些自动化,这将解决您的应用程序将如何访问它需要运行的机密,以及如何使它们保持更新,但是它并没有解决您首先要存储这些机密的地方。

换句话说,您的自动化将如何知道它需要在每个服务器上存储什么机密?

我们已经讨论了为什么不应该将它们存储在您的源代码控制存储库中,只在它们的目的地存储是没有意义的。那么您会把它们储存在哪里呢?您的电脑上还有其他别的地方吗?这也不一定是安全的,但即使是这样,团队中的其他成员应该如何获得这些机密呢?也许每个人都可以在更改时得到一个副本,但是如何安全地分发它们并确保它们都是同步的呢?使用这种方法带来了很多逻辑问题。

那么,您可以做什么呢?

在源代码控制中存储加密的机密

如果问题是明文的,那么让我们开始加密东西,对吧?嗯,是的,但并没有那么简单。如果您使用了一种现代的安全算法,那么您就可以在源代码控制中减少许多问题,但是您会遇到另一个问题——您要如何解密这些机密?要解密加密的字符串,您需要正确的密钥,但是密钥本身也是一个需要保持安全的机密!

您不能将密钥存储在源代码控制中,同样地,您也不能将机密存储在源代码控制中。如果您将密钥存储在服务器上或是将机密存储在服务器上,那么您将遇到相同的维护问题。即使您有一种允许您在服务器上存储并轻松地维护解密密钥(或机密)的方法,但仍然存在一个问题——如果没有服务器,那么您该怎么办?

Lambda、EMR、CodeDeploy等都是在AWS功能和服务组合中提供的“无服务器”技术。它们都不打算运行任何类型的以便存储加密的应用程序机密或打开它们密钥的永久服务器。如果您的应用程序堆栈涉及到这些服务中的任何一个,那么到目前为止我们所讨论的应用程序机密管理的所有方法都将无法工作。

使用Amazon EC2参数存储管理机密

既然我们已经得到了一些次优的方法,让我们深入研究最好的方法——Amazon EC2参数存储,它提供了一个集中式存储来管理您的配置数据,无论是纯文本数据,如数据库的字符串或密码类的机密,加密通过AWS密钥来管理服务。

对于本教程,让我们假设我们有一个与外部API端点交互的web应用程序,它需要使用一个API键。API密钥是保密的,不应该被共享,所以您是目前唯一知道它的人。它需要安全存储,还要有效地更新,并且可以更容易地访问您的应用程序。

开始

EC2参数存储管理的机密是使用AWS密钥管理服务(KMS)密钥进行加密的,所以我们需要做的第一件事就是创建密钥。我们可以使用AWS为我们自动创建的默认的awm/ssm键,但是为应用程序创建我们自己的密钥会使我们对谁能够管理和访问它有更好的控制。它还允许具有多个应用程序的大型企业更容易地限制应用程序机密的可见性和管理,这些团队负责那些特定的应用程序。

我们将遵循AWS的最佳实践并在EC2实例上使用IAM角色与AWS API接口,因此我们需要创建一个新的IAM角色。我们还可以简单地附加AmazonSSM只读访问IAM策略,但是这样做将使IAM角色访问读取所有与SSM相关的项,而不仅仅是参数。

要开始创建这个自定义IAM策略,请您打开AWS控制台并导航到IAM -》策略并单击Create Policy。接下来,选择创建您自己的策略,并使用以下策略文档:

如果您想要在以后授予访问权,您可以将它们的ARNs添加到资源列表中,或者使用您的应用程序名对它们的名称进行前缀。然后您可以specifyarn:aws:导弹:YOUR_REGION_HERE:YOUR_ACCOUNT_NUMBER_HERE:参数/ MyApplicationName – *攻击。否则,为策略名输入MyApplicationPolicy并单击Create策略。

现在,让我们创建IAM角色。转到IAM-角色,点击创建新的角色,然后选择Amazon EC2作为AWS服务角色。

选择角色类型

选择客户管理作为策略过滤器,并选择MyApplicationPolicy作为IAM策略来附加,然后单击下一步。

附加策略

最后,命名您的角色MyApplicationRole并单击Create角色。

现在是时候在KMS中创建自己的密钥了。导航到IAM-加密密钥并单击创建密钥。

创建密钥

接下来,输入您的密钥和可选描述的别名。对于关键的材料来源,选择默认的KMS。

创建别名

如果需要,您可以添加一些标记。对于这个示例,我将用应用程序名称和它将使用的环境来标记这个键。

添加标签

现在我们需要分配一个或多个密钥管理员。关键管理员是允许更改密钥本身或授予其他人使用和管理密钥的权限的IAM用户或角色。对于本例,我选择了我自己的用户,但是我也可以创建IAM的角色,我的IAM用户可以假设,以便在密钥上执行管理功能。根据您的企业,这可能会使管理关键管理员变得更容易,但是对于本例来说,我们将保持它的简单性,并使用我的IAM用户。我还保留了选项中的关键删除选项,这将允许我后面删除这个键。

定义键

接下来,为了方便实际使用我们的密钥,我们将定义键的使用权限。在这里,我选择了MyApplicationRole IAM角色作为一个授权的关键用户,这是我将分配给我的应用程序将要运行的EC2实例的角色。我还选择了自己作为授权用户,默认情况下,关键管理员权限不包括实际使用密钥的权限。如果需要,我们还可以提供其他AWS帐户权限来访问我们的密钥,这些帐户管理员可以将这些权限授予独立的IAM用户和角色

定义使用

下一页将显示您的KMS键策略的预览。在看完之后,如果您得出结论它很好,请点击Finish。

现在您将返回到加密密钥页面,并发现密钥已被成功创建。

成功创建

为我们的机密加密

现在我们有了一个可以用来加密我们的机密的密钥,让我们继续创建一个密钥吧!

我们可以使用AWS控制台来完成这一过程,但此时,任何以这种方式存储的机密都将使用默认的awm/ssm密钥进行加密。我们不想这样做,因为那样的话,任何人都可以使用默认密钥来查看我们的机密。相反,我们将使用AWS命令行接口,这使我们可以选择指定我们想要使用的哪个KMS键。

注意,如果您已经有一个加密的带有选择名称的应用程序机密,那么这个命令将会失败。如果是这样的情况(当您需要更改secret的值时,就会出现这种情况),您必须添加-覆盖标志。

如果出现错误,这个命令只显示输出,所以如果您在运行它之后什么也没有看到,那么您已经成功地加密了您的第一个应用程序机密!

获取明文的值

在AWS控制台中查看我们的秘密的明文值非常简单。首先,导航到EC2参数存储仪表盘并选择参数。

创建参数

然后,您只需单击Show来显示明文值。

显示参数

尽管显示明文值很容易,但是只有允许使用MyApplicationKey来解密值的用户和角色才可以使用此信息。如果一个没有适当密钥权限的用户尝试查看明文值,那么AWS控制台将不会向他们显示。

EC2参数

请注意,有一些IAM管理策略,比如管理员访问和PowerUserAccess,它们将自动授予访问视图EC2参数的权限并使用解密密钥。您可以通过向其指定的权限添加内联策略来阻止PowerUserAccess用户和角色,特别是拒绝访问EC2参数或KMS(或两者)的用户。这对于管理员访问是不可能的,因为根据定义,访问级别也允许任何这样的用户自己删除该限制。因此,管理员应该明智地分配管理员权限。

应用程序使用

AWS控制台使得人们可以很容易地查看一个机密的明文值,但是应用程序呢?让我们看一看对PHP使用AWS SDK的例子。

这个示例假设您的工作站上的AWS缺省配置文件凭证已经被正确配置,或者它运行在一个EC2实例上,其中有一个IAM角色,该角色可以访问加密的机密。您还需要安装用于PHP的AWS SDK。如果您想了解有关入门的更多信息,请参考用户指南。

执行这个示例代码将检索APPLICATION_SECRET_API_KEY存储的EC2参数,使用相关的KMS键对它进行解密,并返回明文字符串给您。为了能在实际的生产应用程序中使用,我们建议在应用程序服务器上的本地配置文件中缓存这些值,这些值可以作为代码部署过程的一部分进行刷新。这样做消除了从EC2参数存储中请求开始时检索参数添加的初始化时间。而且这样做的结果与在服务器方法中存储明文机密的好处相同,而不会带来不便。

如果您不使用PHP,就会有许多其他编程语言的AWS SDKs。请您访问AWS开发人员工具文档以了解更多信息。

当然,您也可以使用AWS命令行界面来检索明文值,就像它可以用来存储这些值一样。

该命令将以以下格式输出密钥,并可同时检索多个密钥

从视觉上看,工作流是这样的:

EC2存储工作流

结论

在本文中,我们介绍了一些常见的、不太理想的管理应用程序机密的方法。然后,我们学习了如何以一种安全的、易于管理的方式使用EC2参数存储,以及如何将这些信息提供给我们的应用程序。现在,您应该准备好进入AWS Web控制台,启动您最喜欢的代码编辑器,并开始将这种方法集成到您的应用程序中。

此内容是由lunarpages主机中文导航提供,如果您想转载此内容,请注明出处:http://lunarpages.cn/

Add Comment

Required fields are marked *. Your email address will not be published.