Azure SDK for Go での認証 (レガシ)
Azure SDK for Go には、Azure での認証方法が複数用意されています。 これらの認証の "種類" は、さまざまな認証 "方法" で呼び出されます。 この記事では、使用可能な種類、方法、およびアプリケーションに最適なものを選択する方法について説明します。
使用可能な認証の種類と方法
Azure SDK for Go では、異なる資格情報セットを使用する複数の認証の種類が提供されます。 認証の種類は、それぞれ異なる認証方法 (SDK が資格情報を入力として受け取る方法) で使用できます。 次の表に、使用できる認証の種類と、アプリケーションで使用する際に推奨される状況を示します。
Authentication type | 推奨される状況 |
---|---|
証明書ベースの認証 | Microsoft Entra ユーザーまたはサービス プリンシパル用に構成された X509 証明書があります。 詳細については、「Microsoft Entra ID の証明書ベースの認証の概要」をご覧ください。 |
クライアントの資格情報 | このアプリケーションまたはアプリケーションが属するクラス用に設定された構成済みのサービス プリンシパルがある場合。 詳細については、Azure CLI でのサービス プリンシパルの作成に関する記事をご覧ください。 |
Azure リソースのマネージド ID | マネージド ID で構成された Azure リソース上でアプリケーションが実行されている場合。 詳細については、Azure リソースのマネージド ID の概要に関するページをご覧ください。 |
デバイス トークン | お使いのアプリケーションでは、対話形式 "のみ" の使用が想定されている場合。 ユーザーが多要素認証を有効にしている可能性があります。 ユーザーは、Web ブラウザーにアクセスしてサインインできます。 詳細については、「デバイス トークン認証を使用する」をご覧ください。 |
ユーザー名/パスワード | 他のどの認証方法も使用できない対話型アプリケーションがある場合。 ユーザーは、Microsoft Entra サインインで多要素認証を有効にすることはできません。 |
重要なポイント
- クライアントの資格情報以外の認証の種類を使用する場合は、アプリケーションを Microsoft Entra ID に登録する必要があります。 方法については、「アプリケーションを Microsoft Entra ID と統合する」を参照してください。
- 特別な要件がない限り、ユーザー名/パスワード認証は避けてください。 ユーザー ベースのサインインが適している場合、通常はデバイス トークン認証を代わりに使用できます。
これらの認証の種類は、異なる方法で使用できます。
- 環境ベースの認証では、プログラムの環境から資格情報を直接読み取ります。
- ファイル ベースの認証では、サービス プリンシパルの資格情報が含まれたファイルを読み込みます。
- "クライアント ベースの認証" では、コード内のオブジェクトを使用します。プログラムの実行時に資格情報を提供する必要があります。
- "デバイス トークン認証" では、ユーザーはトークンを使用して Web ブラウザーを介して対話形式でサインインする必要があります。
すべての認証機能と種類は、github.com/Azure/go-autorest/autorest/azure/auth パッケージにあります。
Note
特別な要件がない限り、クライアント ベースの認証は避けてください。 この認証方法では、バッド プラクティスが助長されます。 特に、クライアント ベースの認証を使用すると、資格情報をハードコードしてしまいがちになります。 また、認証用のカスタム コードを記述すると、認証要件が変わった場合に、SDK の今後のリリースでコードが動作しなくなる可能性があります。
環境ベースの認証を使用する
管理された設定でアプリケーションを実行している場合は、環境ベースの認証が自然な選択となります。 この認証方法を使用して、シェル環境を構成してからアプリケーションを実行します。 実行時に、Azure で認証するために、これらの環境変数が Go SDK によって読み取られます。
環境ベースの認証では、デバイス トークンを除くすべての認証タイプがサポートされ、次の順番で評価されます。
- クライアントの資格情報
- 証明書ベースの認証
- ユーザー名/パスワード
- Azure リソースのマネージド ID
認証の種類に設定されていない値があったり、拒否されたりした場合は、SDK では自動的に次の認証の種類が試行されます。 試行できる種類がそれ以上ない場合、SDK によってエラーが返されます。
次の表に、環境ベースの認証でサポートされている各認証の種類で設定する必要がある環境変数の詳細を示します。
Authentication type | 環境変数 | 説明 |
---|---|---|
クライアント資格情報 | AZURE_TENANT_ID |
サービス プリンシパルが属する Active Directory テナントの ID。 |
AZURE_CLIENT_ID |
サービス プリンシパルの名前または ID。 | |
AZURE_CLIENT_SECRET |
サービス プリンシパルに関連付けられているシークレット。 | |
[証明書] | AZURE_TENANT_ID |
証明書が登録されている Active Directory テナントの ID。 |
AZURE_CLIENT_ID |
証明書に関連付けられているアプリケーション クライアント ID。 | |
AZURE_CERTIFICATE_PATH |
クライアント証明書ファイルのパス。 | |
AZURE_CERTIFICATE_PASSWORD |
クライアント証明書のパスワード。 | |
ユーザー名/パスワード | AZURE_TENANT_ID |
ユーザーが属する Active Directory テナントの ID。 |
AZURE_CLIENT_ID |
アプリケーション クライアント ID。 | |
AZURE_USERNAME |
サインインに使用するユーザー名。 | |
AZURE_PASSWORD |
サインインに使用するパスワード。 | |
マネージド ID | マネージド ID 認証では資格情報は必要ありません。 アプリケーションは、マネージド ID を使用するように構成された Azure リソース上で実行されている必要があります。 詳細については、Azure リソースのマネージド ID の概要に関するページをご覧ください。 |
既定の Azure パブリック クラウド以外のクラウドまたは管理エンドポイントに接続するには、次の環境変数を設定します。 Azure Stack、異なる地理的リージョンのクラウド、またはクラシック デプロイ モデルを使用する場合が最も一般的な理由です。
環境変数 | 説明 |
---|---|
AZURE_ENVIRONMENT |
接続先のクラウド環境の名前。 |
AZURE_AD_RESOURCE |
接続するときに管理エンドポイントの URI として使用する Active Directory リソース ID。 |
環境ベースの認証を使用する場合は、NewAuthorizerFromEnvironment 関数を呼び出して authorizer オブジェクトを取得します。 その後、このオブジェクトがクライアントの Authorizer
プロパティで設定され、Azure へのクライアントのアクセスが許可されます。
import "github.com/Azure/go-autorest/autorest/azure/auth"
authorizer, err := auth.NewAuthorizerFromEnvironment()
Azure Stack での認証
Azure Stack で認証するには、次の変数を設定する必要があります。
環境変数 | 説明 |
---|---|
AZURE_AD_ENDPOINT |
Active Directory エンドポイント。 |
AZURE_AD_RESOURCE |
Active Directory リソース ID。 |
これらの変数は、Azure Stack のメタデータ情報から取得できます。 メタデータを取得するには、Azure Stack 環境で Web ブラウザーを開き、URL として (ResourceManagerURL)/metadata/endpoints?api-version=1.0
を使用します。
ResourceManagerURL
は、Azure Stack デプロイのリージョン名、マシン名、外部完全修飾ドメイン名 (FQDN) によって異なります。
環境 | ResourceManagerURL |
---|---|
開発キット | https://management.local.azurestack.external/ |
統合システム | https://management.(region).ext-(machine-name).(FQDN) |
Azure Stack での Azure SDK for Go の使用方法の詳細については、「Azure Stack での GO による API バージョンのプロファイルの使用」をご覧ください。
ファイル ベースの認証を使用する
ファイルベースの認証では、Azure CLI によって生成されるファイル形式を使用します。 --sdk-auth
パラメーターを指定して新しいサービス プリンシパルを作成すると、このファイルを簡単に作成できます。 ファイル ベースの認証を使用する場合は、サービス プリンシパルの作成時に、この引数が指定されていることを確認してください。 CLI では出力が stdout
に生成されるので、出力をファイルにリダイレクトします。
az ad sp create-for-rbac --role Contributor \
--scopes /subscriptions/<subscription_id> \
--sdk-auth > azure.auth
AZURE_AUTH_LOCATION
環境変数を、承認ファイルがある場所に設定します。 この環境変数をアプリケーションが読み取り、環境変数内の資格情報が解析されます。 承認ファイルを実行時に選択する必要がある場合は、os.Setenv 関数を使用してプログラムの環境を操作します。
認証情報を読み込むには、NewAuthorizerFromFile 関数を呼び出します。 環境ベースの承認とは異なり、ファイル ベースの承認にはリソース エンドポイントが必要です。
import "github.com/Azure/go-autorest/autorest/azure/auth"
authorizer, err := NewAuthorizerFromFile(azure.PublicCloud.ResourceManagerEndpoint)
サービス プリンシパルの使用とアクセス許可の管理の詳細については、Azure CLI でのサービス プリンシパルの作成に関する記事をご覧ください。
デバイス トークン認証を使用する
ユーザーが対話形式でサインインできるようにする場合、最良の方法は、デバイス トークン認証を使用することです。 この認証フローでは、Microsoft サインイン サイトに貼り付けるトークンをユーザーに渡し、ユーザーはこのサイトで Microsoft Entra アカウントで認証します。 標準のユーザー名/パスワード認証とは異なり、この認証方法では多要素認証が有効になっているアカウントがサポートされます。
デバイス トークン認証を使用するには、NewDeviceFlowConfig 関数で DeviceFlowConfig Authorizer を作成します。 作成されたオブジェクトで Authorizer を呼び出して認証プロセスを開始します。 デバイス認証フローでは、認証フロー全体が完了するまでプログラムの実行がブロックされます。
import "github.com/Azure/go-autorest/autorest/azure/auth"
deviceConfig := auth.NewDeviceFlowConfig(applicationID, tenantID)
authorizer, err := deviceConfig.Authorizer()
認証クライアントを使用する
特定の種類の認証が必要であり、ユーザーの認証情報を読み込む処理をプログラムで実行する場合は、auth.AuthorizerConfig インターフェイスに準拠したクライアントを使用できます。 次の場合にこのインターフェイスを実装する種類を使用します。
- 対話型プログラムを記述する
- 特別な構成ファイルを使用する
- 組み込みの認証方法を使用できないようにする要件がある
警告
Azure の資格情報をアプリケーションにハードコードしないでください。 シークレットをアプリケーションのバイナリに配置すると、アプリケーションが実行されているかどうかに関係なく、攻撃者がシークレットを簡単に抽出できるようになります。 この場合、資格情報が承認されているすべての Azure リソースが危険にさらされます。
次の表に、AuthorizerConfig
インターフェイスに準拠した SDK の型を示します。
Authentication type | Authorizer の型 |
---|---|
証明書ベースの認証 | ClientCertificateConfig |
クライアントの資格情報 | ClientCredentialsConfig |
Azure リソースのマネージド ID | MSIConfig |
ユーザー名/パスワード | UsernamePasswordConfig |
関連付けられた New
関数で認証子を作成し、作成されたオブジェクトで Authorize
を呼び出して認証します。 たとえば、証明書ベースの認証を使用する場合は次のようになります。
import "github.com/Azure/go-autorest/autorest/azure/auth"
certificateAuthorizer := auth.NewClientCertificateConfig(certificatePath, certificatePassword, clientID, tenantID)
authorizerToken, err := certificateAuthorizer.Authorizer()