Przygotowywanie subskrypcji Azure pod warsztaty

Jednym z największych problemów (jak kto woli wyzwań) przy prowadzeniu szkoleń i warsztatów z Azure jest przygotowanie środowiska pod laboratoria. Jeśli nie prowadzisz szkolenia, które można zrobić poprzez Microsoft Learn (samo w sobie jest fajne do podstaw) czy Hands-on Labs to trzeba się przygotować. Z mojej praktyki wychodzą dwa rozwiązania, które pojawiają się najczęściej: Azure Pass lub współdzielona subskrypcja.

Zaczynając od początku najważniejsze jest przygotowanie osobnego Azure AD. Nie ma jak to dedykowane konta, które można skasować (bądź nie) po szkoleniu, a na jego początku mieć pewność, że użytkownik może się zalogować. Podsumowując krok pierwszy – zakładamy nowe czyste Azure AD.

Kolejnym krokiem są konta dla użytkowników. Nawet jeśli korzystasz z Azure Pass to konto, które przynosi uczestnik czy to Microsoft Account czy służbowe to jego użycie to proszenie się o problemy. To ktoś już kiedyś aktywował pass i już drugi raz nie może, kto inny ma problem i nie może założyć nowego Microsoft Account bo limit na IP z którego się łączycie wysycił się. Korzystając z nowo założonego Azure AD po prostu tworzymy konta dla użytkowników.

Osobiście korzystam z Azure CLI do tego. Logujemy się do nowego AAD w CLI i używamy skryptu jak poniżej.

#!/bin/bash
login_prefix=user
domain=demo.onmicrosoft.com
password='Changeme1#'
start=100
count=2
end=$(($count + $start -1))

for i in $(eval echo "{$start..$end}")
do
   user=$login_prefix$i@$domain
   echo $user
   az ad user create --display-name $user \
                     --password $password \
                     --user-principal-name $user \
                     --force-change-password-next-login=true
done

Następnie przydaje się stworzyć Service Principal. W dużej ilości przypadków nie ma sensu tracić czasu przechodzenia scenariusza tworzenia samego sp. Wystarczy tylko dać go użytkownikowi w gotowej postaci. Jak w przypadku zakładania użytkowników sam korzystam z prostego skryptu w bash.

#!/bin/bash
login_prefix=user
password='TrudneHaslo1'
start=100
count=2
end=$(($count + $start -1))

for i in $(eval echo "{$start..$end}")
do
   user=sp-$login_prefix$i
   echo $user
   az ad sp create-for-rbac --name $user --password $password --skip-assignment
done

Jeżeli używasz Azure Pass to wystarczy rozdać użytkownikom loginy, hasła i service principal. Może być wydrukowane, pdf czy mailem. Każda forma jest dobra. Ważne, żeby używali konta w przeglądarce w trybie prywatnym. Należy przypomnieć kilkukrotnie. Potem zdarzają się przypadki – „ooo nie wiem, gdzie aktywowałem” ;-)

Jeżeli jednak planujesz użyć subskrypcji współdzielonej to po pierwsze musisz przepiąć subskrypcję do dedykowanego AAD, w którym założyłeś już konta, a po drugie wypada nadać uprawnienia w subskrypcji. Zasadniczo są dwie możliwości: Nadanie uprawnień na poziomie subskrypcji lub stworzenie grupy zasób per uczestnik i na nich nadanie uprawnieni.

Opcja pierwsza jest bardzo prosta. Znowu Azure CLI ;-) W skrypcie poniżej uprawnienia nadawane są od razu dla użytkownika oraz sp.

#!/bin/bash
login_prefix=user
domain=demo.onmicrosoft.com
start=100
count=2
role=Owner
end=$(($count + $start -1))

for i in $(eval echo "{$start..$end}")
do
   sp=sp-$login_prefix$i
   user=$login_prefix$i@$domain
   # sp
   echo $sp
   az role assignment create --assignee http://$sp --role $role
   # user
   echo $user
   az role assignment create --assignee $user --role $role
done

Druga opcja wymaga w pierwszym kroku wykreowania grup zasobów, a dopiero potem nadania uprawnień. Skrypt poniżej.

#!/bin/bash
login_prefix=user
domain=demo.onmicrosoft.com
start=100
count=2
role=Owner
location=westeurope
end=$(($count + $start -1))

for i in $(eval echo "{$start..$end}")
do
   rg=rg-$login_prefix$i
   # rg
   echo $rg
   az group create -l $location -n $rg
   sp=sp-$login_prefix$i
   user=$login_prefix$i@$domain
   # sp
   echo $sp
   az role assignment create --assignee http://$sp --role $role --resource-group $rg
   # user
   echo $user
   az role assignment create --assignee $user --role $role --resource-group $rg
done

Jak w przypadku Azure Pass rozdajemy loginy, hasła i cieszymy się działającym środowiskiem.

PS. Jeśli chcesz posprzątać wszystko to ten bash pomoże na grupy zasobów ;-)

#!/bin/bash
az group list --query "[].{Name: name}" -o tsv | grep -v cloud-shell-storage |
while read -r name ; do
    echo $name
    az group delete --name $name --no-wait --yes
done

Ten za to na konta użytkowników i sp:

#!/bin/bash
login_prefix=user
domain=demo.onmicrosoft.com
start=100
count=2
role=Owner
end=$(($count + $start -1))

for i in $(eval echo "{$start..$end}")
do
   sp=sp-$login_prefix$i
   user=$login_prefix$i@$domain
   # sp
   echo $sp
   az ad sp delete --id http://$sp
   # user
   echo $user
   az ad user delete --upn-or-object-id $user
done