다음을 통해 공유


서비스 주체를 사용한 Go용 Azure SDK 인증

이 자습서에서는 Go용 Azure SDK를 사용하여 비밀 또는 인증서를 사용하여 Azure 서비스 주체를 사용하여 Azure에 인증합니다.

Azure 서비스 주체는 Microsoft Entra 테넌트에서 액세스 정책 및 권한을 정의하여 로그온 중 인증 및 리소스 액세스 중 권한 부여와 같은 핵심 기능을 사용하도록 설정합니다. azure 리소스에 액세스하기 위해 개인 계정 사용할 필요가 없습니다. 앱에 필요한 권한보다 테넌트에서 더 많은 권한을 가질 수 있는 개인 계정 사용하는 대신 앱에 필요한 정확한 권한을 서비스 주체에 할당하고 해당 권한에 대해 개발할 수 있습니다. Azure 리소스를 사용해야 하는 온-프레미스에서 호스트되는 앱에 서비스 주체를 사용할 수도 있습니다. Azure SDK for Go Azure ID 모듈은 환경 변수 및 비밀 또는 인증서를 사용하여 서비스 주체를 사용하여 Azure에 인증하는 편리한 방법을 제공합니다.

이 자습서에 따라 서비스 주체를 사용하여 Go용 Azure SDK를 만들고 인증합니다.

필수 조건

  • Azure 구독: Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.

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> 합니다.

명령의 id 출력에서 속성을 적어둡니다 az keyvault create . 다음 섹션에서 이를 사용하여 서비스 주체에 대한 권한 부여 범위를 정의합니다. 값의 id 형식 /subscriptions/<subscriptionId>/resourceGroups/go-on-azure/providers/Microsoft.KeyVault/vaults/<keyVaultName>은 다음과 같습니다.

2. Azure 서비스 주체 만들기

다음 기술 중 하나를 사용하여 Azure 서비스 주체를 만들고 키 자격 증명 모음에서 "Key Vault 비밀 책임자" 역할을 할당합니다.

Azure 서비스 주체에 대해 자세히 알아보려면 서비스 주체 개체를 참조하세요.

서비스 주체에 "Key Vault 비밀 책임자" 역할을 할당하면 키 자격 증명 모음에서 비밀을 만들고, 읽고, 업데이트하고, 삭제할 수 있는 권한을 부여합니다. Azure Key Vault 의 기본 제공 역할에 대한 자세한 내용은 Azure 역할 기반 액세스 제어를 사용하여 Key Vault 키, 인증서 및 비밀에 대한 액세스 제공을 참조하세요. Azure의 기본 제공 역할에 대한 자세한 내용은 Azure 기본 제공 역할을 참조하세요.

옵션 1: 비밀로 Azure 서비스 주체 만들기

다음 명령을 실행하여 Azure 서비스 주체를 만들고 키 자격 증명 모음에서 "Key Vault 비밀 책임자" 역할을 할당합니다.

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

<servicePrincipalName><keyVaultId>을 해당 값으로 바꿉니다.

출력에서 password, tenantappId 속성을 적어둡니다. 다음 섹션에서 필요합니다.

만든 후에는 서비스 주체 암호를 검색할 수 없습니다. 암호를 잊어버린 경우 서비스 주체 자격 증명을 다시 설정할 수 있습니다.

옵션 2: 인증서를 사용하여 Azure 서비스 주체 만들기

다음 명령을 실행하여 인증서를 사용하는 Azure 서비스 주체를 만들고 키 자격 증명 모음에 "Key Vault 비밀 책임자" 역할을 할당합니다.

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

<servicePrincipalName><keyVaultId>을 해당 값으로 바꿉니다.

출력에서 fileWithCertAndPrivateKey, tenantIdappId 속성을 적어둡니다. 다음 섹션에서 필요합니다.

3. 서비스 주체를 사용하여 Azure에 인증

사용하면 DefaultAzureCredential환경별 코드를 작성하여 Azure에 인증하지 않도록 할 수 있습니다. 를 사용하면 DefaultAzureCredential환경 변수를 정의하여 서비스 주체 자격 증명을 구성할 수 있습니다.

다음 옵션 중 하나를 선택하여 서비스 주체 자격 증명을 구성합니다.

DefaultAzureCredential에 대해 자세히 알아보려면 Go용 Azure SDK로 Azure 인증을 확인하세요.

옵션 1: 비밀로 인증

다음 환경 변수를 정의합니다.

변수 이름
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: 인증서로 인증

변수 이름
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 ID 모듈에서 리소스 클라이언트를 인증하는 데 사용할 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>
    

    Azure Key Vault 인스턴스의 이름으로 바꿉 <keyVaultName> 니다.

  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>

서비스 주체의 앱 ID로 바꿉 <servicePrincipalAppId> 니다.

다음 단계