将谷歌云盔甲添加到 Terraform gke 和 kubernetes

Posted

技术标签:

【中文标题】将谷歌云盔甲添加到 Terraform gke 和 kubernetes【英文标题】:Adding google cloud armor to Terraform gke and 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 部分? 【参考方案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 网络中创建的。

【讨论】:

以上是关于将谷歌云盔甲添加到 Terraform gke 和 kubernetes的主要内容,如果未能解决你的问题,请参考以下文章

使用 terraform 添加带有 GPU 的 GKE 节点池

将谷歌云平台中的目录移动到根目录

如何将谷歌云构建步骤文本输出保存到文件

将谷歌云存储中的 json 文件加载到 bigquery 表中

将谷歌云存储文件夹挂载到谷歌人工智能平台作业

通过python代码将谷歌云存储中的数据上传到分区表