Udostępnij za pośrednictwem


Uwierzytelnianie na platformie Azure przy użyciu jednostki usługi

W tym artykule wyjaśniono, jak uwierzytelnić narzędzie Terraform na platformie Azure przy użyciu jednostki usługi.

W tym artykule omówiono sposób wykonywania następujących zadań:

  • Tworzenie jednostki usługi
  • Określanie poświadczeń jednostki usługi w zmiennych środowiskowych
  • Określanie poświadczeń jednostki usługi w bloku dostawcy programu Terraform

Tworzenie jednostki usługi

Jeśli nie masz dostępu do jednostki usługi, przejdź do tej sekcji, aby utworzyć nową jednostkę usługi. Jeśli masz jednostkę usługi, której możesz użyć, przejdź do sekcji Określanie poświadczeń jednostki usługi.

Zautomatyzowane narzędzia do wdrażania lub używania usług platformy Azure , takich jak Terraform, powinny zawsze mieć ograniczone uprawnienia. Zamiast logowania się do aplikacji jako w pełni uprzywilejowany użytkownik, platforma Azure oferuje nazwy głównej usługi.

Najczęstszym wzorcem jest interakcyjne logowanie się do platformy Azure, tworzenie jednostki usługi, testowanie jednostki usługi, a następnie używanie tej jednostki usługi do przyszłego uwierzytelniania (interaktywnie lub ze skryptów).

  1. Aby utworzyć jednostkę usługi, zaloguj się na platformie Azure. Po uwierzytelnieniu na platformie Azure za pośrednictwem konta Microsoft wróć tutaj.

  2. Jeśli tworzysz jednostkę usługi na podstawie powłoki Git Bash, ustaw zmienną MSYS_NO_PATHCONV środowiskową. (Ten krok nie jest konieczny, jeśli używasz usługi Cloud Shell).

    export MSYS_NO_PATHCONV=1    
    

    Kluczowe punkty:

    • Zmienną MSYS_NO_PATHCONV środowiskową można ustawić globalnie (dla wszystkich sesji terminalu) lub lokalnie (tylko dla bieżącej sesji). Ponieważ tworzenie jednostki usługi nie jest często czymś, co robisz, przykład ustawia wartość bieżącej sesji. Aby ustawić tę zmienną środowiskową globalnie, dodaj ustawienie do ~/.bashrc pliku.
  3. Aby utworzyć jednostkę usługi, uruchom polecenie az ad sp create-for-rbac.

    az ad sp create-for-rbac --name <service_principal_name> --role Contributor --scopes /subscriptions/<subscription_id>
    

    Kluczowe punkty:

    • Możesz zastąpić <service-principal-name> element nazwą niestandardową środowiska lub całkowicie pominąć parametr . Jeśli pominięto parametr, nazwa główna usługi jest generowana na podstawie bieżącej daty i godziny.
    • Po pomyślnym zakończeniu az ad sp create-for-rbac zostanie wyświetlonych kilka wartości. Wartości appId, passwordi tenant są używane w następnym kroku.
    • Nie można pobrać hasła, jeśli zostanie utracone. W związku z tym należy przechowywać hasło w bezpiecznym miejscu. Jeśli zapomnisz hasło, możesz zresetować poświadczenia jednostki usługi.
    • W tym artykule jest używana jednostka usługi z rolą Współautor . Aby uzyskać więcej informacji na temat ról kontroli dostępu opartej na rolach (RBAC), zobacz Kontrola dostępu oparta na rolach: role wbudowane.
    • Dane wyjściowe z tworzenia jednostki usługi zawierają poufne poświadczenia. Upewnij się, że nie dołączysz tych poświadczeń do kodu lub sprawdź poświadczenia w kontroli źródła.
    • Aby uzyskać więcej informacji na temat opcji tworzenia jednostki usługi przy użyciu interfejsu wiersza polecenia platformy Azure, zobacz artykuł Tworzenie jednostki usługi platformy Azure przy użyciu interfejsu wiersza polecenia platformy Azure.

Określanie poświadczeń jednostki usługi

Istnieje kilka sposobów określania poświadczeń jednostki usługi. Ze względów bezpieczeństwa zalecamy jednak, aby nie przechowywać poświadczeń w bloku dostawcy. Ta technika jest wyświetlana tylko w celach kompletności i testowania.

Określanie poświadczeń jednostki usługi w zmiennych środowiskowych

Po utworzeniu jednostki usługi można określić jego poświadczenia w programie Terraform za pomocą zmiennych środowiskowych.

  1. Edytuj plik, ~/.bashrc dodając następujące zmienne środowiskowe.

    export ARM_SUBSCRIPTION_ID="<azure_subscription_id>"
    export ARM_TENANT_ID="<azure_subscription_tenant_id>"
    export ARM_CLIENT_ID="<service_principal_appid>"
    export ARM_CLIENT_SECRET="<service_principal_password>"
    
  2. Aby wykonać ~/.bashrc skrypt, uruchom polecenie source ~/.bashrc (lub jego skrócony odpowiednik . ~/.bashrc). Możesz również zamknąć i ponownie otworzyć usługę Cloud Shell, aby skrypt był uruchamiany automatycznie.

    . ~/.bashrc
    
  3. Po ustawieniu zmiennych środowiskowych można zweryfikować ich wartości w następujący sposób:

    printenv | grep ^ARM*
    

    Kluczowe punkty:

    • Podobnie jak w przypadku dowolnej zmiennej środowiskowej, aby uzyskać dostęp do wartości subskrypcji platformy Azure z poziomu skryptu programu Terraform, użyj następującej składni: ${env.<environment_variable>}. Aby na przykład uzyskać dostęp do ARM_SUBSCRIPTION_ID wartości, określ wartość ${env.ARM_SUBSCRIPTION_ID}.
    • Tworzenie i stosowanie planów wykonywania programu Terraform powoduje zmiany w subskrypcji platformy Azure skojarzonej z jednostką usługi. Ten fakt może czasami być mylący, jeśli logujesz się do jednej subskrypcji platformy Azure, a zmienne środowiskowe wskazują drugą subskrypcję platformy Azure. Przyjrzyjmy się poniższemu przykładowi, aby wyjaśnić. Załóżmy, że masz dwie subskrypcje platformy Azure: SubA i SubB. Jeśli bieżąca subskrypcja platformy Azure to SubA (określona za pośrednictwem az account show), podczas gdy zmienne środowiskowe wskazują subB, wszelkie zmiany wprowadzone przez narzędzie Terraform są w podb. W związku z tym należy zalogować się do subskrypcji SubB, aby uruchomić polecenia interfejsu wiersza polecenia platformy Azure lub polecenia programu Azure PowerShell, aby wyświetlić zmiany.
  4. Przejdź do sekcji Następne kroki

Określanie poświadczeń jednostki usługi w bloku dostawcy programu Terraform

Uwaga

Możliwość określenia poświadczeń subskrypcji platformy Azure w pliku konfiguracji programu Terraform może być wygodna — szczególnie podczas testowania. Jednak nie zaleca się przechowywania poświadczeń w pliku zwykłego tekstu, który może być wyświetlany przez osoby nieuwierzyte.

Blok dostawcy platformy Azure definiuje składnię, która umożliwia określenie informacji o uwierzytelnianiu subskrypcji platformy Azure.

terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "~>3.0"
    }
  }
}

provider "azurerm" {
  features {}

  subscription_id   = "<azure_subscription_id>"
  tenant_id         = "<azure_subscription_tenant_id>"
  client_id         = "<service_principal_appid>"
  client_secret     = "<service_principal_password>"
}

# Your code goes here

Następne kroki