Nasazení minimální hub-spoke topologie v Azure - část 2

25.10.2026

Pokračování předchozího článku. K hub-spoke topologii přidáme do všech podsítí NSG, centrální privátní DNS zónu a službu Bastion pro bezpečné přihlášení do VM přes Entra ID.

Slovník

Hub-spoke topologie Doporučená síťová topologie v Azure, kde je centrální síť (hub) propojena s dalšími sítěmi (spokes). Alternativou je Virtual WAN.
Network Security Group (NSG) NSG je v podstatě stavový firewall na úrovni L3/L4, který filtruje síťový provoz na úrovni subnetu nebo síťové karty (NIC). Obsahuje pravidla, která definují zdroj, zdrojový port, cíl, cílový port, protokol, směr provozu (inbound/outbound), prioritu a akci (allow/deny).
Azure DNS VNet ve výchozím stavu používá pro překlad veřejných doménových jmen Azure DNS na adrese 168.63.129.16. Pro překlad interních jmen ve vlastní doméně nebo napříč VNety je potřeba vytvořit privátní DNS zónu, ke které se VNety připojí a která umí automaticky registrovat virtuální servery (VM).
Azure Bastion Azure Bastion je služba pro vzdálené připojení k VM přes RDP/SSH z Azure portálu nebo v případě vyššího SKU i z Azure CLI.
Microsoft Entra ID Cloudová služba pro správu identit a přístupů. Vytvoříme si v ní uživatelský účet a přihlásíme se jím přes službu Bastion do VM s Linuxem.

Obsah

Úvod

Z předchozího článku máme vytvořenou minimální hub-spoke topologii s routováním pomocí Linux serveru a dnes si do ní přidáme privátní DNS zónu pro interní překlad doménových jmen na IP adresy, službu Azure Bastion pro vzdálené přihlášení na VM servery a NSG skupiny pro možnost filtrovat síťový provoz na subnetech. Změny byly přidány do Bicep šablon a nahrány do nového repositáře:

git clone https://github.com/Ninjanaut/azure-hub-spoke-bicep-template-02.git

Příprava prostředí

V PowerShellu vytvoříme v Entra ID testovacího uživatele a přidáme ho do nově vytvořených skupin. Názvy skupin je možné změnit, ale jejich ID musí být nastaveny v .bicepparam souborech (parametry vmAdminLoginGroupObjectId a bastionUsersGroupObjectId), protože při deploymentu se Entra ID skupiny přiřadí k Azure rolím a potřebným resources. Díky tomu je možné oprávnění uživatelů k přihlášení do VM spravovat přes Entra ID skupiny bez potřeby úprav v Azure portálu nebo Bicep souborech. To se hodí například pro revizi přístupů a případný redeployment nebo recovery scénář, kdy potřebujeme nasadit nejen infrastrukturu s aplikacemi, ale i oprávnění. Testovacím uživatelem se pak připojíme do VM pomocí Bastion služby a tím ověříme, zda nastavení oprávnění a vzdálené přihlášení fungují.
# Login do Azure
az login --tenant '<tenant-id>'

