65.9K
CodeProject 正在变化。 阅读更多。
Home

云网络与基础设施即代码(第三部分):使用 IaC 保护和路由云网络

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2022 年 6 月 29 日

CPOL

4分钟阅读

viewsIcon

3847

如何添加和配置网络安全组、路由和路由控制、Azure 防火墙和 DDOS 保护

在学习了如何使用 Terraform 预配和配置 Azure 虚拟网络后,我们将转向安全性。我们将演示如何添加和配置网络安全组、路由和路由控制、Azure 防火墙和 DDOS 保护。

预配这些资源将需要与我们在第一部分中采取的类似步骤。但是,在这里我们将使用声明式方法。您可以在 GitHub 上找到所有 Terraform 模板。

必备组件

和以前一样,我们将使用 Azure Cloud Shell。所以,让我们创建一个新文件夹03,并在其中添加新文件:vnet-with-security.tf

然后,我们将使用以下声明来补充该文件(参见 03/vnet_with_security_step_1.tf

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 3.0.2"
    }
  }

  required_version = ">= 1.1.0"
}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "rg-terraform-vnet" {
  name     = "rg-terraform-vnet"
  location = "eastus"
}

resource "azurerm_virtual_network" "vnet-with-security" {
  name                = "vnet-with-security"
  resource_group_name = azurerm_resource_group.rg-terraform-vnet.name
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.rg-terraform-vnet.location  
}

这些是通用声明,它们导入 Azure 提供程序并创建两个 Azure 资源:一个资源组和一个名为 vnet-with-security 的 VNet。

网络安全组

我们现在将网络安全组 (NSG) 添加到 vnet-with-security。这与使用 Azure Portal 预配 NSG 的过程类似。也就是说,我们需要创建 NSG,然后将其与子网关联。因此,我们通过声明网络安全组来补充我们的模板文件 (vnet-with-security.tf),该组允许端口 80 上的传入 TCP 流量

resource "azurerm_network_security_group" "security-group-1" {
  name                = "security-group-1"
  location            = azurerm_resource_group.rg-terraform-vnet.location
  resource_group_name = azurerm_resource_group.rg-terraform-vnet.name

  security_rule {
    name                       = "allow-on-80"
    priority                   = 100
    direction                  = "Inbound"
    access                     = "Allow"
    protocol                   = "Tcp"
    source_port_range          = "*"
    destination_port_range     = "80"
    source_address_prefix      = "*"
    destination_address_prefix = "*"
  }
}

然后,我们在 azure-vnet-with-security 中声明子网

resource "azurerm_subnet" "subnet-frontends" {
  name                 = "subnet-frontends"
  resource_group_name  = azurerm_resource_group.rg-terraform-vnet.name
  virtual_network_name = azurerm_virtual_network.vnet-with-security.name
  address_prefixes     = ["10.0.1.0/24"]
}

随后,我们需要将 NSG 与子网关联

resource "azurerm_subnet_network_security_group_association" 
         "security-group-to-subnet-association" {
  subnet_id                 = azurerm_subnet.subnet-frontends.id
  network_security_group_id = azurerm_network_security_group.security-group-1.id
}

我们现在可以初始化 Terraform

terraform init

最后,我们验证模板并预配资源

terraform validate
terraform apply

部署完成后,您将在 rg-terraform-vnet 资源组下看到新资源。列表中包括名为 security-group-1 的 NSG 和名为 vnet-with-security 的 VNet。

如果您单击 security-group-1,您可以在 入站安全规则下预览安全规则

此规则完全遵循我们的声明。无需在 Azure Portal 中进行任何手动配置。

最后,让我们确保 NSG 已与子网关联。为此,请单击 NSG 下的 子网。您应该在列表中看到 subnet-frontends

路由和路由控制

添加和配置 NSG 后,我们将创建路由表,其中包含一条指向 IP 地址为 10.10.1.1 的假定虚拟设备的路由。然后,如前所述,我们将需要将路由表与子网关联。

