次の方法で共有


サービス プリンシパルによる Azure SDK for Go 認証

このチュートリアルでは、Azure SDK for Go を使用し、シークレットまたは証明書を使用して Azure サービス プリンシパルにより Azure に対して認証を行います。

Azure サービス プリンシパルは、Microsoft Entra テナント内のアプリのアクセス ポリシーとアクセス許可を定義し、サインイン時の認証やリソース アクセス時の承認などの主要な機能を有効にします。 プリンシパルによって、個人アカウントを使用して Azure リソースにアクセスする必要がなくなります。 アプリに必要な権限よりも多くの権限を持つ可能性がある個人用アカウントを使用するのではなく、アプリに必要な正確なアクセス許可をサービス プリンシパルに割り当てて、それらのアクセス許可に対して開発することができます。 Azure リソースを使用する必要があるオンプレミスでホストされているアプリに、サービス プリンシパルを使用することもできます。 Azure SDK for Go の Azure ID モジュールは、環境変数とシークレットまたは証明書を使用して、サービス プリンシパルにより Azure で認証を行うための便利な方法を提供します。

このチュートリアルに従って、作成を行い、サービス プリンシパルを使用して Azure SDK for Go で認証を行います。

前提条件

  • Azure サブスクリプション:Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
  • Go がインストールされていること: バージョン 1.18 またはそれ以上

  • Azure CLI を使用してこの記事の手順に従う場合:

    • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。

    • CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。

      • ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。

      • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。

      • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

  • Azure PowerShell を使用してこの記事の手順に従う場合:

1. Azure リソースを作成する

開始する前に、新しいリソース グループとキー コンテナー インスタンスを作成します。

az group create --name go-on-azure --location eastus

az keyvault create --location eastus --name <keyVaultName> --resource-group go-on-azure --enable-rbac-authorization

<keyVaultName> は、グローバルに一意である名前に置き換えてください。

az keyvault create コマンドの出力から id プロパティを書き留めます。 次のセクションでこれを使用して、サービス プリンシパルの承認のスコープを定義します。 id 値の形式は、/subscriptions/<subscriptionId>/resourceGroups/go-on-azure/providers/Microsoft.KeyVault/vaults/<keyVaultName> です。

2. Azure サービス プリンシパルを作成する

以下のいずれかの手法を使用して、Azure サービス プリンシパルを作成し、それにキー コンテナーでの "Key Vault Secrets Officer" ロールを割り当てます。

Azure サービス プリンシパルの詳細については、「サービス プリンシパル オブジェクト」を参照してください。

"Key Vault Secrets Officer" ロールをサービス プリンシパルに割り当て、プリンシパルがキー コンテナー内でシークレットを作成、読み取り、更新、削除することを承認します。 Azure キー コンテナーの組み込みロールの詳細については、「Azure のロールベースのアクセス制御を使用して Key Vault のキー、証明書、シークレットへのアクセス権を付与する」を参照してください。 Azure の組み込みロールの詳細については、「Azure 組み込みロール」を参照してください。

オプション 1: シークレットを使用する Azure サービス プリンシパルを作成する

以下のいずれかのコマンドを実行して、Azure サービス プリンシパルを作成し、それにキー コンテナーでの "Key Vault Secrets Officer" ロールを割り当てます。

az ad sp create-for-rbac --name <servicePrincipalName> --role "Key Vault Secrets Officer" --scope <keyVaultId>

<servicePrincipalName><keyVaultId> を、適切な値に置き換えます。

出力から passwordtenant、および appId プロパティを書き留めます。 これらは、次のセクションで必要になります。

作成後は、サービス プリンシパルのパスワードを取得できません。 パスワードを忘れた場合は、サービス プリンシパルの資格情報をリセットできます。

オプション 2: 証明書を使用する Azure サービス プリンシパルを作成する

以下のいずれかのコマンドを実行して、証明書を使用する Azure サービス プリンシパルを作成し、それにキー コンテナーでの "Key Vault Secrets Officer" ロールを割り当てます。

az ad sp create-for-rbac --name <servicePrincipalName> --create-cert --role "Key Vault Secrets Officer" --scope <keyVaultId>

<servicePrincipalName><keyVaultId> を、適切な値に置き換えます。

出力から fileWithCertAndPrivateKeytenantId、および appId プロパティを書き留めます。 これらは、次のセクションで必要になります。

3. サービス プリンシパルを使用して Azure に対して認証を行う

DefaultAzureCredential を使用すると、Azure に対して認証を行うための環境固有のコードを記述しなくて済みます。 DefaultAzureCredential を使用すると、環境変数を定義して、サービス プリンシパルの資格情報を構成できます。

サービス プリンシパルの資格情報を構成するには、次のいずれかのオプションを選択します。

DefaultAzureCredential の詳細については、「Azure SDK for Go での Azure 認証」を参照してください。

オプション 1: シークレットを使用して認証する

次の環境変数を定義します。

