Pozn.: Popis v článku vychází z Terraform verze 1.14.6, FortiOS Provider verze 1.24.1 a FortiGate s FortiOS 7.4.11.
HashiCorp Terraform
V předchozích článcích série Infrastruktura jako kód - Terraform jsme si popsali základy použití Terraformu. Od instalace, vytvoření projektu a souborů, použití proměnných, bloků pro konfiguraci prostředků (Resources) a načítání zdrojů dat (Data Sources), vytváření více instancí jednoho prostředku a importu existujících prostředků.
FortiOS Provider
Prakticky jsme si použití Terraformu ukazovali s VMware Cloud Director Provider a vytvářeli objekty ve VMware virtualizaci. V tomto článku se podíváme na FortiOS Provider a konfiguraci FortiGate systému. Vyjdeme z informací popsaných dříve a pouze je budeme aplikovat na jiné řešení.
FortiOS poskytovatel fortinetdev/fortios je aktuálně ve verzi 1.24. Podporuje FortiGate s FortiOS 6.0 nebo vyšší verzí (6.0, 6.2, 6.4, 7.0, 7.2, 7.4, 7.6) a FortiManager 6.0 a 6.2.
Pozn.: Neříkám (netroufám si posuzovat), že Terraform je optimální nástroj typu Infrastructure as Code (IaC) pro konfiguraci Firewallu. Ale máme k dispozici poskytovatele pro FortiOS se spoustou prostředků a můžeme jej využít pro konfiguraci většiny fukncí FortiOS.
Terraform projekt pro FortiGate
Vytvoříme si složku pro náš projekt (zde d:\Terraform\FortiGate), kam budeme ukládat konfigurační soubory v HCL jazyce. Složku otevřeme ve Visual Studio Code.
V našem příkladu budeme používat soubory
terraform.tf- konfigurace Terrafomu a FortiOS Providervariables.tf- definice názvů proměnnýchterraform.tfvars- přiřazení hodnot proměnnýmmain.tf- konfigurace prostředků (nastavení FortiGate)import.tf- import existujících objektů (prostředků)
Konfigurace Terraformu a poskytovatele
Vytvoříme soubor terraform.tf, do kterého vložíme konfiguraci samotného Terrafomu a FortiOS poskytovatele.
# Version and providers requirement terraform { required_version = ">= 1.14.0" required_providers { fortios = { source = "fortinetdev/fortios" version = "~> 1.24" } } } # Configure the FortiOS Provider provider "fortios" { hostname = var.forti_hostname token = var.forti_token insecure = var.forti_allow_unverified_ssl # vdom = "root" }
Autentizace na FortiGate
V konfiguraci poskytovatele musíme použít credentials (přihlašovací údaje) s dostatečným oprávněním. Můžeme zadat statické přihlašovací údaje (API token nebo jméno a heslo) nebo využít proměnné prostředí (Environment variables).
Doporučeno je využít API token, který můžeme vytvořit ve FortiGate GUI
- (Global) > System > Administrators
- Create New - REST API Admin
- zadáme Username pro identifikaci, vybereme Administrator Profile nebo vytvoříme nový (s minimálním oprávněním, které ale pro konfiguraci musí být dost vysoké), můžeme omezit přístup pomocí Trusted Hosts
- po kliknutí na OK se zobrazí API key, který si musíme zkopírovat (není možnost jej znovu zobrazit)

