Azure Key Vault是微软Azure提供的一项服务,旨在帮助用户安全地存储和管理敏感信息,如加密密钥、证书和密码等。它提供了一个集中的位置来保护这些重要资产,并且通过细粒度的访问控制和审计日志来确保安全性。
1、主要功能
(1)、密钥管理
- 密钥类型:
- 软件密钥(Standard 层):基于Azure软件加密,成本较低,适合一般应用场景。
- HSM密钥(Premium 层):由FIPS 140-2 Level 3认证的硬件安全模块(HSM)保护,满足金融、医疗等高安全需求场景。
- 密钥操作:
- 支持生成、导入、轮换密钥(自动/手动)。
- 提供密钥版本管理,旧版本密钥可保留以解密历史数据。
- 支持加密算法包括AES、RSA、ECC等,但不支持国密算法(SM2/SM4)(与阿里云KMS不同)。
(2)、证书管理
- SSL/TLS 证书:支持获取、管理和部署 SSL/TLS 证书。可以自动续订由受信任的证书颁发机构 (CA) 签发的证书。
- 证书生命周期管理:包括证书的申请、续订、吊销等功能。
(3)、机密管理
- 存储机密:能够安全地存储诸如数据库连接字符串、API 密钥和其他敏感信息。
- 机密版本控制:支持多个版本的机密,便于回滚和审计。
(4)、访问控制
- 身份验证:
- 托管标识(推荐):Azure资源(如VM、函数)可自动获取身份,无需管理密钥或证书。
- 服务主体:通过Azure AD服务主体访问,需手动轮换密钥。
- 权限模型:
- Azure RBAC:细粒度控制用户/应用对密钥、机密、证书的访问权限(如"密钥加密用户"、"机密读者")。
- Key Vault访问策略:基于角色的权限控制,支持用户、服务主体、托管标识等。
(5)、审计和监控
- 日志记录和监控:提供详细的日志记录,用于跟踪对 Key Vault 资源的所有访问活动。
- 诊断设置:可以配置诊断设置以将日志发送到 Log Analytics 工作区、Azure 存储帐户或 Event Hub。
(6)、高可用性和灾难恢复
- 区域冗余:默认情况下,Key Vault 在区域内提供冗余,以防止局部故障。
- 异地复制:可选配异地冗余选项,以实现跨地理区域的数据备份和恢复能力。
2、使用场景
- 应用程序认证与授权:通过安全地存储和访问 API 密钥、OAuth tokens 等,提高应用的安全性。
- 数据加密:利用Key Vault来管理和使用加密密钥,为数据加密提供基础支持。
- 合规性要求:满足行业标准和法规对数据保护的要求,例如 PCI-DSS、HIPAA等。
3、说明示例:本地MySQL与Azure Key Vault集成
如:密钥加密数据流程。
(1)、生成数据密钥(DEK):
- 调用Azure Key Vault的GenerateKey接口,获取密钥(如AES-256)。
(2)、加密数据:
- 使用DEK加密本地MySQL数据,将密文DEK存储到Key Vault。
(3)、解密数据:
- 通过Key Vault的Decrypt接口解密密文DEK,获取明文DEK后解密数据。
(4)、密钥轮换:
- 启用自动轮换后,Key Vault生成新密钥版本,需重新加密DEK并更新存储。
4、Azure平台配置步骤
(1)、创建 Azure Key Vault
1. 登录 Azure 门户:
- 访问 Azure 门户 并登录。
2. 创建资源组:
- 在 Azure 门户中,选择 资源组 → 创建资源组,输入名称(如 myResourceGroup)和位置(如 China East)。
3. 创建 Key Vault:
- 在 Azure 门户中,搜索并选择 密钥保管库 → 创建。
- 填写以下信息:
- 名称:唯一名称(如 mykeyvault2023)。
- 订阅:选择你的 Azure 订阅。
- 资源组:选择刚才创建的资源组。
- 位置:与资源组一致(如 China East)。
- 点击 查看 + 创建 → 创建。
4. 配置网络访问(可选):
- 进入 Key Vault 资源 → 网络 → 防火墙和虚拟网络。
- 选择 允许的访问来源 → 所选网络,添加允许访问的 IP 或虚拟网络。
5. 设置访问策略:
- 进入 Key Vault 资源 → 访问策略 → 添加访问策略。
- 选择 密钥权限(如 WrapKey、UnwrapKey)和 机密权限(如 Get、List)。
- 选择主实体:选择你的 Azure AD 用户或服务主体(如 Azure Cloud Shell)。
(2)、存储机密到 Key Vault
1. 添加机密:
- 进入 Key Vault 资源 → 机密 → 生成/导入。
- 输入机密名称(如 my-secret)和值(如 my-value),点击 创建。
2. 获取 Key Vault URI:
- Key Vault 的 URI 格式为 https://.vault.azure.net/。
5、代码示例
(1)、添加依赖
在pom.xml中添加以下依赖(Spring Cloud Azure):
java
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-dependencies</artifactId>
<version>5.9.0</version> <!-- 查看最新版本 -->
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter</artifactId>
</dependency>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-keyvault-secrets</artifactId>
</dependency>
</dependencies>
(2)、配置 application.properties
在 src/main/resources/application.properties 中配置 Key Vault:
properties配置示例:
java
spring.cloud.azure.keyvault.secret.properties.enabled=true
spring.cloud.azure.keyvault.secret.uri=https://<your-keyvault-name>.vault.azure.net/
(3)、设置身份验证凭据
通过环境变量或 Azure 服务主体配置身份:
- 使用服务主体:
1. 在 Azure 门户中,创建一个 应用注册(App Registration)并获取:- 客户端 ID(Client ID)
- 客户端密钥(Client Secret)
- 租户 ID(Tenant ID)
2. 在本地环境变量中设置:
bash示例:
export AZURE_TENANT_ID="your-tenant-id"
export AZURE_CLIENT_ID="your-client-id"
export AZURE_CLIENT_SECRET="your-client-secret"
(4)、配置类
java
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties(prefix = "app")
public class AppConfig {
private String secretFromKeyVault;
// Getter 和 Setter
public String getSecretFromKeyVault() {
return secretFromKeyVault;
}
public void setSecretFromKeyVault(String secretFromKeyVault) {
this.secretFromKeyVault = secretFromKeyVault;
}
}
(5)、获取配置机密
java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class KeyVaultController {
@Autowired
private AppConfig appConfig;
@GetMapping("/secret")
public String getSecret() {
return "Secret from Key Vault: " + appConfig.getSecretFromKeyVault();
}
}
解释:
访问 http://localhost:8080/secret 应返回Key Vault中存储的机密值。
(6)、加密/解密的示例代码
java
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.security.keyvault.keys.KeyClient;
import com.azure.security.keyvault.keys.KeyClientBuilder;
import com.azure.security.keyvault.keys.cryptography.CryptographyClient;
import com.azure.security.keyvault.keys.cryptography.CryptographyClientBuilder;
import com.azure.security.keyvault.keys.models.KeyVaultKey;
import java.util.Base64;
public class AzureKeyVaultExample {
public static void main(String[] args) {
// 创建 KeyClient
KeyClient keyClient = new KeyClientBuilder()
.vaultUrl("https://<your-key-vault-name>.vault.azure.net/")
.credential(new DefaultAzureCredentialBuilder().build())
.buildClient();
// 获取或创建密钥
String keyName = "myEncryptionKey";
KeyVaultKey key = keyClient.createRsaKey(keyName);
// 创建 CryptographyClient
CryptographyClient cryptoClient = new CryptographyClientBuilder()
.keyIdentifier(key.getId())
.credential(new DefaultAzureCredentialBuilder().build())
.buildClient();
// 要加密的数据
String sensitiveData = "Sensitive Data";
byte[] plaintext = sensitiveData.getBytes();
// 加密数据
byte[] encryptedData = cryptoClient.encrypt("RSA-OAEP", plaintext).getCiphertext();
System.out.println("Encrypted Data: " + Base64.getEncoder().encodeToString(encryptedData));
// 解密数据
byte[] decryptedData = cryptoClient.decrypt("RSA-OAEP", encryptedData).getPlaintext();
System.out.println("Decrypted Data: " + new String(decryptedData));
}
}
6、对比AWS和阿里云
Azure Key Vault、AWS KMS和阿里云KMS都是各自云平台提供的密钥管理服务,旨在帮助用户安全地创建、管理和使用加密密钥。下面从几个关键维度对这三种服务进行对比:
(1)、核心功能
-
Azure Key Vault:
- 提供密钥、证书和机密的管理。
- 支持硬件安全模块(HSM)保护的密钥。
- 允许存储和管理SSL/TLS证书。
- 提供详细的日志记录和监控。
-
AWS KMS:
- 主要专注于密钥管理(包括生成、轮换、导入和使用)。
- 支持通过HSM增强的安全性选项。
- 提供了与多种AWS服务的深度集成,如S3、RDS等。
- 支持客户主密钥(CMK)的概念,并允许自动密钥轮换。
-
阿里云 KMS:
- 类似于AWS KMS,专注于密钥管理。
- 支持对称和非对称密钥的创建和管理。
- 提供了与阿里云其他服务的紧密集成。
- 支持密钥版本控制和自动密钥轮换。
(2)、安全性
所有这三个服务都提供了高级别的安全性,包括但不限于HSM支持。它们都设计用于满足各种合规性要求,比如ISO 27001, SOC 1/2/3, PCI-DSS 等。
(3)、集成能力
- Azure Key Vault:与Azure生态系统中的服务紧密集成,例如Azure App Service、Virtual Machines等。
- AWS KMS:与众多AWS服务高度集成,如EC2、S3、Lambda等,简化了数据加密过程。
- 阿里云 KMS:与阿里云的服务如OSS、RDS等深度整合,为用户提供无缝的数据保护体验。
(4)、价格模型
每个服务的价格模型都有所不同,通常基于密钥的使用量、请求次数以及存储的数据量等因素计费。具体费用需参考各云服务商最新的定价策略。
(5)、易用性和灵活性
- Azure Key Vault:因其不仅限于密钥管理,还包括证书和机密管理,可能更适合需要全面解决方案的企业。
- AWS KMS:由于其强大的API支持和与其他AWS服务的深度集成,特别适合已经深入使用AWS生态系统的用户。
- 阿里云 KMS:针对中国市场的优化,以及与阿里云其他服务的良好集成,使得它成为阿里云用户的理想选择。
(6)、地域覆盖
- Azure Key Vault:作为微软Azure的一部分,覆盖全球多个区域。
- AWS KMS:作为AWS的一部分,提供广泛的地理覆盖范围。
- 阿里云 KMS:主要集中在亚洲地区,尤其是中国市场,但也在扩展至其他国家和地区。
(7)、选择建议
- 需要国密算法(SM2/SM4):阿里云KMS。
- 微软生态深度集成:Azure Key Vault。
- AWS全栈部署:AWS KMS。
- 成本敏感的中国本地业务:阿里云KMS。
- 跨国企业需FIPS认证:Azure或AWS的HSM层。
逆风翻盘,Dare To Be!!!