【问题标题】:Adding google cloud armor to Terraform gke and kubernetes将谷歌云盔甲添加到 Terraform gke 和 kubernetes
【发布时间】:2021-06-18 22:45:09
【问题描述】:

我正在尝试将谷歌云装甲添加到我的 Terraform 项目中,该项目使用 Kubernetes 部署应用程序。我按照这个例子。但是,就我而言,我想创建以下规则: https://github.com/hashicorp/terraform-provider-google/blob/master/examples/cloud-armor/main.tf

关闭所有端口上所有 IP 的所有流量,但打开端口 80 和 443 上所有 IP 的流量

  • 然后我在terraform/kubernetes目录下添加了一个也叫web_application_firewall.tf的文件,配置如下:
# Cloud Armor Security policies
resource "google_compute_security_policy" "web-app-firewall" {
  name        = "armor-security-policy"
  description = "Web application security policy to close all traffics for all IPs on all ports but open traffic for all IPs on port 80 and 443"

  # Reject all traffics for all IPs on all ports
  rule {
    description = "Default rule, higher priority overrides it"

    action   = "deny(403)"
    priority = "2147483647"

    match {
      versioned_expr = "SRC_IPS_V1"

      config {
        src_ip_ranges = ["*"]
      }
    }

    
  }

  # Open traffic for all IPs on port 80 and 443
  #rule {
  #  description = "allow traffic for all IPs on port 80 and 443"

  #  action   = "allow"
  #  priority = "1000"

  #  match {
  #    versioned_expr = "SRC_IPS_V1"

  #    config {
  #      src_ip_ranges = ["*"]
  #    }
  #  }
  #}
}

resource "google_compute_firewall" "firewall-allow-ports" {
  name    = "firewall-allow-ports"
  network = google_compute_network.default.name

  allow {
    protocol = "icmp"
  }

  allow {
    protocol = "tcp"
    ports    = ["80"]
  }

  source_tags = ["web"]
}

resource "google_compute_network" "default" {
  name = "test-network"
}

在这里,我停用了端口 445,但重新部署后,我仍然可以访问网络应用程序。你能告诉我我在这里做错了什么吗?提前谢谢你。

【问题讨论】:

  • 你解决过这个问题吗?我真的来这里发布一个类似的问题。
  • @shuti 你在测试前等了几分钟吗?你用的是哪个地形?在您的 terraform 清单中,您还评论了 allow traffic 部分?

标签: kubernetes google-cloud-platform terraform google-kubernetes-engine google-cloud-armor


【解决方案1】:

首先我想澄清一些事情。

云盔甲

Google Cloud Armor 仅为在外部负载平衡器后面运行的应用程序提供保护,并且一些功能仅适用于外部 HTTP(S) 负载平衡器。

简而言之,它可以过滤IP地址但不能阻止端口,它是防火墙的作用。

有问题的是,您有适用于所有 IP 的 deny 规则和 allow 规则(已注释),但是这两个规则都有适用于所有 IP 的 src_ip_ranges = ["*"],这有点毫无意义。

Terraform sn-p.

我已尝试将 terraform-provider-google 与您的更改一起应用,但我不确定这是否正是您所拥有的。如果您可以发布整个代码,那么复制整个场景会更有帮助。

正如我之前提到的,要阻止端口,您需要使用防火墙规则。防火墙规则适用于特定的 VPC 网络,而不是全部。当我尝试复制您的问题时,我发现您:

创建新的 VPC 网络

resource "google_compute_network" "default" {
  name = "test-network"
}

已创建防火墙规则

resource "google_compute_firewall" "firewall-allow-ports" {
  name    = "firewall-allow-ports"
  network = google_compute_network.default.name

  allow {
    protocol = "icmp"
  }

  allow {
    protocol = "tcp"
    ports    = ["80"]
  }

  source_tags = ["web"]
}

但是您在哪里创建了虚拟机?如果你按照 github 代码,你的 VM 已经创建在default VPC:

  network_interface {
    network = "default" ### this line
    access_config {
      # Ephemeral IP
    }

Terraform doc 中,您可以找到该值指示VM 将连接到哪个网络的信息。

network_interface - (必需)附加到实例的网络。这可以指定多次。

问题摘要

简而言之,您已经创建了新的 VPC (test-network),创建了 VPC 规则 ("firewall-allow-ports") 以仅允许 ICMP 协议和 TCP 协议在端口 80 上使用 source_tags = web 用于新 VPC - test-network 但您的 VM 是在 default VPC 中创建的,它可能有不同的防火墙规则来允许整个流量、允许端口 445 上的流量或更多变体。

可能的解决方案

在 terraform 中使用 default 作为资源名称可能很危险/很棘手,因为它可以在与您想要的不同的位置创建资源。我稍微更改了这段代码以创建一个 VPC 网络 - test-network,将其用于防火墙规则和资源 "google_compute_instance"

resource "google_compute_network" "test-network" {
  name = "test-network"
}

resource "google_compute_firewall" "firewall-allow-ports" {
  name    = "firewall-allow-ports"
  network = google_compute_network.test-network.name

  allow {
    protocol = "icmp"
  }

  allow {
    protocol = "tcp"
    ports    = ["80", "443"] ### before was only 80
  }

  source_tags = ["web"]
}

resource "google_compute_instance" "cluster1" {
  name         = "armor-gce-333" ### previous VM name was "armor-gce-222"
  machine_type = "f1-micro"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
    }
  }

  network_interface {
    network = "test-network"
    access_config {

...

正如您在下面的屏幕中看到的,它还为端口 443 创建了防火墙规则,在 VPC test-network 中您可以看到 VM "armor-gce-333"

总结 您的主要问题与您已使用防火墙规则配置新 VPC 相关,但您的实例可能是在另一个允许端口 445 上的流量的 VPC 网络中创建的。

【讨论】:

    猜你喜欢
    • 2019-03-29
    • 2021-01-09
    • 2022-01-22
    • 2020-07-18
    • 2022-09-30
    • 2021-05-12
    • 2021-09-14
    • 2021-10-20
    • 1970-01-01
    相关资源
    最近更新 更多