Skip to content
Merged
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"id": "fc7187e5-b9a2-46c0-950d-3bfcaaacc5ca",
"queryName": "Beta - SQL DB Instance Without Connections Logging",
"severity": "MEDIUM",
"category": "Observability",
"descriptionText": "All 'google_sql_database_instance' resources based on POSTGRES should enable the 'log_connections' flag to log connection attempts",
"descriptionUrl": "https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/sql_database_instance.html#settings-1",
"platform": "Terraform",
"descriptionID": "fc7187e5",
"cloudProvider": "gcp",
"cwe": "778",
"riskScore": "3.0",
"experimental": "true"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package Cx

import data.generic.common as common_lib
import data.generic.terraform as tf_lib

CxPolicy[result] {
resource := input.document[i].resource.google_sql_database_instance[name]

contains(resource.database_version, "POSTGRES")
results := get_results(resource, name)

result := {
"documentId": input.document[i].id,
"resourceType": "google_sql_database_instance",
"resourceName": tf_lib.get_resource_name(resource, name),
"searchKey": results.searchKey,
"issueType": results.issueType,
"keyExpectedValue": results.keyExpectedValue,
"keyActualValue": results.keyActualValue,
"searchLine": results.searchLine
}
}

get_results(resource, name) = results {
not common_lib.valid_key(resource, "settings")

results := {
"searchKey": sprintf("google_sql_database_instance[%s]", [name]),
"issueType": "MissingAttribute",
"keyExpectedValue": sprintf("'google_sql_database_instance[%s].settings.database_flags' should be defined and set 'log_connections' to 'on'", [name]),
"keyActualValue": sprintf("'google_sql_database_instance[%s].settings' is undefined or null", [name]),
"searchLine": common_lib.build_search_line(["resource", "google_sql_database_instance", name], [])

}
} else = results {
not common_lib.valid_key(resource.settings, "database_flags")

results := {
"searchKey": sprintf("google_sql_database_instance[%s].settings", [name]),
"issueType": "MissingAttribute",
"keyExpectedValue": sprintf("'google_sql_database_instance[%s].settings.database_flags' should be defined and set 'log_connections' to 'on'", [name]),
"keyActualValue": sprintf("'google_sql_database_instance[%s].settings.database_flags' is undefined or null", [name]),
"searchLine": common_lib.build_search_line(["resource", "google_sql_database_instance", name, "settings"], [])
}

} else = results {
not has_flag(resource.settings.database_flags)

results := {
"searchKey": sprintf("google_sql_database_instance[%s].settings.database_flags", [name]),
"issueType": "MissingAttribute",
"keyExpectedValue": sprintf("'google_sql_database_instance[%s].settings.database_flags' should be defined and set 'log_connections' to 'on'", [name]),
"keyActualValue": sprintf("'google_sql_database_instance[%s].settings.database_flags' does not set 'log_connections'", [name]),
"searchLine": common_lib.build_search_line(["resource", "google_sql_database_instance", name, "settings", "database_flags"], [])
}

} else = results { # array
resource.settings.database_flags[x].name == "log_connections"
resource.settings.database_flags[x].value != "on"

results := {
"searchKey": sprintf("google_sql_database_instance[%s].settings.database_flags[%d].name", [name, x]),
"issueType": "IncorrectValue",
"keyExpectedValue": sprintf("'google_sql_database_instance[%s].settings.database_flags' should be defined and set 'log_connections' to 'on'", [name]),
"keyActualValue": sprintf("'google_sql_database_instance[%s].settings.database_flags' sets 'log_connections' to '%s'", [name, resource.settings.database_flags[x].value]),
"searchLine": common_lib.build_search_line(["resource", "google_sql_database_instance", name, "settings", "database_flags", x, "name"], [])
}
} else = results { # single object
resource.settings.database_flags.name == "log_connections"
resource.settings.database_flags.value != "on"

results := {
"searchKey": sprintf("google_sql_database_instance[%s].settings.database_flags.name", [name]),
"issueType": "IncorrectValue",
"keyExpectedValue": sprintf("'google_sql_database_instance[%s].settings.database_flags' should be defined and set 'log_connections' to 'on'", [name]),
"keyActualValue": sprintf("'google_sql_database_instance[%s].settings.database_flags' sets 'log_connections' to '%s'", [name, resource.settings.database_flags.value]),
"searchLine": common_lib.build_search_line(["resource", "google_sql_database_instance", name, "settings", "database_flags", "name"], [])
}
}

