Skip to content

Commit 35e1f99

Browse files
feat(query): implements "Beta - SQL DB Instance With Global User Options" (#7789)
* this query ensures the 'user options' flag is set to 0 on "google_sql_database_instance" resources
1 parent 6997291 commit 35e1f99

File tree

6 files changed

+191
-0
lines changed

6 files changed

+191
-0
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"id": "c8e4444e-d9a9-4426-be8e-9f1b8c43133c",
3+
"queryName": "Beta - SQL DB Instance With Global User Options",
4+
"severity": "MEDIUM",
5+
"category": "Insecure Configurations",
6+
"descriptionText": "No 'google_sql_database_instance' resource based on SQLSERVER should define the 'user options' flag",
7+
"descriptionUrl": "https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/sql_database_instance.html#settings-1",
8+
"platform": "Terraform",
9+
"descriptionID": "c8e4444e",
10+
"cloudProvider": "gcp",
11+
"cwe": "250",
12+
"riskScore": "3.0",
13+
"experimental": "true"
14+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package Cx
2+
3+
import data.generic.common as common_lib
4+
import data.generic.terraform as tf_lib
5+
6+
CxPolicy[result] {
7+
resource := input.document[i].resource.google_sql_database_instance[name]
8+
9+
contains(resource.database_version, "SQLSERVER")
10+
results := get_results(resource, name)
11+
12+
result := {
13+
"documentId": input.document[i].id,
14+
"resourceType": "google_sql_database_instance",
15+
"resourceName": tf_lib.get_resource_name(resource, name),
16+
"searchKey": results.searchKey,
17+
"issueType": "IncorrectValue",
18+
"keyExpectedValue": sprintf("'google_sql_database_instance[%s].settings.database_flags' should set 'user options' to '0'", [name]),
19+
"keyActualValue": sprintf("'google_sql_database_instance[%s].settings.database_flags' sets 'user options' to '%s'", [name, results.value]),
20+
"searchLine": results.searchLine
21+
}
22+
}
23+
24+
get_results(resource, name) = results { # array
25+
resource.settings.database_flags[x].name == "user options"
26+
resource.settings.database_flags[x].value != "0"
27+
28+
results := {
29+
"searchKey": sprintf("google_sql_database_instance[%s].settings.database_flags[%d].name", [name, x]),
30+
"searchLine": common_lib.build_search_line(["resource", "google_sql_database_instance", name, "settings", "database_flags", x, "name"], []),
31+
"value" : resource.settings.database_flags[x].value
32+
}
33+
} else = results { # single object
34+
resource.settings.database_flags.name == "user options"
35+
resource.settings.database_flags.value != "0"
36+
37+
results := {
38+
"searchKey": sprintf("google_sql_database_instance[%s].settings.database_flags.name", [name]),
39+
"searchLine": common_lib.build_search_line(["resource", "google_sql_database_instance", name, "settings", "database_flags", "name"], []),
40+
"value" : resource.settings.database_flags.value
41+
}
42+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
resource "google_sql_database_instance" "negative_1" {
2+
name = "main-instance"
3+
database_version = "MYSQL_8_0" # Is not a SQLSERVER instance
4+
region = "us-central1"
5+
6+
settings {
7+
tier = "db-f1-micro"
8+
9+
database_flags{
10+
name = "user options"
11+
value = "2048" # ANSI_NULL_DFLT_OFF option
12+
}
13+
}
14+
}
15+
16+
resource "google_sql_database_instance" "negative_2" {
17+
name = "mysql-instance-without-flag"
18+
database_version = "SQLSERVER_2017_STANDARD"
19+
region = "us-central1"
20+
21+
# Defaults to "0"
22+
}
23+
24+
resource "google_sql_database_instance" "negative_3" {
25+
name = "sqlserver-instance-without-flag"
26+
database_version = "SQLSERVER_2017_STANDARD"
27+
region = "us-central1"
28+
29+
settings {} # Defaults to "0"
30+
}
31+
32+
resource "google_sql_database_instance" "negative_4" {
33+
name = "sqlserver-instance-without-flag"
34+
database_version = "SQLSERVER_2017_STANDARD"
35+
region = "us-central1"
36+
37+
settings {
38+
database_flags {
39+
name = "sample_flag1"
40+
value = "off"
41+
}
42+
# Defaults to "0"
43+
}
44+
}
45+
46+
resource "google_sql_database_instance" "negative_5" {
47+
name = "mysql-instance-with-flag"
48+
database_version = "SQLSERVER_2019_STANDARD"
49+
region = "us-central1"
50+
51+
settings {
52+
tier = "db-f1-micro"
53+
54+
database_flags {
55+
name = "sample_flag1"
56+
value = "off"
57+
}
58+
59+
database_flags { # Has flag set to "0"
60+
name = "user options"
61+
value = "0"
62+
}
63+
64+
database_flags {
65+
name = "sample_flag2"
66+
value = "off"
67+
}
68+
}
69+
}
70+
71+
resource "google_sql_database_instance" "negative_6" { # Single object support test
72+
name = "mysql-instance-with-flag"
73+
database_version = "SQLSERVER_2019_STANDARD"
74+
region = "us-central1"
75+
76+
settings {
77+
tier = "db-f1-micro"
78+
79+
database_flags {
80+
name = "user options"
81+
value = "0"
82+
} # Has flag set to "0"
83+
}
84+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
resource "google_sql_database_instance" "positive_1" {
2+
name = "sqlserver-instance-with-flag"
3+
database_version = "SQLSERVER_2017_EXPRESS"
4+
region = "us-central1"
5+
6+
settings {
7+
database_flags {
8+
name = "sample_flag1"
9+
value = "off"
10+
}
11+
12+
database_flags { # Flag is not set to "0" - "32" triggers "ANSI_NULLS" option
13+
name = "user options"
14+
value = "32"
15+
}
16+
17+
database_flags {
18+
name = "sample_flag2"
19+
value = "off"
20+
}
21+
}
22+
}
23+
24+
resource "google_sql_database_instance" "positive_2" { # Single object support test
25+
name = "sqlserver-instance-with-flag"
26+
database_version = "SQLSERVER_2017_EXPRESS"
27+
region = "us-central1"
28+
29+
settings {
30+
database_flags {
31+
name = "user options"
32+
value = "16"
33+
} # Flag is not set to "0" - "16" triggers "ANSI_PADDING" option
34+
}
35+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[
2+
{
3+
"queryName": "Beta - SQL DB Instance With Global User Options",
4+
"severity": "MEDIUM",
5+
"line": 13
6+
},
7+
{
8+
"queryName": "Beta - SQL DB Instance With Global User Options",
9+
"severity": "MEDIUM",
10+
"line": 31
11+
}
12+
]

assets/similarityID_transition/terraform_gcp.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ similarityIDChangeList:
33
queryName: Beta - Google DNS Policy Logging Disabled
44
observations: ""
55
change: 2
6+
- queryId: c8e4444e-d9a9-4426-be8e-9f1b8c43133c
7+
queryName: Beta - SQL DB Instance With Global User Options
8+
observations: ""
9+
change: 2
610
- queryId: 18cb7d28-57df-4d6b-9fb4-02828cb15660
711
queryName: Beta - SQL DB Instance With Limited User Connections
812
observations: ""

0 commit comments

Comments
 (0)