引导 EC2 Spot 实例

信息安全 linux
2021-08-16 06:50:55

我正在考虑以自动化方式使用 EC2 Spot 实例(即创建一个脚本来请求将在无人值守的情况下运行的 EC2 Spot 实例)。

对于这个特定的用例,我很乐意锁定安全组,这样 Spot 实例上就不允许传入连接。

该脚本的唯一输出是与 RDS 服务器通信。

我正在寻求一种解决方案,该解决方案允许我启动对 Spot 实例的请求,并加载所需的软件,包括访问 RDS 上的数据库。

我主要关心的是如何以安全的方式交付代码(包括数据库凭证)。

需要考虑哪些安全问题,哪种方法的风险最低?

到目前为止我的想法:

  • 没有传入连接应该可以减轻常见威胁

  • 将数据传递给 EC2 用户数据仍然存在风险(存储密码或访问代码对我来说听起来不是一个好主意)

  • 在用户数据中,通过设置为过期的 S3 链接提供私有详细信息(很难处理现场实例,因为我不知道何时创建实例)

  • 创建脚本以限制对用户数据的访问

  • 我是否需要考虑一种更精细的方法来从新创建的 Spot 实例中取回数据,然后登录到所述实例并通过 ssh 发送数据?

2个回答

没有测试过,但它应该可以工作。

使用IAM 角色

我们设计了 IAM 角色,以便您的应用程序可以安全地从您的实例发出 API 请求,而无需您管理应用程序使用的安全凭证。您可以委托权限以使用 IAM 角色发出 API 请求,而不是创建和分发您的 AWS 凭证...

  1. 创建私有 S3 存储桶。
  2. 将您的凭证存储在私有 S3 存储桶中。
  3. 创建一个 IAM 角色并为其提供允许其访问私有 S3 存储桶的策略。
  4. 创建 Spot 实例时,应用 IAM 角色。
  5. 使用 ec2 用户数据,使用引导脚本。
  6. 您现在已将凭证安全地传送到您的实例。

您可以使用KMS对凭据进行加密和解密,将加密的数据库凭据安全地存储在用户数据中。

设置

  1. 创建一个具有权限的 IAM 角色以允许kms:Decrypt访问资源*(下面的示例)。
  2. 通过调用encrypt加密(使用其他 AWS 凭证)您的数据库凭证
  3. 将加密的数据库凭证放入启动配置中的现场实例用户数据中。
  4. 将您的 Spot 实例与上述 1 中在启动配置中创建的 IAM 角色相关联。

Spot 实例启动

  1. 从用户数据中读取加密的数据库凭据
  2. 使用解密调用解密数据库凭据

请注意,除非您配置特定凭据,否则所有 SDK 都会自动尝试使用实例角色凭据访问 KMS。

示例 IAM 策略文档,因为我无法将代码放在编号列表的中间:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1429854706000",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}