Create a Post
cancel
Showing results for 
Search instead for 
Did you mean: 
Ranokarno_Ranok
Participant

Build Azure CloudGuard using Terraform

Hi Expert,

Anyone can advise how can we build a Vsec CloudGuard using Terraform code.

something that can mapped original ARM template as attached.

Best Regards,

Rano

6 Replies
Ranokarno_Ranok
Participant

based on Javier's link https://community.checkpoint.com/docs/DOC-3027

I managed to get some progress:
- bring up 2 Vsec Gateway

- apply correct API

- test API

$FWDIR/scripts/azure_ha_test.py

- register to MDM (manual step)

what is missing:

1. cluster VIP integration 'cluster-vip'

2. failover testing

anyone has any input.

resource "azurerm_resource_group" "rg" {
name = "rg-firewall"
location = "SouthEast Asia"
}
resource "azurerm_virtual_network" "vnet" {
name = "vnet-firewall"
resource_group_name = "${azurerm_resource_group.rg.name}"
address_space = ["172.16.1.0/24"]
location = "SouthEast Asia"
}

resource "azurerm_subnet" "External_subnet" {
name = "External"
resource_group_name = "${azurerm_resource_group.rg.name}"
virtual_network_name = "${azurerm_virtual_network.vnet.name}"
address_prefix = "172.16.1.0/27"
}

resource "azurerm_subnet" "Internal_subnet" {
name = "Internal"
resource_group_name = "${azurerm_resource_group.rg.name}"
virtual_network_name = "${azurerm_virtual_network.vnet.name}"
address_prefix = "172.16.1.32/27"
}

resource "azurerm_network_interface" "vsec-eth0" {
name = "vsec-eth0"
location = "SouthEast Asia"
resource_group_name = "${azurerm_resource_group.rg.name}"
enable_ip_forwarding = "true"

ip_configuration {
name = "member-ip"
subnet_id = "${azurerm_subnet.External_subnet.id}"
private_ip_address_allocation = "Static"
private_ip_address = "172.16.1.10"
primary = true

#public_ip_address_id = "${azurerm_public_ip.gwpublicip.id}"
}

ip_configuration {
name = "cluster-vip"
subnet_id = "${azurerm_subnet.External_subnet.id}"
private_ip_address_allocation = "Static"
private_ip_address = "172.16.1.12"
primary = false
}
}

resource "azurerm_network_interface" "vsec-eth1" {
name = "vsec-eth1"
location = "SouthEast Asia"
resource_group_name = "${azurerm_resource_group.rg.name}"
enable_ip_forwarding = "true"

ip_configuration {
name = "member-ip"
subnet_id = "${azurerm_subnet.Internal_subnet.id}"
private_ip_address_allocation = "Static"
private_ip_address = "172.16.1.40"
primary = true
}
}

resource "azurerm_network_interface" "vsec2-eth0" {
name = "vsec2-eth0"
location = "SouthEast Asia"
resource_group_name = "${azurerm_resource_group.rg.name}"
enable_ip_forwarding = "true"

ip_configuration {
name = "member-ip"
subnet_id = "${azurerm_subnet.External_subnet.id}"
private_ip_address_allocation = "Static"
private_ip_address = "172.16.1.11"
primary = true

}
}

resource "azurerm_network_interface" "vsec2-eth1" {
name = "vsec2-eth1"
location = "SouthEast Asia"
resource_group_name = "${azurerm_resource_group.rg.name}"
enable_ip_forwarding = "true"

ip_configuration {
name = "ipconfig0"
subnet_id = "${azurerm_subnet.Internal_subnet.id}"
private_ip_address_allocation = "Static"
private_ip_address = "172.16.1.41"
}
}

resource "azurerm_virtual_machine" "vsec01" {
name = "vsec01"
location = "SouthEast Asia"
resource_group_name = "${azurerm_resource_group.rg.name}"
network_interface_ids = ["${azurerm_network_interface.vsec-eth0.id}", "${azurerm_network_interface.vsec-eth1.id}"]
primary_network_interface_id = "${azurerm_network_interface.vsec-eth0.id}"
availability_set_id = "${azurerm_availability_set.avset.id}"
vm_size = "Standard_D2S_v3"

storage_os_disk {
name = "vsec01-osdisk"
caching = "ReadWrite"
create_option = "FromImage"
managed_disk_type = "Standard_LRS"
}

storage_image_reference {
publisher = "checkpoint"
offer = "check-point-vsec-r80"
sku = "sg-byol"
version = "latest"
}

plan {
name = "sg-byol"
publisher = "checkpoint"
product = "check-point-vsec-r80"
}

os_profile {
computer_name = "vsec01"
admin_username = "azureuser"
admin_password = "password"

custom_data = <<EOF
#!/bin/bash
clish -c 'set hostname vsec01' -s
cat <<EEOFF >$FWDIR/conf/azure-ha.json
{
"debug": false,
"subscriptionId": "subscription_id",
"location": "southeastasia",
"environment": "AzureCloud",
"resourceGroup": "rg-firewall",
"credentials": {
"tenant": "tenant_id",
"grant_type": "client_credentials",
"client_id": "",
"client_secret": ""
},
"proxy": "",
"virtualNetwork": "vnet-firewall",
"clusterName": "vsec0",
"clusterNetworkInterfaces": {
"eth0": [
"172.16.1.12",
"vsec0"
]
},
"lbName": ""
}
EEOFF
azure-ha-conf --client-id client_id' --client-secret 'client_secret' --force
/opt/CPda/bin/dastop
config_system -s 'install_security_gw=true&install_ppak=true&gateway_cluster_member=true&install_security_managment=false&ipstat_v6=off&ftw_sic_key=sic_key'
/opt/CPda/bin/dastart
shutdown -r now
EOF
}

os_profile_linux_config {
disable_password_authentication = false
}

boot_diagnostics {
enabled = "true"
storage_uri = "${azurerm_storage_account.mystorageaccount.primary_blob_endpoint}"
}

}

