项目中敏感配置信息一般需要进行加密处理,比如数据库密码,Spring Boot内置不提供加密支持,不能加密配置文件信息,在官方文档中提供了自定义Environment和Spring Cloud Vault两种解决方案。使用jasypt-spring-boot是另一种方案。Spring Cloud Vault为HashiCorp Vault的客户端,支持访问HashiCorp Vault内存储的数据,避免了在Spring Boot程序中存储敏感数据。本文详细介绍了如何使用jasypt-spring-boot、Spring Cloud Vault和HashiCorp Vault,如何使用Vault的AWS Secret、Database Secret、AWS EC2认证和AWS IAM认证。自定义的EnvironmentPostProcessor需在META-INF/spring.factories内注册:有三种方式集成jasypt-spring-boot:或者使用@EncryptablePropertySources:默认,加密算法为PBEWithMD5AndDES,加解密bean name为jasyptStringEncryptor,加密的数据需使用ENC()包裹。
所有这些属性都可在配置文件中声明,但加密密码不应存储在配置文件中,而应使用系统属性、命令行参数传入,只要名称为jasypt.encryptor.password即可:也可在application.properties 或 application.yml中使用环境变量:配置文件示例:使用CLI工具JasyptPBEStringEncryptionCLI生成加密数据,如下:执行后,输出如下:生成后,使用ENC(密文)替换明文数据即可。HashiCorp Vault提供集中管理机密(Secret)和保护敏感数据的服务,可通过UI、CLI或HTTP API访问。HashiCorp Vault使用GO语言编写。根据您的系统下载HashiCorp Vault,然后解压zip包,其中为一可执行文件。以linux系统为例:帮助
直接运行vault可查看支持的命令:运行 vault [command] [subcommand] -h可查看命令支持的参数。path-help 查看系统、Secret引擎、认证方法等路径支持的配置,在实际应用中经常用到。比如:说明:要启用相应功能才能查看路径。自动完成
linux下,Vault支持命令自动完成功能,安装后输入vault [tab]会显示命令提示,需执行以下命令安装:安装后将在~/.bashrc内添加如下内容:dev模式启动Vault
以dev模式启动不需任何配置,数据保存在内存中。控制台输出如下内容:其中,Unseal Key、Root Token要保存下来。以dev模式启动Vault其状态是unseal的,不需要使用Unseal Key解封服务器。访问Vault需要使用Root Token。建议将Vault服务器地址保存到环境变量VAULT_ADDR中,否则使用命令行访问vault时需要指定-address参数。查看Vault Server状态:说明:-address默认为https://127.0.0.1:8200从浏览器登录Vault,在地址栏输入http://localhost:8200 :
在Token文本框内输入“Root Token”,进入Vault主界面:
从命令行登录Vault:Vault支持多种登录认证方式,默认启用了token方式。
从命令行查看启用的认证方法:Vault支持多种Secret引擎,一些引擎只是存储和读取数据,如kv;一些引擎连接到其他服务并根据需要生成动态凭据,如AWS、database;一些引擎提供加密服务(如transit)、证书生成(如pki)等。默认启用了kv(Key-Value)和cubbyhole引擎。
从命令行查看启用的Secret引擎:我们在kv引擎secret下创建一secret供后面测试使用,如下:
也可以使用命令行:查询secret:之前使用dev模式启动Vault,接下来说明真实环境如何配置。以非dev模式启动Vault必须提供至少一个配置文件,下面创建配置文件vault.hcl:配置文件支持HCL (HashiCorp Configuration Language开发云主机域名)和JSON格式,vault.hcl内容如下:参数:生成自签名证书:使用自签名证书时需要配置环境变量VAULT_CACERT:Spring Cloud Vault通过HTTPS协议访问Vault时需配置客户端证书,执行以下命令将cert.pem导入到keystore中:启动前先授权vault使用mlock syscall:否则会显示如下错误:启动Vault:kill掉上面的vault进程,配置vault为系统服务。
创建vault.service:内容如下:启动Vault:首次启动vault后需要执行初始化操作。初始化后生成加密key、unseal key、Initial Root Token,这些数据要保存到安全的地方。初始化后Vault Server处于封印状态,因不知如何解密存储的数据,所以不能读取。初始化输出的内容中“Vault initialized with 5 key shares and a key threshold of 3”,意味着为了解封需要5个key中的3个,执行解封命令如下:选取3个key,执行3次上面的命令直到Sealed状态为false:使用Initial Root Token登录Vault:登录成功后,输出如下结果:root用户可以重新封印Vault:Vault支持集群部署,更多内容请查阅官方文档。
Root Token具有最高权限,最佳实践不应存储Root Token,仅在必要时使用vault operator generate-root命令生成,用毕撤销token。
撤销token生成Root Token需要输入3次Unseal Key,成功后将输出Encoded Token:创建Token,设定有效时间,不指定policy新token为当前使用token的子token,权限继承自当前使用的token。过期后可renew token:创建Token,指定Policy
Policy有如下几种权限:创建策略文件,仅允许读取路径secret/heroes-api:内容如下:上传策略:使用新策略创建Token:默认duration为768h,policy为”default” “heroes”。
使用新token登录,查看secret:使用AWS Secret引擎,每次访问创建新的AWS用户和登录凭证(访问密钥),Vault并不存储凭证。说明,可使用vault path-help命令查看路径配置:配置Vault创建的AWS用户的角色:成功执行以上命令后可通过AWS IAM控制台查看新创建的用户。可使用lease_id来执行renew、revoke操作,执行revoke后将删除AWS用户:使用Database Secret引擎可动态创建数据库用户并授权。目前支持的数据库有Cassandra、HANA、MongoDB、MSSQL、MySQL/MariaDB、PostgreSQL、Oracle。参数:
plugin_name 插件名称,使用postgresql数据库
allowed_roles 允许使用的vault角色
用户名、密码要使用模板。可执行以下命令查看参数说明:角色用来定义创建数据库用户和授权的脚本:{{name}}和{{password}}将动态生成。AWS认证方法提供了一种自动索取Vault token的机制,支持EC2和IAM两种方式。EC2认证,AWS被视为受信任的第三方,使用唯一代表每个ec2实例的加密签名动态元数据信息进行身份验证,仅适用于EC2实例。IAM认证,使用AWS IAM凭据签名的AWS请求进行身份验证,IAM凭据可来自IAM User、IAM Role,适用于EC2实例、Lambda函数及其他提供AWS凭据的环境。推荐使用IAM认证。根据您使用的AWS区域选择终端节点,AWS区域和终端节点。角色配置中至少含有一种约束条件。EC2认证IAM User认证登录时仅需提供User访问密钥。IAM Role认证
下例适用于EC2实例,inferred_entity_type为ec2_instance,认证的EC2需要授予IAM角色并符合约束条件。EC2认证需要验证签名,需要配置region的公有证书。
中国(北京)地区的 AWS 公有证书如下:将其保存在文件AWSpubkey中,然后执行下面命令导入证书:说明:cn-cert为证书名称。首次EC2认证时执行如下命令:输出如下结果:其中包含token、token_meta_nonce等,token权限为[“default” “heroes”]。再次登录时需要提供nonce:IAM认证,Vault使用了AWS GO SDK,需要指定AWS Region:也可以设置环境变量AWS_SDK_LOAD_CONFIG为true,这样可以从.aws文件夹读取配置:执行IAM User认证:访问密钥可以在命令行提供,也可以从.aws文件夹读取。输出如下结果:执行IAM Role认证:输出如下结果:若未指定AWS Region,会输出如下错误:在POM中配置Spring Cloud Vault依赖:Spring Cloud Vault配置支持bootstrap.properties、bootstrap.yml两种格式。在项目resources目录下创建bootstrap.yml文件,内容如下:参数含义:
authentication: TOKEN 设置认证方式,Spring Cloud Vault支持的认证方式有:TOKEN, APPID, APPROLE, AWS_EC2, AWS_IAM, AZURE_MSI, CERT, CUBBYHOLE, GCP_GCE, GCP_IAM, KUBERNETES
kv.enabled: true 访问kv引擎数据
kv.backend: secret 设置secret的路径Spring Cloud Vault从以下路径查找secret属性数据:application名字由以下配置属性决定:使用https协议时需配置trust-store。访问方式与读取Spring Boot配置文件属性相同,以下代码则会读取/secret/heroes-api/hello值:从HashiCorp Vault AWS Secret引擎获取凭证,需增加spring-cloud-vault-config-aws依赖:增加如下配置启用AWS后端:参数:
role AWS Secret引擎中的角色名称
access-key-property 存储AWS access key的属性名称
secret-key-property 存储AWS secret key的属性名称代码中读取生成用户凭证:每次读取创建AWS用户和访问密钥。为利用Vault Database Secret引擎动态创建数据库凭证需添加spring-cloud-vault-config-databases依赖:增加如下配置启用Database后端:参数:
role Database Secret引擎中的角色名称
username-property 存储数据库用户名的属性名称
password-property 存储数据库密码的属性名称用户名密码保存在spring.datasource.username和spring.datasource.password内,datasource中无需再配置。首先修改heroes-policy.hcl,如下:重新写入policy:配置bootstrap.yml:参数说明:
authentication: AWS_EC2 启用AWS_EC2认证
aws-ec2.aws-ec2-path Spring Cloud Vault默认路径为aws-ec2,HashiCorp Vault默认路径为aws,两者要一致AWS IAM认证,Spring Vault在生成签名的请求时需要使用aws-java-sdk-core, 增加依赖:下面我们来看一下生成签名请求的过程。
Spring Vault org.springframework.vault.authentication.AwsIamAuthentication部分源代码在org.springframework.vault.authentication.AwsIamAuthenticationOptions .AwsIamAuthenticationOptionsBuilder中硬编码了sts URI为“sts.amazonaws.com”,因此不能从地址推断出region(推断方法请看com.amazonaws.util.AwsHostNameUtils.parseStandardRegionName()):继续阅读com.amazonaws.auth.AWS4Signer源码,看如何生成签名:
com.amazonaws.auth.AWS4Signer部分源码在生成的签名请求中必须包含region参数,如未增加配置,最终得到的region将是”us-east-1″。有兴趣的同学可以继续跟踪源码com.amazonaws.util.AwsHostNameUtils.parseRegion() -> parseRegionNameByInternalConfig() -> InternalConfig.Factory.getInternalConfig() -> InternalConfig load(),其中会读取自定义配置文件”awssdk_config_override.json”。下面我们使用这个文件来定义region(放在resources目录即可,如有更好方法请留言),内容如下:
配置Region配置bootstrap.yml2019港百女子前十
HashiCorp Vault
Learn about secrets management and data protection with HashiCorp Vault
Vault Documentation
GitHub – HashiCorp Vault
Spring Cloud Vault
spring-cloud-vault-config-samples
AWS Instance Metadata and User Data
AWS SDK for Go Developer Guide
相关推荐: 亲自动手搭建微服务框架和测试环境-8-SpringCloud
EJBDubboSpringCloud开发方标准由oracle开发阿里Spring社区最新版本及时间3.1,2009年2.5.3,2012年10月23号Finchley.SR1,2018年8月1号维护状态不活跃,3.2只是草案不再继续维护活跃互联网应用案例暂未…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。