Definice proměnných
Pro definici proměnných si vytvoříme soubor variables.tf.
# FortiOS variables
variable "forti_hostname" {
description = "hostname or IP address of FortiOS unit"
type = string
}
variable "forti_token" {
description = "token of FortiOS unit"
type = string
}
variable "forti_allow_unverified_ssl" {
description = "Allow perform insecure SSL requests / unverified SSL"
type = bool
}
Přiřazení hodnot proměnným
Hodnoty proměnným nastavíme v souboru terraform.tfvars.
# Configure the FortiOS Provider
forti_hostname = "fortigate.domain.local"
forti_token = "xxx"
forti_allow_unverified_ssl = true
Inicializace Terraform workspace
Použijeme Terraform CLI příkaz pro inicializaci pracovního adresáře a stažení poskytovatele. Ve VS Code využijeme terminál.
PS D:\Terraform\FortiGate> terraform init Initializing the backend... Initializing provider plugins... - Finding fortinetdev/fortios versions matching "~> 1.24"... - Installing fortinetdev/fortios v1.24.1... - Installed fortinetdev/fortios v1.24.1 (signed by a HashiCorp partner, key ID 325239133A112044) Partner and community providers are signed by their developers. If you'd like to know more about provider signing, you can read about it here: https://developer.hashicorp.com/terraform/cli/plugins/signing Terraform has created a lock file .terraform.lock.hcl to record the provider selections it made above. Include this file in your version control repository so that Terraform can guarantee to make the same selections by default when you run "terraform init" in the future. Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work. If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary.
Vytvoření Firewall politiky (Policy)
V tomto příkladu vytvoříme pomocí Terraformu jednoduchou IPv4 politiku na FortiGate. Jde jen o malý příklad možností.
Konfigurace politiky
Vytvoříme soubor main.tf, ve kterém zadáme konfiguraci prostředku fortios_firewall_policy. Tento resource má velké množství argumentů, takže můžeme nastavit patrně všechny možnosti Firewall Policy.
# create IPv4 policy
resource "fortios_firewall_policy" "web_access" {
name = "Web Access to internet"
action = "accept"
schedule = "always"
logtraffic = "all"
nat = "enable"
inspection_mode = "flow"
status = "enable"
service {
name = "HTTP"
}
service {
name = "HTTPS"
}
srcaddr {
name = "all"
}
srcintf {
name = "LocalZone"
}
dstaddr {
name = "all"
}
dstintf {
name = "DMZzone"
}
}
Aplikace Terraform konfigurace
Pomocí Terraform CLI spustíme provedení operací navržených Terraform plánem. Po odsouhlasení dojde k vytvoření nové politiky.

PS D:\Terraform\FortiGate> terraform apply
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the
following symbols:
+ create
Terraform will perform the following actions:
# fortios_firewall_policy.web_access will be created
+ resource "fortios_firewall_policy" "web_access" {
+ action = "accept"
+ anti_replay = (known after apply)
...
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
fortios_firewall_policy.web_access: Creating...
fortios_firewall_policy.web_access: Creation complete after 0s [id=104]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Chyba v konfiguraci
Pokud v konfiguraci politiky uděláme chybu, která se týká nastavení FortiOS, tak aplikace selže. Zde například špatný název Interface, který neexistoval.
fortios_firewall_policy.web_access: Creating...
- Error: Error creating FirewallPolicy resource: Internal Server Error - Internal error when processing the request (500)
- Cli response:
- [node_check_object fail! for name LocalZone value parse error before 'LocalZone' Command fail. Return code -651]
-
- with fortios_firewall_policy.web_access,
- on main.tf line 47, in resource "fortios_firewall_policy" "web_access":
- 47: resource "fortios_firewall_policy" "web_access" {
Dobrý den, podařilo se Vám zjistit jak lze nastavit pořadí pravidel v policies? Me se to povedlo pouze voláním python skriptu, který to srovná, ale to je takové reseni ohejbak na ohejbak. Diky
odpověď na [1]Dewpew: Pořadí záznamů je velký problém. V dalším článku budu popisovat takový workaround pro DNS záznamy (ale taky to není ideální). Tu Policy jsem si jentak zkoušel a moc neřešil. Nevím také jaké pořadí tam řešíte (zda je to stejný problém jako u sub-bloků). Fortinet má takovou oficiální informaci registry.terraform.io/providers/fortinetdev/fortios/latest/docs/guides/fgt_policymove.