Spring Boot2.1+AWS Java SDK v1从SSM参数存储读取密钥方案咨询
可行实现方案
方案一:利用AWS托管服务的IAM角色(推荐)
这是AWS生态下最标准、安全的解决方式,直接打破“无凭据调用SSM”的死循环:
- 给应用所在的AWS资源(EC2实例、ECS任务、EKS Pod等)绑定最小权限的IAM角色,角色仅需包含:
ssm:GetParameter(或ssm:GetParameters)权限,且限定到存储Access Key和Secret Access Key的SSM参数路径- 若SSM参数用KMS加密(推荐用
SecureString类型),需额外添加对应KMS密钥的kms:Decrypt权限
- 应用启动(Bean实例化)阶段,通过AWS SDK创建SSM客户端:SDK会自动从实例元数据服务(IMDS)获取IAM角色的临时凭据,无需硬编码任何密钥即可调用SSM
- 读取到AK/SK后,构造
StaticCredentialsProvider作为最终的AwsCredentialsProviderBean,供其他AWS服务客户端使用 - 优势:无需维护硬编码凭据,权限最小化,启动时仅读取一次SSM参数,不会在请求阶段重复调用
方案二:非AWS环境的变通方案
如果应用部署在本地或非AWS托管服务器,可按以下方式处理:
- 创建一个仅拥有SSM参数读取权限的专用IAM用户,将该用户的凭据存储在应用本地的加密配置文件中(仅用于访问SSM,权限严格最小化)
- 应用启动时,读取本地加密配置文件中的专用IAM用户凭据,创建SSM客户端读取目标AK/SK
- 构造
StaticCredentialsProvider作为业务用的凭据提供者,后续业务请求直接使用内存缓存的凭据 - 补充:本地配置文件需通过操作系统级加密机制(如Linux LUKS、Windows BitLocker)保护,避免明文泄露
核心注意事项
- 所有SSM参数必须使用
SecureString类型,配合AWS KMS加密,禁止明文存储密钥 - 应用启动时仅读取一次SSM参数,将凭据缓存到内存,避免重复调用SSM或Lambda
- 严格遵循最小权限原则:无论是IAM角色还是专用IAM用户,仅授予必要的SSM读取和KMS解密权限,禁止多余权限
内容的提问来源于stack exchange,提问作者Micro
相关产品推荐
相关产品推荐

