Rust アプリケーションは、ストレージ、Key Vault、Cosmos DB などの Azure サービスに対して認証する必要があります。 この記事では、Azure ID クレートを使用して、ローカルの開発環境とサーバー環境で Rust アプリを安全に認証し、セキュリティを強化し、資格情報管理を簡素化する方法について説明します。
推奨されるトークン ベースの認証
Azure リソースに対する認証時に、接続文字列やキーではなくトークン ベースの認証をアプリで使用することをお勧めします。 azure_identity クレートはトークンベースの認証を提供し、アプリがローカル開発中であるか、Azure にデプロイされているか、オンプレミス サーバーにデプロイされているかに関係なく、アプリが Azure リソースに対してシームレスに認証できるようにします。
アプリが Azure リソースに対する認証に使用するトークン ベースの認証の特定の種類は、アプリの実行場所によって異なります。
| 環境 | Authentication |
|---|---|
| ローカル | 開発者がローカル開発中にアプリを実行する場合 - アプリは、開発者のローカル資格情報を使用して Azure に対して認証できます。 これらのオプションの詳細については、「 crates.io: 開発ツールを使用した認証」を参照してください。 |
| Azure | アプリが Azure でホストされている場合 - アプリは、マネージド ID を使用して Azure リソースに対して認証する必要があります。 このオプションの詳細については、 crates.io ドキュメント「 Azure でホストされるアプリケーションの認証」を参照してください。 |
| オンプレミス | アプリがオンプレミスでホストおよびデプロイされている場合- アプリは、アプリケーション サービス プリンシパルを使用して Azure リソースに対して認証する必要があります。 このオプションについては、 crates.io ドキュメント「 サービス プリンシパルの認証」を参照してください。 |
トークン ベースの認証の利点
Azure 用のアプリを構築する場合は、接続文字列やキーなどのシークレットではなく、トークンベースの認証を使用することを強くお勧めします。
| トークンベースの認証 | シークレット (接続文字列とキー) |
|---|---|
| 最小限の特権の原則。Azure リソースでアプリに必要な特定のアクセス許可を確立します。 | 接続文字列またはキーは、Azure リソースに対する完全な権限を付与します。 |
| 保存するアプリケーション シークレットはありません。 | アプリ設定または環境変数にシークレットを格納してローテーションする必要があります。 |
| Azure ID ライブラリは、バックグラウンドでトークンを管理します。 これにより、トークンベースの認証を接続文字列と同じくらい簡単に使用できます。 | シークレットは管理されません。 |
接続文字列の使用は、運用環境や機密データにアクセスしない概念実証アプリまたは開発プロトタイプに限定する必要があります。 それ以外の場合は、Azure リソースに対する認証時に、Azure ID ライブラリで使用できるトークン ベースの認証クラスを常に優先する必要があります。
ローカル開発中に認証する
ローカル開発中に開発者のワークステーションでアプリケーションを実行する場合、ローカル環境は、アプリで使用されるすべての 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 Developer CLI 資格情報を使用して認証する
Azure Developer CLI 資格情報は、Azure Developer 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(())
}
サーバー環境での認証
サーバー環境では、セキュリティで保護されたパスワードレス認証に マネージド ID を 使用します。 マネージド ID は Azure によって自動的に作成および管理されるため、アプリケーションは資格情報を格納しなくても認証できます。
サーバー環境でホストする場合は、環境ごとにアプリケーションごとに一意のアプリケーション ID を割り当てます。 Azure では、アプリ ID は、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/で入手できます。
その他のリソース
- Crates.io 上の Azure SDK クレート - 使用可能な Azure SDK クレートの一覧
- Azure SDK の設計ガイドライン - 設計の原則とパターン
- Azure SDK for Rust GitHub リポジトリ - 問題とソース コード
- Cargo ドキュメント - 完全な Cargo リファレンス