Azure サービスのパスワードレス接続
注意
パスワードレス接続は、複数の Azure サービスにまたがる、言語に依存しない機能です。 現在のドキュメントではいくつかの言語とサービスに焦点を当てていますが、現在、他の言語とサービスの追加ドキュメントを作成中です。
この記事では、パスワードに関するセキュリティ上の課題について説明し、Azure サービスにパスワードレス接続を導入します。
パスワードとシークレットに関するセキュリティの課題
パスワードとシークレット キーは慎重に使用する必要があり、開発者は安全でない場所にパスワードを配置しないでください。 多くのアプリは、ユーザー名、パスワード、アクセス キーを使用して、バックエンド データベース、キャッシュ、メッセージング、イベント サービスに接続します。 公開された場合、これらの資格情報を使用して、今後のキャンペーン用に作成した販売カタログや、非公開にする必要がある顧客データなどの機密情報への不正アクセスを取得できます。
アプリケーション自体にパスワードを埋め込むには、コード リポジトリを介した検出など、さまざまな理由で大きなセキュリティ リスクが発生します。 多くの開発者は、アプリケーションが異なる環境からパスワードを読み込むことができるように、環境変数を使用してこのようなパスワードを外部化します。 ただし、これにより、コード自体から実行環境にリスクが移るだけです。 環境にアクセスできるユーザーは誰でもパスワードを盗むことができます。これにより、データ流出リスクが高まります。
次のコード例は、ストレージ アカウント キーを使用して Azure Storage に接続する方法を示したものです。 多くの開発者は、理想的なソリューションではないにもかかわらず、過去に使用したオプションに慣れていると感じているため、このソリューションに引き寄せられます。 アプリケーションで現在アクセス キーを使用している場合は、パスワードレス接続への移行を検討してください。
// Connection using secret access keys
BlobServiceClient blobServiceClient = new(
new Uri("https://<storage-account-name>.blob.core.windows.net"),
new StorageSharedKeyCredential("<storage-account-name>", "<your-access-key>"));
開発者は、これらの種類のキーやシークレットを安全でない場所に公開しないよう熱心である必要があります。 多くの企業では、開発者、オペレーター、または他のユーザーにパスワードを公開せずに Azure サービスに接続するための厳格なセキュリティ要件があります。 多くの場合、コンテナーを使用してパスワードを格納してアプリケーションに読み込み、パスワードローテーションの要件と手順を追加することでリスクをさらに軽減します。 この方法により、運用の複雑さが増し、アプリケーション接続の停止につながる場合があります。
パスワードレス接続とゼロ トラスト
アプリでパスワードなしの接続を使用して、パスワードをローテーションすることなく Azure ベースのサービスに接続できるようになりました。 場合によっては、必要なのは構成のみであり、新しいコードは必要ありません。 ゼロ トラストでは、"信頼しない、常に検証、資格情報を使用しない" という原則が使用されます。 これは、ID を確認した後、バックエンド サービスへのアクセスを許可する前に、マシンまたはユーザーを信頼して、すべての通信をセキュリティで保護することを意味します。
セキュリティで保護されたパスワードレス接続に推奨される認証オプションは、マネージド ID と Azure ロールベースのアクセス制御 (RBAC) を組み合わせて使用することです。 この方法では、マネージド ID のさまざまなシークレットを手動で追跡および管理する必要はありません。これらのタスクは Azure によって内部的に安全に処理されるためです。
Service Connector を使用して Azure サービスへのパスワードレス接続を構成することも、手動で構成することもできます。 Service Connector を使用すると、Azure Spring Apps、Azure App Service、Azure Container Apps などのアプリ ホスティング サービスでマネージド ID を使用できます。 Service Connector では、マネージド ID と Azure RBAC を使用してパスワードレス接続を使用してバックエンド サービスを構成し、必要な接続情報でアプリケーションをハイドレートします。
パスワードレス接続用に構成されたアプリケーションの実行環境を検査すると、完全な接続文字列が表示されます。 接続文字列には、たとえば、データベース サーバー アドレス、データベース名、Azure 認証プラグインに認証を委任する命令が含まれますが、パスワードやシークレットは含まれません。
次のビデオでは、Java アプリケーションを例として使用して、アプリから Azure サービスへのパスワードレス接続を示します。 他の言語でも同様のカバレッジが近づいています。
DefaultAzureCredential の概要
Microsoft Entra ID とロール ベースのアクセス制御 (RBAC) を介した Azure サービスへのパスワードレス接続は、Azure ID クライアント ライブラリから を使用してDefaultAzureCredential
実装できます。
重要
言語によっては、コード内で DefaultAzureCredential
を明示的に実装する必要があります。一方、下層のプラグインまたはドライバーを介して内部的に DefaultAzureCredential
が利用される言語もあります。
DefaultAzureCredential
は複数の認証方法をサポートしており、どの方法が使用されるかは実行時に決定されます。 このアプローチを採用すると、環境固有のコードを実装することなく、異なる環境 (ローカル開発環境と運用環境) で異なる認証方法をアプリに使用できます。
資格情報を検索する DefaultAzureCredential
順序と場所は、言語によって異なります。
たとえば、ローカルで .NET を使用して作業している場合、DefaultAzureCredential
による認証には、通常、開発者が Visual Studio、Azure CLI、または Azure PowerShell へのサインインに使用したアカウントが使用されます。 アプリが Azure にデプロイされると、DefaultAzureCredential
によって、関連するホスティング サービス (Azure App Service など) のマネージド ID が自動的に検出され、使用されます。 この移行のためにコードを変更する必要はありません。
注意
マネージド ID は、アプリまたはサービスを表すセキュリティ ID を提供します。 ID は Azure プラットフォームによって管理され、シークレットをプロビジョニングまたはローテーションする必要はありません。 マネージド ID の詳細については、概要ドキュメントを参照してください。
以下のコード例は、パスワードレス接続を使用して Service Bus に接続する方法を示しています。 その他のドキュメントでは、特定のサービスに対してこのセットアップに移行する方法について詳しく説明しています。 .NET アプリは、 の DefaultAzureCredential
インスタンスをサービス クライアント クラスのコンストラクターに渡すことができます。 その環境で利用できる資格情報が DefaultAzureCredential
によって自動的に検出されます。
ServiceBusClient serviceBusClient = new(
new Uri("https://<your-service-bus-namespace>.blob.core.windows.net"),
new DefaultAzureCredential());
こちらもご覧ください
パスワードレス接続の詳細については、開発者ガイド「 複数の Azure アプリとサービス間のパスワードレス接続を構成する」を参照してください。