将谷歌云盔甲添加到 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 节点池