CZ 
09.03.2026 Františka VÍTEJTE V MÉM SVĚTĚ

An English translation is available for this article. Pro tento článek je dostupný anglický překlad.
Terraform Configuration FortiGate with FortiOS - Firewall Policy

Terraform konfigurace FortiGate s FortiOS - Firewall Policy

| Petr Bouška - Samuraj |
Podíváme se na možnosti využití nástroje Terraform pro automatizaci nasazení a správy FortiGate zařízení. Společnost Fortinet poskytuje FortiOS Terraform Provider, který umožňuje správu FortiGate a FortiManager prostřednictvím principů Infrastructure as Code. Ukážeme si základní konfiguraci připojení k zařízení a praktický příklad vytvoření jednoduché firewallové politiky pomocí deklarativní konfigurace.
zobrazeno: 480x (322 CZ, 158 EN) | Komentáře [2]

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 FortiGateFortiOS 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 Provider
  • variables.tf - definice názvů proměnných
  • terraform.tfvars - přiřazení hodnot proměnným
  • main.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)
FortiGate 7.4 - Administrators - New REST API Admin

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.

Visual Studio Code - Terraform project - Create FortiGate Policy
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.
FortiGate 7.4 - Policy & Objects - Firewall Policy

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" {

Související články:

Infrastruktura jako kód - Terraform

Nástroje typu Infrastructure as Code (IaC) umožňují definovat, nasazovat a spravovat infrastrukturu deklarativním (nebo imperativním) způsobem pomocí konfiguračních souborů. Prostředky (servery, sítě, úložiště apod.) popíšeme v textovém souboru, který definuje požadovaný stav. Nástroj zajistí, že reálné prostředí odpovídá definici. Zatím se budeme věnovat nástroji Terraform.

Fortinet FortiGate a další

Bezpečnostní řešení firmy Fortinet. Nejvíce zaměřeno na Next Generation Firewall (NGFW) FortiGate. Konfigurace FW, politik, NATu, ale také VPN a možností autentizace. Okrajově práce s logy pomocí FortiAnalyzer a s klienty pomocí FortiClient EMS.

Pokud se chcete vyjádřit k tomuto článku, využijte komentáře níže.

Komentáře
  1. [1] Dewpew

    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

    Středa, 04.03.2026 22:09 | odpovědět
  2. [2] Samuraj

    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.

    Čtvrtek, 05.03.2026 07:29 | odpovědět
Přidat komentář

Vložit tag: strong em link

Nápověda:
  • maximální délka komentáře je 2000 znaků
  • HTML tagy nejsou povoleny (budou odstraněny), použít se mohou pouze speciální tagy (jsou uvedeny nad vstupním polem)
  • nový řádek (ENTER) ukončí odstavec a začne nový
  • pokud odpovídáte na jiný komentář, vložte na začátek odstavce (řádku) číslo komentáře v hranatých závorkách