A titkok kezelésének alapvető fontossága minden modern alkalmazás biztonságában rejlik. A "titok" kifejezés alatt olyan érzékeny adatokat értünk, mint adatbázis hozzáférési jelszavak, API kulcsok, titkosításhoz használt kulcsok és hasonlók, amelyeket szigorúan védeni kell a jogosulatlan hozzáféréstől. Az Azure Key Vault egy kiváló eszköz, amely lehetővé teszi az érzékeny adatok biztonságos tárolását, kezelését és hozzáférését. Ebben a fejezetben részletesen bemutatjuk, hogyan kezelhetjük ezeket a titkokat a Terraform segítségével.

Első lépésként a kulcsfontosságú hozzáférési politikákat kell megadnunk az Azure Key Vault számára. Ez az eljárás lehetővé teszi, hogy meghatározzuk, ki és milyen jogokkal férhet hozzá a tárolt titkokhoz. A következő Terraform kódrészlet bemutatja, hogyan adhatunk hozzáférési jogokat a Key Vault-hoz egy adott felhasználó számára:

hcl
resource "azurerm_key_vault_access_policy" "example" { key_vault_id = azurerm_key_vault.example.id tenant_id = data.azurerm_client_config.current.tenant_id object_id = data.azurerm_client_config.current.object_id key_permissions = ["get", "list"] secret_permissions = ["get", "set", "delete", "list"] }

Ebben a példában a jelenlegi felhasználónak olyan jogokat adunk, amelyek lehetővé teszik számára a titkok olvasását, írását, törlését és felsorolását. Ezt követően létrehozzuk a titkokat, amelyeket az Azure Key Vault-ban tárolunk. A következő két titok egy adatbázis felhasználónevet és jelszót tartalmaz:

hcl
resource "azurerm_key_vault_secret" "db_username" { name = "db-username" value = "myusername" key_vault_id = azurerm_key_vault.example.id } resource "azurerm_key_vault_secret" "db_password" { name = "db-password" value = "mypassword" key_vault_id = azurerm_key_vault.example.id }

Ezeket a titkokat a későbbiekben felhasználhatjuk egy Azure SQL Server konfigurálásához. A következő Terraform kódrészlet bemutatja, hogyan hívhatjuk le a titkokat a Key Vault-ból, és hogyan használhatjuk őket az SQL Server beállításához:

hcl
data "azurerm_key_vault_secret" "db_username" {
name = "db-username" key_vault_id = azurerm_key_vault.example.id } data "azurerm_key_vault_secret" "db_password" { name = "db-password" key_vault_id = azurerm_key_vault.example.id } resource "azurerm_sql_server" "example" { name = "mysqlserver" resource_group_name = azurerm_resource_group.example.name location = azurerm_resource_group.example.location version = "12.0" administrator_login = data.azurerm_key_vault_secret.db_username.value administrator_login_password = data.azurerm_key_vault_secret.db_password.value }

A fenti példában a db-username és db-password titkokat a Key Vault-ból töltjük le, majd felhasználjuk őket az SQL Server konfigurálásához.

Ha több környezetet kezelünk (például fejlesztési, tesztelési és éles környezet), akkor célszerű különböző Key Vault-okat vagy titkokat létrehozni minden egyes környezethez. Ez segít abban, hogy az egyes környezetek titkai egymástól függetlenül kezelhetők legyenek.

A titkok hozzáférésének figyelése és naplózása kulcsfontosságú ahhoz, hogy megőrizzük a rendszer biztonságát és integritását. Az Azure Key Vault integrálódik az Azure Monitor és az Azure Log Analytics szolgáltatásokkal, így lehetőség van naplók megtekintésére és figyelmeztetések beállítására konkrét események alapján. Ennek érdekében először biztosítanunk kell, hogy a Key Vault naplózza az eseményeket. Az alábbi Terraform kód létrehozza a szükséges naplózási beállításokat:

hcl
resource "azurerm_log_analytics_workspace" "example" { name = "exampleworkspace" location = azurerm_resource_group.example.location resource_group_name = azurerm_resource_group.example.name sku = "PerGB2018" retention_in_days = 30 } resource "azurerm_monitor_diagnostic_setting" "example" { name = "example" target_resource_id = azurerm_key_vault.example.id log_analytics_workspace_id = azurerm_log_analytics_workspace.example.id log { category = "AuditEvent" enabled = true retention_policy { enabled = true days = 7 } } metric { category = "AllMetrics" retention_policy { enabled = true days = 7 } } }

A fenti programban létrehoztunk egy Log Analytics munkaterületet 30 napos megőrzési politikával, majd a Key Vault naplózási beállításait úgy konfiguráltuk, hogy az "AuditEvent" és "AllMetrics" kategóriák naplóit 7 napos megőrzési idővel küldjék a munkaterületre. Az "AuditEvent" naplók minden olyan eseményt rögzítenek, amely a titkok hozzáféréséhez vagy használatához kapcsolódik, míg az "AllMetrics" a teljesítményadatokat tartalmazza. Az igényeknek megfelelően módosíthatók a kategóriák és a megőrzési napok. Miután a naplók beállításra kerültek, az Azure Monitor segítségével figyelmeztetéseket hozhatunk létre különböző feltételek alapján. Például létrehozhatunk egy figyelmeztetést, ha egy titkot egy adott időszakon belül többször is elérnek.

Fontos továbbá megjegyezni, hogy az Azure Key Vault Activity Log rögzíti az összes írási műveletet (PUT, PATCH, DELETE), amelyet a Key Vault-ban hajtanak végre. Ez egy fontos eszköz a titkok és az azokhoz való hozzáférések átlátható nyomon követésére.

