向 Azure 服务验证 Rust 应用

Rust 应用程序必须向 Azure 服务(例如存储、Key Vault 或 Cosmos DB)进行身份验证。 本文介绍如何使用 Azure 标识箱在本地开发和服务器环境中安全地对 Rust 应用进行身份验证,从而提高安全性和简化凭据管理。

建议的方法是让应用在向 Azure 资源进行身份验证时使用 基于令牌的身份验证,而不是连接字符串或密钥。 azure_identity箱提供基于令牌的身份验证,并使应用能够无缝地向 Azure 资源进行身份验证,无论是在本地开发中、部署到 Azure 还是部署到本地服务器。

应用应该用来向 Azure 资源进行身份验证的特定类型的基于令牌的身份验证取决于应用正在运行的位置。

环境 Authentication
本地 当开发人员在本地开发期间运行应用时 - 应用可以使用开发人员的本地凭据向 Azure 进行身份验证。 crates.io 中提供了这些选项 :使用开发工具进行身份验证
Azure 在 Azure 上托管应用时 - 应用应使用托管标识向 Azure 资源进行身份验证。 crates.io 文档中更 详细地讨论了此选项: 对 Azure 托管的应用程序进行身份验证
本地 在本地托管和部署应用时 - 应用应使用应用程序服务主体向 Azure 资源进行身份验证。 crates.io 文档中讨论了 此选项: 对服务主体进行身份验证

基于令牌的身份验证的优点

为 Azure 生成应用时,强烈建议使用基于令牌的身份验证,而不是连接字符串或密钥等机密。

基于令牌的身份验证 机密(连接字符串和密钥)
最低特权原则,在 Azure 资源上建立应用所需的特定权限。 连接字符串或密钥授予对 Azure 资源的完整权限。
没有要存储的应用程序机密。 必须在应用设置或环境变量中存储和轮换机密。
Azure 标识库在后台为你管理令牌。 这样就可以将基于令牌的身份验证用作连接字符串。 机密不受管理。

连接字符串的使用应仅限于不访问生产或敏感数据的概念应用或开发原型的初始证明。 否则,在向 Azure 资源进行身份验证时,Azure 标识库中提供的基于令牌的身份验证类应始终首选。

在本地开发期间进行身份验证

在本地开发期间,在开发人员工作站上运行应用程序时,本地环境仍必须向应用使用的任何 Azure 服务进行身份验证。

使用 Azure CLI 凭据进行身份验证

Azure CLI 凭据使用 Azure CLI 的身份验证状态对 Rust 应用程序进行身份验证。 当你已登录 az login时,此凭据非常适合本地开发。

use azure_identity::AzureCliCredential;
use azure_security_keyvault_secrets::SecretClient;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {

    dotazure::load()?;

    let vault_url = std::env::var("AZURE_KEYVAULT_URL")
        .map_err(|_| "AZURE_KEYVAULT_URL environment variable is required")?;

    let credential = AzureCliCredential::new(None)?;

    let client = SecretClient::new(&vault_url, credential.clone(), None)?;

    Ok(())
}

使用 Azure 开发人员 CLI 凭据进行身份验证

Azure 开发人员 CLI 凭据使用 Azure 开发人员 CLI (azd) 的身份验证状态对应用程序进行身份验证。 使用 azd 模板和工作流时,此凭据非常有用。

use azure_identity::AzureDeveloperCliCredential;
use azure_security_keyvault_secrets::SecretClient;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {

    dotazure::load()?;

    let vault_url = std::env::var("AZURE_KEYVAULT_URL")
        .map_err(|_| "AZURE_KEYVAULT_URL environment variable is required")?;

    let credential = AzureDeveloperCliCredential::new(None)?;

    let client = SecretClient::new(&vault_url, credential.clone(), None)?;

    Ok(())
}

在服务器环境中进行身份验证

在服务器环境中,使用 托管标识 进行安全、无密码身份验证。 托管标识 由 Azure 自动创建和管理,因此应用程序无需存储凭据即可进行身份验证。

在服务器环境中托管时,为每个环境为每个应用程序分配唯一的应用程序标识。 在 Azure 中,应用标识由服务主体表示,这是一种特殊类型的安全主体,用于向 Azure 标识和验证应用。 用于应用的服务主体类型取决于应用运行的位置。

use azure_identity::{ManagedIdentityCredential, ManagedIdentityCredentialOptions, UserAssignedId};
use azure_security_keyvault_secrets::SecretClient;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {

    dotazure::load()?;

    let vault_url = std::env::var("AZURE_KEYVAULT_URL")
        .map_err(|_| "AZURE_KEYVAULT_URL environment variable is required")?;

    let user_assigned_id: Option<UserAssignedId> = std::env::var("AZURE_USER_ASSIGNED_IDENTITY")
        .ok()
        .map(|id| UserAssignedId::ClientId(id.clone()));

    let credential_options = ManagedIdentityCredentialOptions {
        user_assigned_id,
        ..Default::default()
    };

    let credential = ManagedIdentityCredential::new(Some(credential_options))?;

    let client = SecretClient::new(vault_url.as_str(), credential.clone(), None)?;

    Ok(())
}

代码示例

本文中所示的代码可用 https://github.com/azure-samples/azure-sdk-for-rust-docs/

其他资源