# Vytvoření uživatele
$userId = az ad user create `
  --display-name "User 01" `
  --user-principal-name "user01@<tenant-domain>.onmicrosoft.com" `
  --password '<one-time-password>' `
  --force-change-password-next-sign-in true `
  --query id -o tsv

# Definice security groups
$groups = @(
  'sg-hub-shared-bastion-users',
  'sg-hub-shared-vm-admin-login',
  'sg-app1-dev-vm-admin-login',
  'sg-app2-dev-vm-admin-login'
)

# Vytvoření security groups
foreach ($g in $groups) {
  az ad group create --display-name $g --mail-nickname $g
}

# Přidání uživatele do security groups
foreach ($g in $groups) {
  az ad group member add --group $g --member-id $userId
}

# Kontrola přiřazení
az ad user get-member-groups --id $userId -o table
V Entra ID zkontrolujeme nastavení

Deployment

Postup je stejný jako v první části. Vygenerujeme SSH klíč, přihlásíme se do Azure a postupně nasadíme hub, aplikaci 1 a aplikaci 2. Po nasazení hubu je potřeba doplnit parametry (primárně subscriptionId) v souboru platform/hub.bicep, který je vstupem do deploymentu obou aplikací.

# SSH klíč pro VM provisioning (pouze v případě nového prostředí, jinak do $env proměnné nastavíme stávající klíč)
ssh-keygen -t ed25519 -f "$HOME\.ssh\azure-hub-spoke-template-02" -C "azure-hub-spoke-template-02"
$env:ADMIN_SSH_PUBLIC_KEY = Get-Content "$HOME\.ssh\azure-hub-spoke-template-02.pub"

# Login
az login --tenant '<tenant-id>'

# Hub
az account set --subscription '<hub-subscription-id>'
az deployment sub create -n hub-shared -l swedencentral -f platform/connectivity/main.bicep -p platform/connectivity/params/shared.bicepparam

# Doplnit platform/hub.bicep

# Aplikace 1
az account set --subscription '<app1-subscription-id>'
az deployment sub create -n spoke-app1-dev -l swedencentral -f landing-zones/main.bicep -p landing-zones/app1/dev.bicepparam

# Aplikace 2
az account set --subscription '<app2-subscription-id>'
az deployment sub create -n spoke-app2-dev -l swedencentral -f landing-zones/main.bicep -p landing-zones/app2/dev.bicepparam

Oproti první části se navíc vytvoří následující resources:

Změny

DNS

V hubu vznikla privátní DNS zóna hubspoke.internal, ke které jsou nalinkované všechny VNety s nastavením auto-registration: Enabled. Automatická registrace znamená, že se pro každou VM automaticky vytvoří A záznam s názvem a privátní IP adresou. Při smazání VM se záznam ze zóny zase automaticky odstraní. Konkrétní VNet může mít nalinkovanou pouze jednu zónu, do které se automaticky registruje VM. Bicep soubor vytvoří také několik DNS zón pro private endpointy. Pokud se v síti vytvoří private endpoint a napojí se na příslušnou zónu, automaticky se do ní zapíše A záznam s jeho privátní IP adresou. V prvním screenshotu můžeme vidět přilinkované VNety a ve druhém screenshotu zaregistrované VM.
Zkontrolovat překlad názvu serveru na IP adresu můžeme například příkazem getent, nslookup nebo pingem z aplikace 1 (VM) na aplikaci 2 (VM).
az vm run-command invoke `
  -g rg-spoke-app1-dev `
  -n vm-conntest-app1-dev-swedencentral-001 `
  --command-id RunShellScript `
  --scripts "ping -c 4 vm-conntest-app2-dev-swedencentral-001.hubspoke.internal"

# Result
{
  "value": [
    {
      "code": "ProvisioningState/succeeded",
      "displayStatus": "Provisioning succeeded",
      "level": "Info",
      "message": "Enable succeeded: \n[stdout]\nPING vm-conntest-app2-dev-swedencentral-001.hubspoke.internal (10.0.8.4) 56(84) bytes of data.\n64 bytes from 10.0.8.4: icmp_seq=1 ttl=63 time=3.79 ms\n64 bytes from 10.0.8.4: icmp_seq=2 ttl=63 time=2.15 ms\n64 bytes from 10.0.8.4: icmp_seq=3 ttl=63 time=4.65 ms\n64 bytes from 10.0.8.4: icmp_seq=4 ttl=63 time=2.25 ms\n\n--- vm-conntest-app2-dev-swedencentral-001.hubspoke.internal ping statistics ---\n4 packets transmitted, 4 received, 0% packet loss, time 3003ms\nrtt min/avg/max/mdev = 2.145/3.208/4.649/1.056 ms\n\n[stderr]\n"
    }
  ]
}

NSG

NSG skupiny byly vytvořeny na všech subnetech ve výchozím stavu, s výjimkou nového subnetu AzureBastionSubnet, kde se nakonfigurovala pravidla podle dokumentace. Seznam podsítí:

Bastion

V hub VNetu jsme vytvořili Bastion službu. Protože Developer SKU neumožňuje připojení přes síťové peeringy, je potřeba zvolit alespoň Basic SKU. Aby se uživatel mohl připojit k VM, potřebuje roli Reader na Bastion službu, VM, NIC a cílový VNet. Dále potřebuje roli Virtual Machine Administrator Login nebo Virtual Machine User Login na VM. V Bicep souboru jsou tato oprávnění, s výjimkou role Reader na Bastion službu, nastavena na úrovni resource group. Na cílových serverech bylo také nainstalováno rozšíření AADSSHLoginForLinux a byla vytvořena spravovaná identita. Nastavení vyzkoušíme tak, že se pod testovacím uživatelem přihlásíme do Azure portálu a připojíme se na vybraný VM (přes Bastion službu s Entra ID autentizací). Pokud je vše nastaveno správně, otevře se nám v novém okně prohlížeče terminál cílového serveru.

Smazání

Po vyzkoušení smažeme Bastion službu, která je nejdražší, včetně veřejné IP adresy.
az network bastion delete -g rg-hub-shared -n bas-hub-shared-swedencentral-001 --subscription '<hub-subscription-id>'
az network public-ip delete -g rg-hub-shared -n pip-bas-hub-shared-swedencentral-001 --subscription '<hub-subscription-id>'
Případně všechny vytvořené resource group skupiny.
az group delete -n rg-spoke-app1-dev --yes --subscription '<app1-subscription-id>'
az group delete -n rg-spoke-app2-dev --yes --subscription '<app2-subscription-id>'
az group delete -n rg-hub-shared --yes --subscription '<hub-subscription-id>'
az group delete -n rg-dns-shared --yes --subscription '<hub-subscription-id>'

Závěr

Do hub-spoke topologie jsme přidali privátní DNS zónu, NSG pro filtrování síťového provozu a službu Bastion pro bezpečné vzdálené připojování do virtuálních serverů. Příště si přidáme Azure Firewall jako náhradu za stávající Linux VM router.

Odkazy