This deployment uses private endpoints for all services, which means they have no public network access. This is the recommended security posture for production workloads.
To access these private resources, the deployment includes:
- ✅ Azure Bastion - Secure browser-based access to VMs
- ✅ Jump VM (Windows) - Management VM inside the virtual network
The jumpbox VM is provisioned with the AAD Login for Windows extension and the deploying principal is automatically granted the Virtual Machine Administrator Login role on the VM. Azure Bastion is deployed using the Standard SKU (which supports Microsoft Entra ID authentication for Azure portal RDP/SSH sessions).
You sign in to the jumpbox with your Microsoft Entra ID credentials — there is no local username/password to manage.
# In the Azure Portal:
# 1. Navigate to your resource group
# 2. Open the jump VM (name starts with "testvm")
# 3. Click "Connect" -> "Bastion"
# 4. In the Bastion connection blade:
# Authentication type: "Microsoft Entra ID"
# Protocol: RDP
# (No username / password fields will be required.)
# 5. Click "Connect" - a browser tab opens with the RDP session,
# signed in as your Entra ID user.
Note: To grant additional users access, assign one of the following RBAC roles to them on the jump VM (or the resource group):
- Virtual Machine Administrator Login - sign in with local administrator privileges
- Virtual Machine User Login - sign in as a standard user
A local admin account is still created on the VM because Windows requires one at provisioning time, but its password is auto-generated, never displayed, and not used to connect through Bastion.
Once connected to the Jump VM, you can:
- Key Vault: Access via Azure Portal or Azure CLI
- Cosmos DB: Connect using Data Explorer in Azure Portal
- Azure AI Search: Manage indexes via Azure Portal
- Storage Account: Browse blobs via Azure Portal or Storage Explorer
- Container Registry: Push/pull images using Docker CLI
- Microsoft Foundry: Manage projects and deployments
For enhanced productivity, install these tools on the Jump VM:
# Install Azure CLI
Invoke-WebRequest -Uri https://aka.ms/installazurecliwindows -OutFile .\AzureCLI.msi
Start-Process msiexec.exe -Wait -ArgumentList '/I AzureCLI.msi /quiet'
# Install Azure Storage Explorer
# Download from: https://azure.microsoft.com/features/storage-explorer/
# Install VS Code
# Download from: https://code.visualstudio.com/For production environments, consider:
- Azure VPN Gateway for site-to-site connectivity
- Point-to-Site VPN for individual users
- ExpressRoute for dedicated private connection
To enable VPN, you would need to:
- Deploy VPN Gateway in your VNet
- Configure client certificates or AAD authentication
- Connect from your local machine
If you need CI/CD access to private resources:
-
Enable Build VM in
infra/main.bicepparam:buildVm: true // Linux Build VM (for CI/CD) devopsBuildAgentsNsg: true // Required NSG
-
Add subnet to
vNetDefinition:{ name: 'snet-build-agents' addressPrefix: '10.0.7.0/28' } -
Self-hosted agents can then access private resources directly
You can configure services without private endpoints by modifying individual service definitions. However, this significantly reduces security posture.
| Resource | Monthly Cost (Estimate) | Why Needed |
|---|---|---|
| Azure Bastion Basic | ~$140 | Secure access to Jump VM |
| Jump VM (Standard B2s) | ~$35 | Management access to private resources |
| Total | ~$175/month | Required for private network access |
-
Bastion Basic vs Standard:
- Basic: $140/month, up to 25 concurrent sessions
- Standard: $310/month, unlimited sessions + more features
-
Jump VM Size:
- B2s (2 vCPUs, 4GB): ~$35/month (current default)
- B1s (1 vCPU, 1GB): ~$10/month (minimal usage)
- B4ms (4 vCPUs, 16GB): ~$140/month (heavy usage)
-
Stop Jump VM When Not in Use:
# Stop VM to save compute costs (you only pay for storage) az vm deallocate --resource-group <rg> --name <vm-name> # Start when needed az vm start --resource-group <rg> --name <vm-name>
Savings: ~$35/month when stopped (you still pay for Bastion + disk)
-
Remove Bastion + Jump VM for Development:
⚠️ Only for non-production environments where security is not criticalSet in
infra/main.bicepparam:bastionHost: false jumpVm: false bastionNsg: false jumpboxNsg: false
Remove subnets from
vNetDefinition:// Remove: AzureBastionSubnet // Remove: snet-jumpbox
Savings: ~$175/month
Trade-off: Cannot access private resources; must configure public access
- Use Bastion for Jump VM access - Never expose RDP/SSH ports publicly
- Enable Just-In-Time (JIT) access - Limit when the Jump VM can be accessed
- Use managed identities - Avoid storing credentials on the Jump VM
- Enable MFA - Require multi-factor authentication for Bastion access
- Monitor access - Review Bastion connection logs in Log Analytics
- Principle of least privilege - Grant minimal RBAC permissions needed
- Check Bastion subnet name is exactly
AzureBastionSubnet - Verify NSG allows Bastion traffic (bastionNsg should be enabled)
- Ensure Bastion subnet is at least /26 (64 addresses)
- Check Bastion deployment succeeded in Azure Portal
- Verify private endpoints were created for each service
- Check private DNS zones are linked to the VNet
- Ensure NSGs allow traffic from Jump VM subnet to private endpoints subnet
- Test DNS resolution:
nslookup <service-name>.vault.azure.net
Sign-in uses Microsoft Entra ID — there is no username/password to manage. If the Bastion connection fails or rejects your credentials:
-
Confirm you are signed in to the Azure portal as the same Entra ID user that ran
azd up(or another principal that has been granted the Virtual Machine Administrator Login or Virtual Machine User Login role on the VM). -
On the Bastion connection blade, ensure Authentication type is set to Microsoft Entra ID (not "Password").
-
Verify the AADLoginForWindows extension is in a
Succeededstate on the VM (Portal → VM → Extensions + applications). -
To grant additional users access, assign one of these roles on the jump VM (or its resource group):
- Virtual Machine Administrator Login — sign in as a local administrator
- Virtual Machine User Login — sign in as a standard user
az role assignment create \ --assignee <user-or-group-object-id> \ --role "Virtual Machine Administrator Login" \ --scope <vm-resource-id>
See Azure Bastion — Microsoft Entra ID authentication for full details.