resource "azurerm_virtual_machine" "vsec02" {
name = "vsec02"
location = "SouthEast Asia"
resource_group_name = "${azurerm_resource_group.rg.name}"
network_interface_ids = ["${azurerm_network_interface.vsec2-eth0.id}", "${azurerm_network_interface.vsec2-eth1.id}"]
primary_network_interface_id = "${azurerm_network_interface.vsec2-eth0.id}"
availability_set_id = "${azurerm_availability_set.avset.id}"
vm_size = "Standard_D2S_v3"

storage_os_disk {
name = "vsec02-osdisk"
caching = "ReadWrite"
create_option = "FromImage"
managed_disk_type = "Standard_LRS"
}

storage_image_reference {
publisher = "checkpoint"
offer = "check-point-vsec-r80"
sku = "sg-byol"
version = "latest"
}

plan {
name = "sg-byol"
publisher = "checkpoint"
product = "check-point-vsec-r80"
}

os_profile {
computer_name = "vsec02"
admin_username = "azureuser"
admin_password = "password"

custom_data = <<EOF
#!/bin/bash
clish -c 'set hostname vsec02' -s
cat <<EEOFF >$FWDIR/conf/azure-ha.json
{
"debug": false,
"subscriptionId": "subscription_id",
"location": "southeastasia",
"environment": "AzureCloud",
"resourceGroup": "rg-firewall",
"credentials": {
"tenant": "tenant_id",
"grant_type": "client_credentials",
"client_id": "",
"client_secret": ""
},
"proxy": "",
"virtualNetwork": "vnet-firewall",
"clusterName": "vsec0",
"clusterNetworkInterfaces": {
"eth0": [
"172.16.1.12",
"vsec0"
]
},
"lbName": ""
}
EEOFF
azure-ha-conf --client-id client_id' --client-secret 'client_secret' --force
/opt/CPda/bin/dastop
config_system -s 'install_security_gw=true&install_ppak=true&gateway_cluster_member=true&install_security_managment=false&ipstat_v6=off&ftw_sic_key=sic_key'
/opt/CPda/bin/dastart
shutdown -r now
EOF
}

os_profile_linux_config {
disable_password_authentication = false
}

boot_diagnostics {
enabled = "true"
storage_uri = "${azurerm_storage_account.mystorageaccount.primary_blob_endpoint}"
}

}
Javier_Hijas
Employee Alumnus
Employee Alumnus

Thanks for sharing Ranokarno, it looks promising. Feel free to share your code once you feel it is mature through the codepoint 😉 BTW, why didn't you try the VMSS setup directly instead of the cluster one? 

Ranokarno_Ranok
Participant

Hi Javier,

My understanding that VMSS relies on Azure Loadbalancer which then defeat the purpose of Cloudguard gateway to identify source/destination rules. especially since we are moving toward Identity awareness with Azure Datacenter objects.

However I am interested how can we automate security gateway registration via autoprov-cfg script without enabling VMSS.

Jonathan_Lebowi
Employee Alumnus
Employee Alumnus

The azure LB does not source NAT, so the CG gateways do see the original source addresses. 

Ranokarno_Ranok
Participant

Thanks for your advise Jonathan Lebowitsch , I am currently testing it with dual instance vsec gateway and loadbalancer.

I think this approach much better than building cluster Vsec.

it reduce the overhead of API request, UDR change, etc.

Richard_Cove
Contributor

Hi I am working on using the ARM templates directly in Terraform to build the environment 

The advantage is you don't need to manually convert the Check Point supplied templates to terraform each time they are updated. Might help you with what you are attempting. 

This is my first pass, bit rough but here it is  https://github.com/rcove/terraform-az-demo-1

Comments will be appreciated 

Leaderboard

Epsum factorial non deposit quid pro quo hic escorol.