Hogyan kezeljük a CIDR blokkokat és hálózati beállításokat Terraform segítségével?

A Terraform segítségével történő hálózati konfigurációk kezelése nemcsak alapvető, hanem bonyolult feladat is lehet, különösen ha a különböző hálózati elemeket és erőforrásokat kell összekapcsolni és automatizálni. A CIDR (Classless Inter-Domain Routing) blokkok elosztása és a hálózati források megfelelő kezelése a VPC-k és alhálózatok létrehozásánál elengedhetetlen lépés.

A Terraform CIDR blokkokkal való munka során kulcsfontosságú, hogy automatikusan felosszuk a VPC (virtuális privát felhő) teret a cidrsubnet() funkcióval. Ez lehetővé teszi a hálózati források pontos és rugalmas elosztását. Azonban nem elegendő csupán a CIDR blokkok helyes megadása; figyelni kell arra is, hogy azok ne fedjék egymást. Ennek ellenőrzésére használhatunk különböző validáló eszközöket, mint például az OPA (Open Policy Agent). Az OPA segítségével biztosíthatjuk, hogy az egyes CIDR blokkok közötti átfedések elkerülhetők legyenek, és hogy az egyes hálózati beállítások megfeleljenek az előre meghatározott szabályoknak.

Fontos, hogy a terraform validate és a terraform plan parancsokat mindig futtassuk le a változtatások alkalmazása előtt. Ezek a parancsok lehetővé teszik számunkra, hogy a hibákat még a tényleges alkalmazás előtt kiszűrjük. A hibák előre történő elkapása nemcsak időt takarít meg, hanem segít megelőzni a váratlan leállásokat és üzemzavart is.

Ne felejtsük el használni a terraform fmt és a terraform taint parancsokat sem. Az előbbi a konfiguráció formázásában segít, míg az utóbbi lehetővé teszi a források újrateremtését. Az erőforrások újrateremtése ugyanakkor komoly kockázatot jelenthet, hiszen ez leállással járhat a termelési szolgáltatások esetében.

A szubnetek kezelésének és a routing beállításoknak az alapjait már részletesen áttekintettük a fejezet elején. A következő lépés a DNS beállítások és azok Terraform általi kezelése volt, amely kulcsfontosságú ahhoz, hogy az infrastruktúra zökkenőmentesen működjön. A DNS rekordok és zónák karbantartása egyszerűsíti a hálózati erőforrások közötti kommunikációt, és biztosítja a rendszer stabil működését.

A fejezet utolsó része a terheléselosztók és az automatikus skálázás kezelését érintette. A Terraform segítségével a terheléselosztók konfigurálása egyszerűen megvalósítható, és a rendszer képes az erőforrások automatikus skálázására különböző paraméterek figyelembevételével. A felhasználói élmény biztosítása érdekében elengedhetetlen az automatikus skálázás és a megfelelő terheléselosztás.

A hibák elkerülése érdekében fontos, hogy ne csupán a szintaktikai hibákra figyeljünk, hanem a szemantikai és futásidejű hibákat is figyelembe vegyük. A Terraform használata során gyakran találkozunk a három hibakategóriával: szintaktikai hibák, szemantikai hibák és futásidejű hibák. Ezek mindegyike más-más problémát takar, és másféle hibakeresést igényelnek.

A szintaktikai hibák azok, amikor a kód nem felel meg a Terraform szintaxisának, például hiányzó zárójelek, helytelenül megadott kulcsszavak vagy érvénytelen operátorok. Ezen hibák észlelése viszonylag egyszerű, hiszen a terraform validate és terraform plan parancsok általában egyértelmű hibaüzenetet adnak.

A szemantikai hibák olyan helyzetek, amikor a kód helyes ugyan, de a logikai felépítés hibás. Például, ha egy nem létező erőforrást próbálunk hivatkozni, vagy ha egy szubnetet kívánunk hozzárendelni egy hibás VPC CIDR blokkhoz. Az ilyen típusú hibák nehezebben észlelhetők, de a terraform plan segítségével általában könnyen azonosíthatók.

A futásidejű hibák akkor fordulnak elő, amikor a kód szintaktikailag és szemantikailag helyes, de az erőforrások létrehozása vagy frissítése során valamilyen külső tényező, például API-korlátok vagy engedélyek hiánya miatt probléma merül fel. Az ilyen hibák akkor jelentkeznek, amikor a Terraform kommunikál a felhőszolgáltatóval, és gyakran akkor is megjelenhetnek, ha az erőforrást kívülről módosították, de a Terraform állapotot nem frissítették.

A hibaelhárítás során minden típusú hibára másféle megközelítés szükséges. A szintaktikai hibákat könnyű észrevenni és javítani, míg a szemantikai és futásidejű hibák mélyebb elemzést igényelnek. Az OPA és más validáló eszközök használata segíthet megelőzni az átfedéseket és más hálózati problémákat, amelyeket gyakran nem észlelünk a Terraform szintjén.

A Terraform környezetekben, különösen ha több felhasználó dolgozik egy időben, fontos a megfelelő állapotkezelés és a párhuzamos végrehajtások elkerülése. A Terraform állapotának távoli tárolása és a CI/CD pipeline megfelelő beállítása kulcsfontosságú a hatékony és zökkenőmentes működéshez. Az ilyen problémák megelőzése érdekében célszerű erőforrásaikat és állapotukat mindig naprakészen tartani.