has_flag(database_flags) {
database_flags[_].name == "log_connections"
} else {
database_flags.name == "log_connections"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
resource "google_sql_database_instance" "negative_1" {
name = "main-instance"
database_version = "MYSQL_8_0" # Is not a POSTGRES instance
region = "us-central1"

settings {
tier = "db-f1-micro"
}
}

resource "google_sql_database_instance" "negative_2" {
name = "mysql-instance-with-flag"
database_version = "POSTGRES_15"
region = "us-central1"

settings {
tier = "db-f1-micro"

database_flags {
name = "sample_flag1"
value = "off"
}

database_flags {
name = "log_connections" # Has flag set to "on"
value = "on"
}

database_flags {
name = "sample_flag2"
value = "off"
}
}
}

resource "google_sql_database_instance" "negative_3" { # Single object support test
name = "mysql-instance-with-flag"
database_version = "POSTGRES_15"
region = "us-central1"

settings {
tier = "db-f1-micro"

database_flags {
name = "log_connections"
value = "on"
} # Has flag set to "on"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
resource "google_sql_database_instance" "positive_1" {
name = "mysql-instance-without-flag"
database_version = "POSTGRES_17"
region = "us-central1"

# Missing 'settings' field
}

resource "google_sql_database_instance" "positive_2" {
name = "postgres-instance-without-flag"
database_version = "POSTGRES_16"
region = "us-central1"

settings {} # Missing 'database_flags' field
}

resource "google_sql_database_instance" "positive_3" {
name = "postgres-instance-without-flag"
database_version = "POSTGRES_15"
region = "us-central1"

settings {
database_flags {
name = "sample_flag1"
value = "off"
} # Missing 'log_connections' flag
}
}

resource "google_sql_database_instance" "positive_4" {
name = "postgres-instance-with-flag"
database_version = "POSTGRES_14"
region = "us-central1"

settings {
database_flags {
name = "sample_flag1"
value = "off"
}

database_flags {
name = "log_connections" # Flag is not set to "on"
value = "off"
}

database_flags {
name = "sample_flag2"
value = "off"
}
}
}

resource "google_sql_database_instance" "positive_5" { # Single object support test
name = "postgres-instance-with-flag"
database_version = "POSTGRES_14"
region = "us-central1"

settings {
database_flags {
name = "log_connections"
value = "off"
} # Flag is not set to "on"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
[
{
"queryName": "Beta - SQL DB Instance Without Connections Logging",
"severity": "MEDIUM",
"line": 1
},
{
"queryName": "Beta - SQL DB Instance Without Connections Logging",
"severity": "MEDIUM",
"line": 14
},
{
"queryName": "Beta - SQL DB Instance Without Connections Logging",
"severity": "MEDIUM",
"line": 23
},
{
"queryName": "Beta - SQL DB Instance Without Connections Logging",
"severity": "MEDIUM",
"line": 42
},
{
"queryName": "Beta - SQL DB Instance Without Connections Logging",
"severity": "MEDIUM",
"line": 60
}
]
4 changes: 4 additions & 0 deletions assets/similarityID_transition/terraform_gcp.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,7 @@ similarityIDChangeList:
queryName: Beta - Google DNS Policy Logging Disabled
observations: ""
change: 2
- queryId: fc7187e5-b9a2-46c0-950d-3bfcaaacc5ca
queryName: Beta - SQL DB Instance Without Connections Logging
observations: ""
change: 2
Loading