如何将GCP存储内的加密密钥无业务影响导入GCP key-management
GCP密钥无业务影响导入操作方案
结论
可以实现完全无业务影响的密钥导入,核心采用双密钥并行灰度切换方案,无需停服、无需修改现有业务的核心读写逻辑即可完成全流程操作。
前置准备
- 确认存储在GCS中的密钥符合GCP KMS导入要求:对称密钥仅支持AES-128、AES-256,非对称密钥支持RSA、ECDSA等通用类型
- 提前开启GCP KMS API,确保操作账号拥有
roles/cloudkms.importJobAdmin、roles/cloudkms.cryptoKeyAdmin权限,以及对应GCS存储桶的roles/storage.objectViewer权限 - 建议先在预发环境完成全流程验证,再操作生产环境
无感知导入&切换操作步骤
步骤1:创建KMS导入作业与密钥环
- 在目标地域创建KMS密钥环,注意密钥环一旦创建地域不可修改,需和现有业务部署地域保持一致
gcloud kms keyrings create [密钥环名称] \ --location=[地域,如us-central1]
- 创建对应用途的导入作业,导入方法选择
RSA_OAEP_3072_SHA1_AES_256(对称密钥通用导入方式,兼容性最高)
gcloud kms import-jobs create [导入作业名称] \ --location=[地域] \ --keyring=[密钥环名称] \ --import-method=RSA_OAEP_3072_SHA1_AES_256 \ --protection-level=software
- 下载导入作业的公钥,用于后续加密GCS存储的原始密钥,避免明文泄露
gcloud kms import-jobs describe [导入作业名称] \ --location=[地域] \ --keyring=[密钥环名称] \ --format="value(publicKey.pem)" > import_pubkey.pem
步骤2:加密GCS中存储的原始密钥
- 将GCS中的原始密钥下载到本地临时操作环境(操作完成后需彻底清除本地缓存)
gsutil cp gs://[你的密钥存储桶路径]/[原始密钥文件名] ./origin_key.bin
- 用下载的导入公钥加密原始密钥
openssl pkeyutl -encrypt -in origin_key.bin \ -inkey import_pubkey.pem \ -pubin -out encrypted_key.bin \ -pkeyopt rsa_padding_mode:oaep \ -pkeyopt rsa_oaep_md:sha1 \ -pkeyopt rsa_mgf1_md:sha1
步骤3:导入密钥到KMS并验证一致性
- 创建对应用途的KMS CryptoKey,
purpose参数需和原始密钥的用途一致(对称加密选ENCRYPT_DECRYPT)
gcloud kms keys create [KMS密钥名称] \ --location=[地域] \ --keyring=[密钥环名称] \ --purpose=ENCRYPT_DECRYPT \ --skip-initial-version-creation
- 导入加密后的密钥到KMS作为第一个版本
gcloud kms keys versions import \ --encrypted-key-file=./encrypted_key.bin \ --location=[地域] \ --keyring=[密钥环名称] \ --key=[KMS密钥名称] \ --import-job=[导入作业名称] \ --import-job-location=[地域] \ --import-job-keyring=[密钥环名称]
- 验证导入的密钥和原始密钥一致性:用KMS导入的密钥解密一段之前用原始密钥加密的测试密文,确认解密结果和明文完全一致
步骤4:灰度切换无业务影响
这一步是无感知切换的核心,全程不会影响现有业务读写
- 先修改业务加密逻辑为双写模式:新写入的数据同时用原始密钥和KMS导入的密钥加密,原有解密逻辑保持不变,依然用GCS存储的原始密钥解密,运行1-3天确认无异常
- 逐步灰度修改解密逻辑:先切1%流量用KMS密钥解密,确认没有错误后逐步提升到10%、50%、100%,整个过程如果出现异常可以立刻切回原始密钥解密,无业务损失
- 解密流量全部切到KMS且稳定运行7天以上后,再下线双写逻辑,后续仅用KMS密钥加密,最后删除GCS中存储的原始密钥即可
相关实践经验参考
- 导入的密钥默认版本状态为
ENABLED,如果需要可以先设置为DISABLED,验证完一致性再开启,避免误操作 - 如果原始密钥用于GCS服务端加密,不需要修改业务逻辑,直接在KMS导入完成后修改存储桶的加密配置为KMS密钥即可,GCS会自动完成存量数据的重加密,过程不影响业务访问
- 导入作业有效期为24小时,超过有效期需要重新创建,不要用过期的导入作业公钥加密密钥
- 不要直接导入明文密钥,必须用导入作业的公钥加密后再导入,避免密钥在传输过程中泄露
- 建议给KMS密钥开启版本轮换,后续KMS会自动管理密钥版本,不需要再手动维护存储在GCS的密钥文件
内容的提问来源于stack exchange,提问作者raindrop
相关产品推荐
相关产品推荐

