I don’t want to expose VMs to the entire internet - and neither should you. That is basically an invite to brute force attack the VM. Therefore, if I don’t use a VPN or Express Route connection to use private IPs, I use Network Security Groups (NSG) to control the traffic to VMs by allowing a single source IP.
In this post, I show how I do that with Terraform.
Source IP and NSGs
The service ipify.org returns your current IP:
This IP can then be used to configure a data provider in Terraform:
# Request your IP
data "http" "myip" {
url = "https://api.ipify.org/"
}
Next up we want to use the data in an NSG rule to allow SSH (port 22) connections only from that IP:
# Create Network Security Group and rule
resource "azurerm_network_security_group" "onprem-nsg" {
name = "nsg"
#provide a value for the location
location = ""
#provide a value for the resource group
resource_group_name = ""
#Provision a security rule with your current IP as a source filter
security_rule {
name = "SSH"
priority = 1001
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "22"
source_address_prefix = "${chomp(data.http.myip.body)}"
destination_address_prefix = "*"
}
}
The same approach can, of course, be used for other ports and protocols.
Once you execute/terraform apply that script, only connections from a single source IP are allowed. If your source IP changes, you must re-apply the scripts.
Hope it helps,
Max
Share this post
Twitter
Facebook
LinkedIn
Email