変数名 Value
AZURE_CLIENT_ID Azure サービス プリンシパルのアプリケーション ID
AZURE_TENANT_ID アプリケーションの Microsoft Entra テナントの ID
AZURE_CLIENT_SECRET Azure サービス プリンシパルのパスワード
export AZURE_TENANT_ID="<active_directory_tenant_id>"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_SECRET="<service_principal_password>"

オプション 2: 証明書を使用して認証する

変数名 Value
AZURE_CLIENT_ID Azure サービス プリンシパルのアプリケーション ID
AZURE_TENANT_ID アプリケーションの Microsoft Entra テナントの ID
AZURE_CLIENT_CERTIFICATE_PATH 秘密キーを含む PEM または PKCS12 証明書ファイルへのパス。 Azure CLI の手順に従った場合、ファイルはパスワードで保護されていません。 Azure PowerShell の手順に従った場合、ファイルはパスワードで保護されていて、環境変数 AZURE_CLIENT_CERTIFICATE_PASSWORD も設定する必要があります。
AZURE_CLIENT_CERTIFICATE_PASSWORD サービス プリンシパルの作成時に入力したパスワード。 Azure PowerShell の手順に従った場合にのみ必要です。
export AZURE_TENANT_ID="<active_directory_tenant_id>"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_CERTIFICATE_PATH="<azure_client_certificate_path>"

DefaultAzureCredential を使用してリソース クライアントを認証する

環境変数を設定したら、Azure Identity モジュールで DefaultAzureCredential を使用してリソース クライアントを認証できます。 以下のコードに、DefaultAzureCredential のインスタンスを取得する方法を示します。

cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
    log.Fatalf("failed to obtain a credential: %v", err)
}

4. Go でキー コンテナーのシークレットを作成する

以下のコード サンプルを使用して、サービス プリンシパルが Azure に対して認証を行うこと、およびキー コンテナーに対する適切なアクセス許可を持っていることを確認します。

  1. ホーム ディレクトリ内に go-on-azure という名前の新しいディレクトリを作成します。

    mkdir ~/go-on-azure
    
  2. go-on-azure ディレクトリに変更します。

    cd ~/go-on-azure
    
  3. go mod init を実行して、go.mod ファイルを作成します。

    go mod init go-on-azure
    
  4. go get を実行して、必須の Go モジュールをインストールします。

    go get "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    go get "github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets"
    
  5. main.go という名前のファイルを作成し、次のコードを追加します。

    package main
    
    import (
    	"context"
    	"fmt"
    	"log"
    	"os"
    
    	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
        "github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets"
    )
    
    func createSecret(name, value string) {
    	keyVaultName := os.Getenv("KEY_VAULT_NAME")
    	keyVaultUrl := fmt.Sprintf("https://%s.vault.azure.net/", keyVaultName)
    
    	cred, err := azidentity.NewDefaultAzureCredential(nil)
    	if err != nil {
    		log.Fatalf("failed to obtain a credential: %v", err)
    	}
    
    	client, err := azsecrets.NewClient(keyVaultUrl, cred, nil)
    	if err != nil {
    		log.Fatalf("failed to create a client: %v", err)
    	}
    
        params := azsecrets.SetSecretParameters{Value: &value}
        resp, err := client.SetSecret(context.TODO(), name, params, nil)
    	if err != nil {
    		log.Fatalf("failed to create a secret: %v", err)
    	}
    
    	fmt.Printf("Name: %s, Value: %s\n", *resp.ID, *resp.Value)
    }
    
    func main() {
    	createSecret("ExamplePassword", "hVFkk965BuUv")
    }
    
    
  6. KEY_VAULT_NAME という名前の環境変数を作成します。 環境変数の値を、前に作成した Azure Key Vault の名前に設定します。

    export KEY_VAULT_NAME=<keyVaultName>
    

    <keyVaultName> を、Azure Key Vault インスタンスの名前に置き換えます。

  7. go run コマンドを実行して、新しいキー コンテナーのシークレットを作成します。

     go run main.go
    

    成功すると、出力は以下のようになります。

    Name: https://<keyVaultName>.vault.azure.net/secrets/ExamplePassword/1e697f71d0014761a65641226f2f057b, Value: hVFkk965BuUv
    

5.リソースをクリーンアップする

この記事で作成した Azure リソースを使用しなくなった場合は、それらを削除することをお勧めします。 使用しないリソースを削除すると、継続的な料金の発生が回避され、サブスクリプションを整った状態に保てます。 このチュートリアルで使用したリソースを削除するための最も簡単な方法は、リソース グループを削除することです。

az group delete --name go-on-azure --yes

--yes 引数は、確認を求めないようにコマンドに指示します。

上記のコマンドは、リソース グループ内のキー コンテナーに対して論理的な削除を実行します。 サブスクリプションから完全に削除するには、以下のコマンドを入力します。

az keyvault purge --name <keyVaultName> --no-wait

<keyVaultName> は、実際のキー コンテナーの名前に置き換えます。

最後に、アプリの登録とサービス プリンシパルを削除してください。

az ad app delete --id <servicePrincipalAppId>

<servicePrincipalAppId> をサービス プリンシパルのアプリ ID に置き換えます。

次のステップ