Łączenie się do maszyn wirtualnych Azure przez Powershell

18 Lut

Bardzo wygodnym sposobem zarządzania maszyną wirtualną oprócz połączenia pulpitu zdalnego jest Powershell. Świeżo utworzone maszyny wirtualne za pomocą obrazów dostarczonych przez Microsoft w Azure nie są przygotowane do tego typu zdalnej administracji. A my chcemy żeby były, więc w dzisiejszym wpisie będzie trochę kodowania a dokładnie – skryptowania 🙂

Maszyna wirtualna utworzona z wykorzystaniem grup zasobów

Zauważyłem, że tworząc maszynę z wykorzystaniem grup zasobów (Resource Groups) nie mogłem się z nią połączyć przez Powershell od razu po jej utworzeniu – komunikat wskazywał że nazwa jest w ogóle nie rozpoznawalna, tak jakby w ogóle nie można było się do niej dobić. Z wykorzystaniem Powershell można się połączyć ze zdalnym komputerem w dwojaki sposób:

  1. po nieszyfrowanym połączeniu za pomocą protokołu HTTP na porcie 5985
  2. przez HTTPS na 5986

Oczywiście porty te muszą być otwarte po stronie maszyny wirtualnej w Azure, w przeciwnym razie Powershell nie będzie mógł się do niej połączyć. Domyślnie maszynka będąca w grupie zasobów ma otwarty tylko port do połączeń pulpitu zdalnego (RDP). Nic więc dziwnego, że Powershell nie może się skomunikować – blokuje go Azure’owy firewall.

Skupię się na połączeniu szyfrowanym czyli po protokole HTTPS. Zgodnie z tym co napisałem powyżej aby podłączyć się Powershell’em wykorzystując szyfrowanie SSL zarówno serwer jak i Azure musi mieć otwarty port 5986. Jeśli jeszcze nie wiesz jak otworzyć port dla maszyny w Azure będącej w grupie zasobów zapraszam do mojego wcześniejszego wpisu na ten temat. W każdym razie u mnie konfiguracja endpoint’a wygląda następująco:

ps endpoint

Celem debugowania możemy w ten sam sposób otworzyć port 5985 czyli port wykorzystywany przez Powershell przy połączeniach nieszyfrowanych.

Zanim przejdziemy dalej nadam jeszcze jakąś przyjazną nazwę DNS dla mojej maszyny. W tym celu wchodzę w panelu sterowania Azure w ustawienia maszyny wirtualnej i klikam publiczny adres IP. Nowo utworzona maszyna wirtualna znajdująca się w grupie zasobów powinna mieć przydzielony tylko publiczny adres IP stąd etykieta <none> dla jej nazwy DNS.

ip-dns

Następnie wybieram Configuration i wpisuję nazwę DNS. Moja maszyna znajduje się w centrum danych w Zachodniej Europie dlatego DNS jest w formacie <nazwa>.westeurope.cloudapp.azure.com. Dla maszyn w innych centrach danych adres DNS będzie się różnić. Ustawiam DNS fsvm-rg.westeurope.cloudapp.azure.com

dns name label

Spróbujmy połączyć się Powershell’em do maszyny wirtualnej:

Niestety komunikat:

Mimo że odblokowałem port w Azure Powershell nadal w ogóle nie może się dobić do mojej maszyny wirtualnej 🙁 Rzeczy do sprawdzenia jakie przychodzą mi do głowy:

  1. Firewall na komputerze z którego nawiązuję połączenie (u mnie jest wyłączony ale Ty Drogi Czytelniku muszisz o nim pamiętać 🙂 )
  2. Firewall na maszynie docelowej
  3. Sprawdzić czy WinRM jest włączony na maszynie docelowej
  4. Po sprawdzeniu powyższego punktu sprawdzić czy WinRM nasłuchuje na porcie 5986 (ponieważ chcemy wykorzystać SSL)

No to jedziemy po kolei.

Firewall na maszynie docelowej

Łączymy się zdalnym pulpitem, Control Panel – Windows Firewall i teraz mamy dwie możliwości:

  • wyłączyć Firewall całkowicie
  • ustawić regułę pozwalającą na ruch po porcie 5986

Całkowite wyłączenie firewall’a to pójście na łatwiznę 🙂 więc spróbujmy ustawić regułę zezwalającą na ruch po porcie 5986. W linii komend wpisujemy:

W ramach troubleshooting’u możemy również odblokować ruch na porcie 5985 (czyli port wykorzystywany przez Powershell gdy nie stosujemy szyfrowanego połączenia). Ma to sens jeśli wcześniej w panelu sterowania Azure otworzyliśmy ten port dla maszyny wirtualnej. Port odblokowuje się podobnie jak 5986:

Włączenie WinRM na maszynie docelowej

