Как создать пользовательские проверки в tfsec

У меня есть следующая политика, которую я хочу реализовать при сканировании кода IaC с помощью tfsec:

Custom Check: GCP Firewall rule allows all traffic on Telnet port (23)

Ниже приведена моя настраиваемая проверка в формате .json:

{"проверки": [{"код": "CUS003", "описание": "Пользовательская проверка: правило брандмауэра GCP разрешает весь трафик через порт Telnet (23)", "requiredTypes": ["resource"],"requiredLabels") : ["google_compute_firewall"],"severity": "WARNING","matchSpec":{"name": "CUS003_matchSpec_name","action": "и", "predicateMatchSpec":[{"name": "source_ranges", "действие": "содержит", "значение": "0.0.0.0/0"},{"имя": "порты", "действие": "содержит", "значение": "23"}]}, " errorMessage ":" [ПРЕДУПРЕЖДЕНИЕ] Правило брандмауэра GCP разрешает весь трафик на порт Telnet (23) ", "relatedLinks":["https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_firewall"]}]
}

Я пробовал использовать «not», «notContains», «equals», комбинацию «subMatch» и / или «predicateMatchSpec», но ничего не помогло.

Чтобы проверить это, я специально создал правила брандмауэра, которые должны давать сбой, и другие правила, которые должны пройти проверку. Когда я получаю ошибки проверки, это касается всех правил, а не только некоторых. Точно так же, когда я получаю чеки, это касается всех правил, а не только некоторых.

Документы, которые могут быть полезны: пользовательские проверки tfsec

Любая помощь приветствуется. К сожалению, "tfsec" не является тегом, поэтому я надеюсь, что это проблема терраформирования, с которой я столкнулся.

1 ответ

Я думаю, что теперь, глядя на это, становится ясно, что это дочерний элемент google_compute_firewallресурс. Атрибут является дочерним элементом allow. Ваш чек предполагает, что ports является родным братом source_ranges.

Я думаю, что эта проверка достижима с помощью следующего - он выполняет проверку предиката, что есть source_range, как требуется, И есть блок с именем allow, с портами атрибута, содержащими 23

      {
  "checks": [
    {
      "code": "CUS003",
      "description": "Custom Check: GCP Firewall rule allows all traffic on Telnet port (23)",
      "requiredTypes": [
        "resource"
      ],
      "requiredLabels": [
        "google_compute_firewall"
      ],
      "severity": "WARNING",
      "matchSpec": {
        "action": "and",
        "predicateMatchSpec": [
          {
            "name": "source_ranges",
            "action": "contains",
            "value": "0.0.0.0/0"
          },
          {
            "name": "allow",
            "action": "isPresent",
            "subMatch": {
              "name": "ports",
              "action": "contains",
              "value": "23",
              "ignoreUndefined": true
            }
          }
        ]
      },
      "errorMessage": "[WARNING] GCP Firewall rule allows all traffic on Telnet port (23)",
      "relatedLinks": [
        "https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_firewall"
      ]
    }
  ]
}

Я тестировал его на следующем теле

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

  allow {
    protocol = "tcp"
    ports    = ["23", "8080", "1000-2000"]
  }
  source_ranges = ["0.0.0.0/0"]
  source_tags = ["web"]
}

resource "google_compute_network" "default" {
  name = "test-network"
}
Другие вопросы по тегам