我们首先将以下声明添加到我们的模板文件vnet-with-security(参见 03/vnet_with_security_step_2.tf

resource "azurerm_route_table" "route-table-1" {
  name                = "route-table-1"
  location            = azurerm_resource_group.rg-terraform-vnet.location
  resource_group_name = azurerm_resource_group.rg-terraform-vnet.name

  route {
    name                   = "route-1"
    address_prefix         = "10.100.0.0/14"
    next_hop_type          = "VirtualAppliance"
    next_hop_in_ip_address = "10.10.1.1"
  }
}

上述语句声明了名为 route-table-1 的路由表。它将部署到与所有其他资源相同的资源组。route-table-1 表包含内联声明的路由,名为 route-1。它使用 10.100.0.0/14 的地址前缀,并将下一个跃点类型选择为 VirtualAppliance

最后,它配置下一个跃点 IP 地址。这里的配置参数反映了我们在第一篇文章中使用过的配置,当时是在 Azure Portal 中配置路由。

声明 route 表后,我们通过将以下语句添加到我们的vnet_with_security.tf 文件中,将其与 subnet-frontends 关联

resource "azurerm_subnet_route_table_association" "route-table-to-subnet-association" {
  subnet_id      = azurerm_subnet.subnet-frontends.id
  route_table_id = azurerm_route_table.route-table-1.id
}

现在让我们保存文件,验证它,并更新我们的云资源

terraform validate
terraform apply

这将启动预配过程。完成后,您可以在 Azure Portal 中看到您的路由表

另外,您应该会看到 route-table-1 已成功与 subnet-frontends 关联

Azure 防火墙

在下一步中,我们将预配 Azure 防火墙。Azure 防火墙需要名为 AzureFirewallSubnet 的子网。因此,我们首先通过声明新子网来补充vnet-with-security.tf(参见 03/vnet_with_security_step_3.tf

resource "azurerm_subnet" "azure-subnet-firewall" {
  name                 = "AzureFirewallSubnet"
  resource_group_name  = azurerm_resource_group.rg-terraform-vnet.name
  virtual_network_name = azurerm_virtual_network.vnet-with-security.name
  address_prefixes     = ["10.0.2.0/24"]
}

然后,我们为防火墙声明公共 IP

resource "azurerm_public_ip" "public-ip-1" {
  name                = "public-ip-1"
  location            = azurerm_resource_group.rg-terraform-vnet.location
  resource_group_name = azurerm_resource_group.rg-terraform-vnet.name
  allocation_method   = "Static"
  sku                 = "Standard"
}

最后,我们添加描述 Azure 防火墙的语句

resource "azurerm_firewall" "firewall-1" {
  name                = "firewall-1"
  location            = azurerm_resource_group.rg-terraform-vnet.location
  resource_group_name = azurerm_resource_group.rg-terraform-vnet.name
  sku_name            = "AZFW_Vnet"
  sku_tier            = "Standard"

  ip_configuration {
    name                 = "configuration"
    subnet_id            = azurerm_subnet.azure-subnet-firewall.id
    public_ip_address_id = azurerm_public_ip.public-ip-1.id
  }
}

在上述配置中,我们使用内联块 ip_configuration 来指定子网 (AzureSubnetFirewall) 和公共 IP 地址。这与您使用 Azure Portal 配置 Azure 防火墙的过程类似。

将上述所有声明添加到我们的模板 (vnet_with_security.tf) 后,请确保保存文件。然后验证模板并更新您的云基础设施

terraform validate
terraform apply

部署后,您将在 Azure Portal 中看到您的 Azure 防火墙实例

DDoS 保护

作为最后一步,我们将启用 VNet 中的 DDoS 保护(参见 03\ vnet_with_security_step_4.tf)。这要求我们声明 DDoS 保护计划

resource "azurerm_network_ddos_protection_plan" "ddos-1" {
  name                = "ddos-1"
  location            = azurerm_resource_group.rg-terraform-vnet.location
  resource_group_name = azurerm_resource_group.rg-terraform-vnet.name
}

我们需要将上述声明粘贴到vnet_with_security.tf。它们应该出现在 azurerm_virtual_network 声明之前。然后,我们通过添加 ddos_protection_plan 来修改 VNet 声明

resource "azurerm_virtual_network" "vnet-with-security" {
  name                 = "vnet-with-security"
  resource_group_name  = azurerm_resource_group.rg-terraform-vnet.name
  address_space        = ["10.0.0.0/16"]
  location             = azurerm_resource_group.rg-terraform-vnet.location  

  ddos_protection_plan {
    id      = azurerm_network_ddos_protection_plan.ddos-1.id
    enable  = true
  }
}

就是这样!您已准备好部署这些更改

terraform validate
terraform apply

更新完成后,您将看到vnet-with-security 现在已启用 DDoS 保护

摘要

在本系列的最后一部分中,我们学习了如何使用 Terraform 为 Azure 虚拟网络预配网络设置。我们部署了多个子网、网络安全组、Azure 公共 IP、Azure 防火墙、带路由的路由表以及 DDoS 保护。

在此过程中,我们看到所有声明都包含与使用 Azure Portal 预配 Azure 资源时使用的配置参数相同的参数。因此,如果您已经熟悉 Azure Portal,那么过渡到 Terraform 应该很简单。通过这样做,您将简化工作并从 IaC 的所有优势中受益,正如在第二部分中所述。

在我们的所有示例中,我们在 terraform apply 之前都使用了 terraform validate 命令。尽管验证模板并非严格必要,但检查模板是否存在语法或结构问题是一种良好的做法。

请记住,您现在可以使用单个命令清理所有已部署的资源

terraform destroy

要详细了解 IaC 如何将测试和版本控制等软件工程实践应用于您的 DevOps 实践,请参阅资源 基础设施即代码

© . All rights reserved.