Azure Hacking – logowanie CLI za pomocą service principala

wpis w: Azure, chmura, migawka, Python | 0

Od kiedy zainteresowałem się chmurą Microsoft Azure początkowe kroki skierowałem do Portalu.

Postawiłem kilka maszyn wirtualnych, strony www, proste funkcje. Następnie spróbowałem  przygotować to samo bez jednego kliknięcia myszą. Do wyboru miałem Powershell i moduł az CLI 2.0 napisany w Pythonie. Wybrałem az.

Pierwsza linia kodu skryptu powołującego chmurową infrastrukturę wyglądała tak.

az login

Pojawia się wtedy komunikat

To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code CCJULN8F8 to authenticate.

Za pomocą podanej strony i kodu autoryzacyjnego muszę wskazać użytkownika , a potem wpisać hasło.

Co zrobić, jeśli chciałbym uniknąć podawania za każdym razem hasła administratora subskrypcji i stworzyć techniczny byt, który pozwoli na wielokrotne uruchamianie np. skryptu wdrożeniowego, oczywiście bez interakcji z wyskakującymi oknami.

Poniżej przedstawiam prosty sposób na skorzystanie z service principala

 

Składnia

az login --service-principal --username APP_ID --password KEY --tenant TENANT_ID

Jak widać potrzebne nam będą trzy identyfikatory.

Zacznijmy od TENAND_ID.

Wybieramy menu  Azure Active Directory i zakładkę Properties

azure_sp_1

To, co widzimy w miejscu Directory ID to nasz TENAND_ID. Kopiujemy i zapisujemy sobie na boku.

Pozostałe dwa identyfikatory wymagają stworzenia aplikacji.

Zmieniamy zakładkę Properties na App registrations.

Tworzymy nową aplikację typu Web app/API. Swoją nazwałem deployer. Adres url nie ma znaczenia w naszym zastosowaniu, wpisujemy dowolną wartość.

azure_sp_2

 

Po utworzeniu aplikacji mamy dostęp do identyfikatora APP_ID

azure_sp_3

Kopiujemy Application ID i zachowujemy  w tym samym miejscu co TENANT_ID.

Czas na ostatni identyfikator, czyli KEY. Wchodzimy na zakładkę Keys.

Tworzymy nowy klucz o nazwie np. KeyOne i terminie wygaśnięcia za jeden rok, pole Value zostanie wypełnione po zapisaniu klucza

azure_sp_4

W tym momencie powinniśmy skopiować wartość klucza. Jest to operacja jednorazowa. Portal o tym uczciwie przypomina. Klucz oczywiście można skasować i wygenerować kolejny.

azure_sp_5

Mamy już trzy identyfikatory. Co dalej ?

Spróbujmy połączyć się do subskrypcji z poziomu linii komend.

az login --service-principal 
--username 478f8c58-7f6b-4c5c-8d24-df65611eceb7 
--password jucwH20DjZrF6G1qE/r6siusJCx88V3VT0caywAsiFs=+JhghFCDdTECO8XCuzA= 
--tenant 3acd9081-d979-40d1-a2ad-aaaaaaaa

Po zalogowaniu się pojawi się zwrotny komunikat w postaci JSON

[
  {
    "cloudName": "AzureCloud",
    "id": "a12fd30b-a8f0-4c46-9489-ffd9848c4564",
    "isDefault": true,
    "name": "AzureWarsztaty",
    "state": "Enabled",
    "tenantId": "3acd9081-d979-40d1-a2ad-aaaaaaaa",
    "user": {
      "name": "478f8c58-7f6b-4c5c-8d24-df65611eceb7",
      "type": "servicePrincipal"
    }
  }
]

 

Podanie błędnych danych kończy się małą katastrofą z kodem 401.

Get Token request returned http error: 401 and server response:

{"error":"invalid_client","error_description":"AADSTS70002: Error validating credentials.

AADSTS50012: Invalid client secret is provided.\r\n
Trace ID: b83728c1-ab59-40c6-8b31-f2a9641a4300\r\n
Correlation ID: d7dfa0f0-424d-49ed-ab0a-a28696ea83e6\r\n
Timestamp: 2018-05-09 19:45:47Z","error_codes":[70002,50012],"timestamp":"2018-05-09 19:45:47Z","trace_id":"b83728c1-ab59-40c6-8b31-f2a9641a4300","correlation_id":"d7dfa0f0-424d-49ed-ab0a-a28696ea83e6"}

Spróbujmy stworzyć nową grupę zasobów

az group create -l eastus -n principaltest

Pojawił się komunikat.

The client 'c2fb7600-0f1d-46fd-b75a-efd16c02c67f' 
with object id 'c2fb7600-0f1d-46fd-b75a-efd16c02c67f' does not have authorization 
to perform action 'Microsoft.Resources/subscriptions/resourcegroups/write' 
over scope '/subscriptions/a12fd30b-a8f0-4c46-9489-xxxxxx/resourcegroups/principaltest'.

Brakuje uprawnień dla naszej aplikacji i słusznie.

Nadajmy uprawnienia dla aplikacji na poziomie subskrypcji.

Dodajemy z poziomu zakładki Access control [IAM] uprawnienia Contributor dla całej subskrypcji.

azure_sp_6

Uruchamiamy ten sam kod i teraz mamy już komunikat zwrotny

{
  "id": "/subscriptions/a12fd30b-a8f0-4c46-9489-xxxxxx/resourceGroups/principaltest",
  "location": "eastus",
  "managedBy": null,
  "name": "principaltest",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null
}

Wchodzimy na zakładkę Activity Log naszej nowej grupy zasobów i widać, kto i kiedy utworzył zasób.

azure_sp_7

 

Usuwamy grupę zasobów

az group delete  -n principaltest
Are you sure you want to perform this operation? (y/n): y
 | Finished ..

To samo można zrobić z poziomu CLI bez korzystania z Portalu, ale o tym innym razem…..

 

Literatura:

https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-service-principal-portal

https://docs.microsoft.com/en-us/cli/azure/create-an-azure-service-principal-azure-cli?toc=%2Fazure%2Fazure-resource-manager%2Ftoc.json&view=azure-cli-latest

 

 

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.