W poprzednim wpisie pokazałem jak tworzyć w Azure maszynę wirtualną z gotowego dysku VHD z wykorzystaniem Powershell. Umyślnie pominąłem temat tworzenia NSG dla maszyny, ponieważ każdy może mieć inne wymagania co do endpointów które chce otworzyć na zewnątrz. Chciałbym w tym wpisie pokazać jakie są możliwości w tej kwestii a konfigurację pod konkretne wymagania zostawić Wam. Poza tym temat jest na tyle obszerny że poświęcenie mu odrębnego wpisu jest wskazane 🙂
Na początek krótkie wprowadzenie dla nie wtajemniczonych – czym w ogóle jest NSG (Network Security Group)? W poprzedniej wersji Azure’a gdzie wykorzystywało się Cloud Service’y tworzyło się ACL (Access Control List) by kontrolować jakie endpoint’y są otwarte w maszynach wirtualnych a jakie są zablokowane np. dla grup adresów IP lub pojedynczych adresów. W nowym modelu gdzie wykorzystujemy grupy zasobów używamy do tego samego celu NSG, które są odrębnymi elementami grupy zasobów maszyny wirtualnej.
NSG dla interfejsu sieciowego lub subnet’u
Konfiguracja zasad ruchu sieciowego do i z endpointów może być zastosowana do całego subnet’u lub do pojedynczych interfejsów sieciowych. Wynikają z tego następujące konsekwencje:
- Wszystkie maszyny w subnecie z podpiętą NSG będą stosować te same reguły ruchu sieciowego. Dodatkowo każda maszyna może mieć własną NSG podpiętą do swojego interfejsu sieciowego
- Możemy skonfigurować kilka NSG i stosować je dla różnych interfejsów sieciowych. W ten sposób mimo że wszystkie maszyny wirtualne mogą znajdować się w jednej podsieci to można je dzielić na grupy wg. skonfigurowanych reguł sieciowych w NSG (o ile dany NIC jest jedynym podłączonym dla maszyny wirtualnej – pamiętajmy że jedna maszyna wirtualna może mieć kilka interfejsów sieciowych). Przykład: VM1, VM2, VM3 mają do swoich NIC podłączoną grupę NSG1, VM4, VM5 mają grupę NSG2, itd.
Tworząc maszynę wirtualną z dostępnych obrazów w Azure zazwyczaj NSG jest tworzona automatycznie z pre konfigurowanymi regułami takimi jak poniżej:
Reguły ruchu przychodzącego
Name | Priority | Source IP | Source Port | Destination IP | Destination Port | Protocol | Access |
ALLOW VNET INBOUND | 65000 | VIRTUAL_NETWORK | * | VIRTUAL_NETWORK | * | * | ALLOW |
ALLOW AZURE LOAD BALANCER INBOUND | 65001 | AZURE_LOADBALANCER | * | * | * | * | ALLOW |
DENY ALL INBOUND | 65500 | * | * | * | * | * | DENY |
Reguły ruchu wychodzącego
Name | Priority | Source IP | Source Port | Destination IP | Destination Port | Protocol | Access |
ALLOW VNET OUTBOUND | 65000 | VIRTUAL_NETWORK | * | VIRTUAL_NETWORK | * | * | ALLOW |
ALLOW INTERNET OUTBOUND | 65001 | * | * | INTERNET | * | * | ALLOW |
DENY ALL OUTBOUND | 65500 | * | * | * | * | * | DENY |
Źródło: https://azure.microsoft.com/en-us/documentation/articles/virtual-networks-nsg/
Dodatkowo dla ruchu przychodzącego do maszyn Windows odblokowany jest port 3389 dla połączeń pulpitu zdalnego i port 22 dla SSH w maszynach z Linuxem.
UWAGA: nie zalecam kombinowania i zmieniania domyślnych reguł NSG ponieważ łatwo można coś zepsuć i stracić komunikację z maszyną wirtualną. Jakby tak się zdarzyło to najlepszym sposobem powrotu do ustawień domyślnych jest utworzenie nowej NSG.
Tworzenie NSG i reguł sieciowych
Utworzenie nowej NSG sprowadza się do wykonania komendy New-AzureRmNetworkSecurityGroup, następnie musimy ją podłączyć do NIC lub podsieci. Ale kluczem NSG są jej reguły, które tworzymy komendą New-AzureRmNetworkSecurityRuleConfig. I to właśnie od utworzenia reguł należy zacząć:
1 2 3 4 |
$rule1 = New-AzureRmNetworkSecurityRuleConfig -Name SSH -Description "Allow SSH" -Access Allow -Protocol Tcp -Direction Inbound -Priority 100 -SourceAddressPrefix Internet -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 22 |
Powyższa komenda otwiera endpoint na porcie 22 używany do łączenia się SSH (zastosuję tę regułę dla maszyny Linux). Ponieważ będę się do maszyny łączył z różnych urządzeń to nie podaję konkretnych adresów IP z których będę nawiązywał połączenie. Dodatkowo otworzę endpoint na port 80, ponieważ na maszynie będę konfigurował serwer WWW
1 2 3 4 |
$rule2 = New-AzureRmNetworkSecurityRuleConfig -Name WWW -Description "Allow HTTP" -Access Allow -Protocol Tcp -Direction Inbound -Priority 101 -SourceAddressPrefix Internet -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 80 |
Tak samo jak w przypadku portu 22 nie zawężam listy adresów które będą mogły dostać się do maszyny na port 80 – chcę żeby każdy z Internetu mógł wchodzić na strony WWW hostowane na tym serwerze.
UWAGA: domyślne endpointy (patrz tabela wyżej) zostaną automatycznie dodane do nowo tworzonej NSG.
Teraz w końcu mogę stworzyć NSG:
1 |
$nsg = New-AzureRmNetworkSecurityGroup -ResourceGroupName NSGvmRG -Location westeurope -Name "NSGvmnsg" -SecurityRules $rule1,$rule2 |
Mamy NSG i reguły, które ją definiują, zobaczmy jak podpiąć NSG do interfejsu sieciowego a jak do całej podsieci.
Podłączanie NSG do NIC
Podłączanie NSG do nowo tworzonego NIC
Podajemy NSG jako jeden z parametrów komendy New-AzureRmNetworkInterface
1 |
$nic = New-AzureRmNetworkInterface -Name $nicname -ResourceGroupName $rgname -Location $location -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id -NetworkSecurityGroupId $nsg.Id |
Podłączanie NSG do istniejącego NIC
1 2 3 4 |
$nsg = Get-AzureRmNetworkSecurityGroup -ResourceGroupName RGnsg -Name vmNIC $nic = Get-AzureRmNetworkInterface -ResourceGroupName RGnsg -Name vmNIC $nic.NetworkSecurityGroup = $nsg Set-AzureRmNetworkInterface -NetworkInterface $nic |
Analogicznie można odłączyć NSG od NIC podając $null zamiast $nsg w atrybucie NetworkSecurityGroup NIC:
1 |
$nic.NetworkSecurityGroup = $null |
Podłączanie NSG do całej podsieci
Podłączanie NSG do nowo tworzonej podsieci
Podobnie jak w przypadku interfejsu sieciowego podajemy NSG jako parametr komendy New-AzureRmVirtualNetworkSubnetConfig np.:
1 |
New-AzureRmVirtualNetworkSubnetConfig -name $subnetname -addressprefix 10.2.0.0/16 -NetworkSecurityGroup $nsg |
Podłączanie NSG do istniejącej podsieci
1 2 3 4 5 |
$vnet = Get-AzureRmVirtualNetwork -ResourceGroupName RGnsg -Name VNetname $subnet = Get-AzureRmVirtualNetworkSubnetConfig -VirtualNetwork $vnet -Name SubnetName $nsg = Get-AzureRmNetworkSecurityGroup -ResourceGroupName RGnsg -Name NSGName $subnet.NetworkSecurityGroup = $nsg Set-AzureRmVirtualNetwork -VirtualNetwork $vnet |
Analogicznie można odłączyć NSG od podsieci podając $null zamiast $nsg w atrybucie NetworkSecurityGroup subnet’u:
1 |
$subnet.NetworkSecurityGroup = $null |
Dodawanie nowych reguł sieciowych
Chcąc dodać nową regułę do NSG używamy komendy Add-AzureRmNetworkSecurityRuleConfig, poniżej przykład:
1 |
Add-AzureRmNetworkSecurityRuleConfig -NetworkSecurityGroup $nsg -Name https -Description "Allow HTTPS" -Access Allow -Protocol Tcp -Direction Inbound -Priority 102 -SourceAddressPrefix Internet -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 443 |
Następnie należy zapisać zmiany tak jak poniżej
1 |
Set-AzureRmNetworkSecurityGroup -NetworkSecurityGroup $nsg |
To wszystkie najpotrzebniejsze komendy jakie będą Wam potrzebne na początek, po bardziej szczegółowy opis zapraszam do oficjalnej dokumentacji Azure’a.