在 serverless.com 项目中存储加密的机密信息

62次阅读
没有评论

问题描述

在使用 serverless.com 构建项目时,将机密信息暴露给 AWS Lambda 函数的最简单方法是将其存储在 serverless.yml 文件中(例如使用 KMS 进行加密)。然而,将加密的机密信息提交到 Git 并不是最好的选择,因为一旦机密信息需要更改,就需要修改代码。

从安全性的角度来看,有哪些更好的替代方案?例如,机密信息可以存储在加密的 S3 存储桶中,并为 Lambda 函数提供访问该位置和 KMS 密钥的权限,但这种方式在实质上是否更好?

解决方案

以下操作步骤可能涉及版本差异或涉及一些风险操作,请谨慎执行。

使用 KMS 加密并存储于 S3

在处理加密的机密信息时,有几个要点需要考虑:

  1. 分离配置和代码:将配置数据与代码分开,因为它们可能拥有不同的发布周期和处理流程。

  2. 使用 KMS 进行加密:使用 AWS 的 Key Management Service (KMS) 进行机密信息的加密,确保数据在存储和传输过程中得到保护。

  3. 存储于 S3 或 DynamoDB:将加密后的机密信息存储在 S3 存储桶或 DynamoDB 表中,以便 Lambda 函数可以获取它们。这种方式避免了将敏感信息明文存储在代码库中,从而提高了安全性。

以下是一种可行的解决方案步骤:

  1. 创建 KMS 密钥:在 AWS KMS 中创建一个用于加密机密信息的密钥。

  2. 加密并上传至 S3:使用创建的 KMS 密钥,将机密信息加密后上传至 S3 存储桶。

  3. 配置 Lambda 函数:在 Lambda 函数的配置中,将 S3 存储桶和 KMS 密钥的访问权限配置为允许函数获取机密信息。

  4. 在 Lambda 函数中获取机密信息:在 Lambda 函数中,使用 AWS SDK 或 AWS CLI 获取并解密存储在 S3 中的机密信息。

请注意,以上步骤是一个基本的指导,实际操作中可能需要根据项目的具体情况进行调整。

使用第三方工具

如果你的机密信息管理需求更为复杂,可以考虑使用第三方工具来管理和存储机密信息。例如,HashiCorp Vault 是一个开源的工具,可以用于集中管理机密信息,并提供访问控制和加密功能。你可以在项目中集成 Vault,然后使用其 API 或命令行工具来获取和管理机密信息。

示例代码库

以下是使用 Python 和 AWS SDK 的示例代码,演示了如何在 Lambda 函数中获取存储在加密 S3 存储桶中的机密信息:

import boto3
import base64

def get_secret_from_s3(bucket_name, object_key, kms_key_id):
    s3 = boto3.client('s3')
    response = s3.get_object(Bucket=bucket_name, Key=object_key)
    encrypted_secret = response['Body'].read()

    kms = boto3.client('kms')
    decrypted_secret = kms.decrypt(CiphertextBlob=encrypted_secret, KeyId=kms_key_id)

    return decrypted_secret['Plaintext']

def lambda_handler(event, context):
    # S3 bucket and object information
    bucket_name = 'your-s3-bucket'
    object_key = 'path/to/encrypted/secret'

    # KMS key ID for decryption
    kms_key_id = 'your-kms-key-id'

    # Get the decrypted secret
    secret = get_secret_from_s3(bucket_name, object_key, kms_key_id)

    # Use the secret in your Lambda function
    print('Decrypted secret:', secret)

    # Your Lambda function logic here

请根据你的实际情况和项目需求,选择适合的解决方案和工具来管理和存储加密的机密信息。

总结

在 serverless.com 项目中,存储和管理加密的机密信息是一项关键任务。通过将配置数据与代码分离,并使用 AWS KMS 进行加密,然后将加密后的数据存储在 S3 存储桶中,可以有效地提高机密信息的安全性。如果需要更复杂的机密信息管理功能,可以考虑使用第三方工具如 HashiCorp Vault。无论选择哪种方法,都应根据项目需求进行适当的配置和调整,以确保机密信息得到充分保护。

正文完