W systemie Windows Server 2012R2 WinRM powinien być domyślnie włączony i skonfigurowany. Jednak nie zaszkodzi (a na wcześniejszych wersjach Windows Server nawet trzeba) włączyć go na serwerze którym mamy zamiar sterować. W tym celu uruchamiamy konsolę Powershell na maszynie docelowej i wpisujemy

ewentualnie w linii komend

na wszystkie pytania zadane w trakcie wykonywania się komendy odpowiadamy twierdząco i na koniec powinniśmy mieć działającą usługę WinRM.

Do sprawdzenia czy połączenie zdalne jest już możliwe służy komenda Test-WSMan:

Niestety nadal ten sam komunikat jaki dostaliśmy przy okazji próby połączenia się komendą Enter-PSSession.

Teraz połączenie się Powershell’em do zdalnej maszyny w Azure z wykorzystaniem SSL jeszcze nie zadziała, ale jeśli wcześniej otworzyłeś port 5985 to powinno się już udać przetestować połączenie Powershell po HTTP:

Konfiguracja WinRM do pracy z protokołem HTTPS

Dzieje się tak, ponieważ domyślnie WinRM jest skonfigurowany do pracy tylko i wyłącznie z portem 5985. Możemy to sprawdzić wpisując w linii komend na serwerze docelowym:

W odpowiedzi powinniśmy dostać coś w stylu:

Jak widać brakuje listener’a dla portu 5986. Musimy dodać go ręcznie, ale wpierw aby miało to sens trzeba utworzyć nasz własny podpisany certyfikat. Przechodzimy do konsoli Powershell na maszynie docelowej i tam wpisujemy

Teraz należy skonfigurować WinRM do połączeń HTTPS:

Jesli teraz sprawdzimy listener’y skonfigurowane dla WinRM to powinniśmy oprócz HTTP zobaczyc również HTTPS

Uffff… Wygląda na to że wszystko już jest w porządku i nic nie powinno stać na przeszkodzie do zdalnego zarządzania maszyną wirtualną – oprócz dodania certyfikatu do zaufanych dostawców na maszynie z której będziemy nawiązywać połączenia 🙂

Przejdź do poniższego opisu ustawienia Powershell’a do łączenia się z klasyczną maszyną wirtualną aby dodać wymagany certyfikat i zostać prawdziwym chmurowym adminem 😉

Klasyczna maszyna wirtualna

Maszynka utworzona w sposób klasyczny domyślnie ma już skonfigurowany endpoint do łączenia się przez Powershell HTTPS (wykorzystujący certyfikat SSL). Można to potwierdzić wchodząc w jej ustawienia w portalu Azure’a i wybierając Endpoints. Powinny być odblokowane co namjmniej dwa porty: 3389 oraz 5986. Ten drugi odpowiada właśnie za Powershell po HTTPS.

classic vm endpoints

Skoro port jest otwarty to nic nie stoi na przeszkodzie aby spróbować połączyć się konsolą Powershell aby móc zarządzać maszyną.

Username to oczywiście login użytkownika, podany przy tworzeniu maszyny wirtualnej. Po wpisaniu powyższej komendy trzeba będzie jeszcze podać hasło tegoż użytkownika. Jeśli dostałeś komunikat o błędzie certyfikatu SSL to się nie przejmuj – tak powinno być 🙂

Oznacza to nie mniej nie więcej, że certyfikat pochodzi z niezaufanego źródła i Powershell odmawia połączenia. Aby dodać certyfikat można wykorzystać przeglądarkę Chrome. Jako adres podaj https://PEŁNA_NAZWA_DNS:5986. Chrome również poinformuje że połączenie jest niezaufane 🙂 Należy kliknąć ikonkę kłódki po lewej stronie od paska adresu i wybrać Certificate information.

https cert-chrome

W okienku, które się otworzy przejdź do zakładki Details i kliknij Copy to file…

save cert

W kreatorze importu certyfikatu kliknij Next, upewnij się że DER encoded binary X.509 (.CER) jest zaznaczony i ponownie kliknij Next.

cert export

Wybierz ścieżkę zapisu, potwierdź Next i w ostatnim oknie kliknij Finish.

Teraz przejdź do lokalizacji gdzie zapisałeś certyfikat, kliknij na nim prawym przyciskiem myszy i wybierz Install Certificate.

install cert

Otworzy się kreator importu certyfikatu – wybierz Place all certificates in the following store, wybierz Browse i zaznacz Trusted Root Certification Authorities. Kliknij Next i potem Finish.

cert import wizard

Pojawi się okno z ostrzeżeniem. Kliknij Yes.

install cert prompt

Możemy jeszcze przetestować możliwość zarządzania maszyną zdalną

Spróbuj teraz podłączyć się Powershell’em do maszyny.

azure remote ps

Gratulacje! Teraz możesz przez Powershell zarządzać maszyną wirtualną w Azure 🙂

Dodaj komentarz