如何在AWS中安全加密存储密钥/令牌供Lambda等服务使用?
安全存储Lambda私有令牌的AWS方案
1. AWS Secrets Manager(首推)
这是AWS专为敏感凭据设计的托管服务,完美适配API令牌、数据库密码这类信息的存储,自带自动轮换功能,非常适合多Lambda共享凭据的场景。
- 配置步骤:
- 登录AWS控制台进入Secrets Manager,点击「存储新密钥」
- 选择「其他类型的密钥」,输入令牌内容(格式可设为
TOKEN=xxxxxx),设置清晰的密钥名称(比如prod/lambda/shared-api-token) - 给Lambda的IAM角色附加
secretsmanager:GetSecretValue权限,仅允许访问指定密钥 - Lambda代码中通过AWS SDK获取密钥:
import boto3 def fetch_secret(): secret_name = "prod/lambda/shared-api-token" client = boto3.client('secretsmanager') response = client.get_secret_value(SecretId=secret_name) return response['SecretString']
- 核心优势:自动凭据轮换、细粒度权限控制、CloudTrail审计日志支持、跨区域复制
- 适用场景:多Lambda共享凭据、需要定期更新令牌的业务
2. AWS Systems Manager Parameter Store(Secure String类型)
如果对成本敏感,Parameter Store的Secure String类型是性价比更高的选择,同样支持KMS加密,适合存储无需自动轮换的静态令牌。
- 配置步骤:
- 进入Systems Manager控制台的「参数存储」,点击「创建参数」
- 设置层级化名称(比如
/lambda/prod/payment-service-token),类型选「Secure String」,输入令牌值,选择AWS管理KMS密钥或自定义密钥 - 给Lambda的IAM角色添加
ssm:GetParameter权限 - Lambda代码中获取参数:
import boto3 def fetch_parameter(): ssm = boto3.client('ssm') response = ssm.get_parameter(Name='/lambda/prod/payment-service-token', WithDecryption=True) return response['Parameter']['Value']
- 核心优势:低存储成本、支持层级命名管理、集成KMS加密
- 适用场景:静态令牌存储、预算有限的小型项目
3. Lambda环境变量+KMS加密
Lambda原生支持环境变量,搭配KMS自动加密,适合单个Lambda专用的令牌,或者需要快速完成迁移的场景。
- 配置步骤:
- 在Lambda函数配置页的「环境变量」中添加键值对(比如
PRIVATE_TOKEN=xxxxxx) - 开启「加密配置」,选择目标KMS密钥(AWS管理密钥或自定义密钥均可)
- 确保Lambda的IAM角色拥有
kms:Decrypt权限(针对所选KMS密钥) - 代码中直接读取环境变量:
import os private_token = os.environ['PRIVATE_TOKEN']
- 在Lambda函数配置页的「环境变量」中添加键值对(比如
- 核心优势:配置简单、代码改动最小、无需额外SDK调用
- 注意事项:不适合多Lambda共享凭据(需重复配置),控制台仅显示加密后的内容,但有权限用户可解密
通用最佳实践
- 权限最小化:给Lambda的IAM角色仅分配访问指定密钥/参数的必要权限,避免过度授权
- 审计追踪:开启CloudTrail,记录所有敏感凭据的访问操作,便于事后排查
- 杜绝硬编码:无论采用哪种方案,绝对不要在代码或部署包中硬编码凭据
- 定期轮换:高敏感令牌需定期更新,Secrets Manager可自动完成,其他方案可通过脚本或手动操作实现
内容的提问来源于stack exchange,提问作者Amir Blizovsky
相关产品推荐
相关产品推荐

