Clear-text protocols such as ftp
, telnet
, or http
lack encryption of transported data, as well as the
capability to build an authenticated connection. It means that an attacker able to sniff traffic from the network can read, modify, or corrupt the
transported content. These protocols are not secure as they expose applications to an extensive range of risks:
- sensitive data exposure
- traffic redirected to a malicious endpoint
- malware-infected software update or installer
- execution of client-side code
- corruption of critical information
Even in the context of isolated networks like offline environments or segmented cloud environments, the insider threat exists. Thus, attacks
involving communications being sniffed or tampered with can still happen.
For example, attackers could successfully compromise prior security layers by:
- bypassing isolation mechanisms
- compromising a component of the network
- getting the credentials of an internal IAM account (either from a service account or an actual person)
In such cases, encrypting communications would decrease the chances of attackers to successfully leak data or steal credentials from other network
components. By layering various security practices (segmentation and encryption, for example), the application will follow the
defense-in-depth principle.
Note that using the http
protocol is being deprecated by major web browsers.
In the past, it has led to the following vulnerabilities:
Ask Yourself Whether
- Application data needs to be protected against tampering or leaks when transiting over the network.
- Application data transits over an untrusted network.
- Compliance rules require the service to encrypt data in transit.
- OS-level protections against clear-text traffic are deactivated.
There is a risk if you answered yes to any of those questions.
Recommended Secure Coding Practices
- Make application data transit over a secure, authenticated and encrypted protocol like TLS or SSH. Here are a few alternatives to the most
common clear-text protocols:
- Use
sftp
, scp
, or ftps
instead of ftp
.
- Use
https
instead of http
.
It is recommended to secure all transport channels, even on local networks, as it can take a single non-secure connection to compromise an entire
application or system.
Sensitive Code Example
For Microsoft.Web/sites:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Web/sites",
"name": "example",
"apiVersion": "2022-09-01",
"properties": {
"httpsOnly": false
}
}
]
}
resource symbolicname 'Microsoft.Web/sites@2022-03-01' = {
properties: {
httpsOnly: false // Sensitive
}
}
For Microsoft.Web/sites/config:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Web/sites/config",
"name": "sites/example",
"apiVersion": "2022-09-01",
"properties": {
"ftpsState": "AllAllowed"
}
}
]
}
resource symbolicname 'Microsoft.Web/sites/config@2022-09-01' = {
properties: {
ftpsState: 'AllAllowed' // Sensitive
}
}
For Microsoft.Storage/storageAccounts:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"name": "example",
"apiVersion": "2022-09-01",
"properties": {
"supportsHttpsTrafficOnly": false
}
}
]
}
resource symbolicname 'Microsoft.Storage/storageAccounts@2022-09-01' = {
properties: {
supportsHttpsTrafficOnly: false // Sensitive
}
}
For Microsoft.ApiManagement/service/apis:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.ApiManagement/service/apis",
"name": "service/example",
"apiVersion": "2022-08-01",
"properties": {
"protocols": ["http"]
}
}
]
}
resource symbolicname 'Microsoft.ApiManagement/service/apis@2022-08-01' = {
properties: {
protocols: ['http'] // Sensitive
}
}
For Microsoft.Cdn/profiles/endpoints:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Cdn/profiles/endpoints",
"name": "profiles/example",
"apiVersion": "2021-06-01",
"properties": {
"isHttpAllowed": true
}
}
]
}
resource symbolicname 'Microsoft.Cdn/profiles/endpoints@2021-06-01' = {
properties: {
isHttpAllowed: true // Sensitive
}
}
For Microsoft.Cache/redisEnterprise/databases:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Cache/redisEnterprise/databases",
"name": "redisEnterprise/example",
"apiVersion": "2022-01-01",
"properties": {
"clientProtocol": "Plaintext"
}
}
]
}
resource symbolicname 'Microsoft.Cache/redisEnterprise/databases@2022-01-01' = {
properties: {
clientProtocol: 'Plaintext' // Sensitive
}
}
For Microsoft.DBforMySQL/servers, Microsoft.DBforMariaDB/servers, and Microsoft.DBforPostgreSQL/servers:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.DBforMySQL/servers",
"name": "example",
"apiVersion": "2017-12-01",
"properties": {
"sslEnforcement": "Disabled"
}
}
]
}
resource symbolicname 'Microsoft.DBforMySQL/servers@2017-12-01' = {
properties: {
sslEnforcement: 'Disabled' // Sensitive
}
}
Compliant Solution
For Microsoft.Web/sites:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Web/sites",
"name": "example",
"apiVersion": "2022-09-01",
"properties": {
"httpsOnly": true
}
}
]
}
resource symbolicname 'Microsoft.Web/sites@2022-03-01' = {
properties: {
httpsOnly: true
}
}
For Microsoft.Web/sites/config:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Web/sites/config",
"name": "sites/example",
"apiVersion": "2022-09-01",
"properties": {
"ftpsState": "FtpsOnly"
}
}
]
}
resource symbolicname 'Microsoft.Web/sites/config@2022-09-01' = {
properties: {
ftpsState: 'FtpsOnly'
}
}
For Microsoft.Storage/storageAccounts:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"name": "example",
"apiVersion": "2022-09-01",
"properties": {
"supportsHttpsTrafficOnly": true
}
}
]
}
resource symbolicname 'Microsoft.Storage/storageAccounts@2022-09-01' = {
properties: {
supportsHttpsTrafficOnly: true
}
}
For Microsoft.ApiManagement/service/apis:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.ApiManagement/service/apis",
"name": "service/example",
"apiVersion": "2022-08-01",
"properties": {
"protocols": ["https"]
}
}
]
}
resource symbolicname 'Microsoft.ApiManagement/service/apis@2022-08-01' = {
properties: {
protocols: ['https']
}
}
For Microsoft.Cdn/profiles/endpoints:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Cdn/profiles/endpoints",
"name": "profiles/example",
"apiVersion": "2021-06-01",
"properties": {
"isHttpAllowed": false
}
}
]
}
resource symbolicname 'Microsoft.Cdn/profiles/endpoints@2021-06-01' = {
properties: {
isHttpAllowed: false
}
}
For Microsoft.Cache/redisEnterprise/databases:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Cache/redisEnterprise/databases",
"name": "redisEnterprise/example",
"apiVersion": "2022-01-01",
"properties": {
"clientProtocol": "Encrypted"
}
}
]
}
resource symbolicname 'Microsoft.Cache/redisEnterprise/databases@2022-01-01' = {
properties: {
clientProtocol: 'Encrypted'
}
}
For Microsoft.DBforMySQL/servers, Microsoft.DBforMariaDB/servers, and Microsoft.DBforPostgreSQL/servers:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.DBforMySQL/servers",
"name": "example",
"apiVersion": "2017-12-01",
"properties": {
"sslEnforcement": "Enabled"
}
}
]
}
resource symbolicname 'Microsoft.DBforMySQL/servers@2017-12-01' = {
properties: {
sslEnforcement: 'Enabled'
}
}
See
Documentation
Articles & blog posts
Standards