Back to Checks
Cloud SQL PostgreSQL instance has 'log_statement' flag set to 'ddl'
cloudsql_instance_postgres_log_statement_flag
Service: cloudsqlSeverity: medium
OfficialBuilt-inVerified
Categories:logging
Resource Type:sqladmin.googleapis.com/Instance
Cloud SQL for PostgreSQL instances have log_statement set to ddl, recording only data definition statements in server logs
Risk
Missing ddl logging leaves schema changes untracked, undermining integrity and hindering investigations.
Excessive logging (e.g., all) can inflate volumes, impair availability, raise costs, and leak sensitive values, harming confidentiality.
Run this check with Prowler
Run in Prowler CloudRun
prowler gcp --checks cloudsql_instance_postgres_log_statement_flagRecommendation
Configure log_statement to ddl to capture schema changes without excessive noise. Apply defense in depth: use targeted auditing for data access, restrict and monitor log access with least privilege, and enforce log retention and rotation to protect availability.
Remediation
CLI
gcloud sql instances patch <example_resource_name> --database-flags=log_statement=ddlTerraform
resource "google_sql_database_instance" "<example_resource_name>" {
name = "<example_resource_name>"
region = "<region>"
database_version = "POSTGRES_14"
settings {
tier = "db-custom-2-7680"
# Critical: sets PostgreSQL 'log_statement' to 'ddl' to pass the check
database_flags {
name = "log_statement" # required flag name
value = "ddl" # required value
}
}
}Other
1In Google Cloud Console, go to SQL > Instances and open <example_resource_name>
2Click Edit
3In Database flags, click Add item
4Select log_statement and set value to ddl
5Click Save
Check Code
from prowler.lib.check.models import Check, Check_Report_GCP
from prowler.providers.gcp.services.cloudsql.cloudsql_client import cloudsql_client
class cloudsql_instance_postgres_log_statement_flag(Check):
def execute(self) -> Check_Report_GCP:
desired_log_statement = "ddl"
findings = []
for instance in cloudsql_client.instances:
if "POSTGRES" in instance.version:
report = Check_Report_GCP(metadata=self.metadata(), resource=instance)
report.status = "FAIL"
report.status_extended = f"PostgreSQL Instance {instance.name} does not have 'log_statement' flag set to '{desired_log_statement}'."
for flag in instance.flags:
if (
flag.get("name", "") == "log_statement"
and flag.get("value", "none") == desired_log_statement
):
report.status = "PASS"
report.status_extended = f"PostgreSQL Instance {instance.name} has 'log_statement' flag set to '{desired_log_statement}'."
break
findings.append(report)
return findings