Back to Checks
MySQL flexible server enforces TLS 1.2 or higher
mysql_flexible_server_minimum_tls_version_12
Service: mysqlSeverity: high
OfficialBuilt-inVerified
Categories:encryption
Resource Type:microsoft.dbformysql/flexibleservers
Azure Database for MySQL Flexible Server uses the tls_version setting to permit only modern TLS for client connections, requiring TLSv1.2+ and excluding TLSv1.0 and TLSv1.1.
Risk
Allowing legacy TLS (TLSv1.0/TLSv1.1) weakens confidentiality and integrity of data in transit. Attackers can force downgrades and perform man-in-the-middle interception, exposing credentials and queries or altering results, leading to unauthorized access and data exfiltration.
Run this check with Prowler
Run in Prowler CloudRun
prowler azure --checks mysql_flexible_server_minimum_tls_version_12Recommendation
Enforce a minimum TLS of TLSv1.2 (prefer TLSv1.3) and disable TLSv1.0/TLSv1.1. Ensure clients and drivers support modern TLS, deprecate weak cipher suites, and validate in staging. Apply defense in depth with private connectivity and restricted network access.
Remediation
CLI
az mysql flexible-server parameter set --resource-group <resourceGroupName> --server-name <serverName> --name tls_version --value TLSv1.2Terraform
# Enforce TLS 1.2 on MySQL Flexible Server
resource "azurerm_mysql_flexible_server_configuration" "tls" {
name = "tls_version"
resource_group_name = "<example_resource_group>"
server_name = "<example_server_name>"
value = "TLSv1.2" # Critical: sets minimum TLS to 1.2 (no 1.0/1.1)
}NativeIaC
// Set MySQL Flexible Server to enforce TLS 1.2
resource tlsVersion 'Microsoft.DBforMySQL/flexibleServers/configurations@2022-01-01' = {
name: '<example_resource_name>/tls_version'
properties: {
value: 'TLSv1.2' // Critical: enforces minimum TLS 1.2 and rejects TLS 1.0/1.1
}
}Other
1In Azure portal, go to Azure Database for MySQL flexible server <example_resource_name>
2Select Server parameters
3Search for tls_version
4Set the value to TLSv1.2
5Click Save
Check Code
from prowler.lib.check.models import Check, Check_Report_Azure
from prowler.providers.azure.services.mysql.mysql_client import mysql_client
class mysql_flexible_server_minimum_tls_version_12(Check):
def execute(self) -> Check_Report_Azure:
findings = []
for (
subscription_id,
servers,
) in mysql_client.flexible_servers.items():
subscription_name = mysql_client.subscriptions.get(
subscription_id, subscription_id
)
for server in servers.values():
report = Check_Report_Azure(metadata=self.metadata(), resource=server)
report.subscription = subscription_id
report.status = "FAIL"
report.status_extended = f"TLS version is not configured in server {server.name} in subscription {subscription_name} ({subscription_id})."
if "tls_version" in server.configurations:
report.resource_id = server.configurations[
"tls_version"
].resource_id
report.status = "PASS"
report.status_extended = f"TLS version is {server.configurations['tls_version'].value} in server {server.name} in subscription {subscription_name} ({subscription_id}). This version of TLS is considered secure."
tls_aviable = server.configurations["tls_version"].value.split(",")
if "TLSv1.0" in tls_aviable or "TLSv1.1" in tls_aviable:
report.status = "FAIL"
report.status_extended = f"TLS version is {server.configurations['tls_version'].value} in server {server.name} in subscription {subscription_name} ({subscription_id}). There is at leat one version of TLS that is considered insecure."
findings.append(report)
return findings