Introducción
Con el paso del tiempo, muchas configuraciones por defecto en entornos cloud se quedan obsoletas. Uno de los casos más críticos, desde el punto de vista de la seguridad, es el uso de versiones antiguas del protocolo TLS (Transport Layer Security).
Aunque TLS 1.0 y 1.1 ya están obsoletos y presentan riesgos conocidos, es sorprendentemente común encontrar Storage Account en Azure que aún los tienen habilitados. Este artículo te muestra cómo actualizar de forma masiva y automatizada todas tus cuentas de almacenamiento para usar únicamente TLS 1.2, cumpliendo así con los estándares de seguridad actuales y requisitos normativos como PCI-DSS, ISO 27001 o NIST.
Por qué es importante?
- TLS 1.0/1.1 están oficialmente desaprobados por IETF desde marzo de 2021.
- Múltiples vulnerabilidades (como POODLE o BEAST) afectan a versiones antiguas.
- Auditorías de seguridad lo detectan y penalizan.
¿Cómo comprobar la versión de TLS actual?
Puedes revisar la configuración TLS de una cuenta de almacenamiento ejecutando:
az storage account show --name <storage-account-name> --resource-group <rg-name> --query "minimumTlsVersion"
Script para actualizar todas las cuentas a TLS 1.2
El siguiente script en Bash permite actualizar masivamente todas tus cuentas de almacenamiento de Azure, usando como fuente una lista de resourceIds
por entorno (dev
, pre
, pro
, etc.).
Estructura esperada del directorio
.
├── dev.txt
├── int.txt
├── poc.txt
├── pre.txt
├── pro.txt
├── test.txt
└── tls-update.sh
Cada archivo .txt
contiene líneas con resource IDs de cuentas de almacenamiento, por ejemplo:
/subscriptions/xxxx/resourceGroups/rg-dev/providers/Microsoft.Storage/storageAccounts/storage1
/subscriptions/yyyy/resourceGroups/rg-dev/providers/Microsoft.Storage/storageAccounts/storage2
Script tls-update.sh
#!/bin/bash
update_tls() {
local resource_id=$1
local subscription_id
local rg
local storage_account
# Extrae valores con grep
subscription_id=$(echo "$resource_id" | grep -oP '(?<=/subscriptions/)[^/]+')
rg=$(echo "$resource_id" | grep -oP '(?<=resourceGroups/)[^/]+')
storage_account=$(echo "$resource_id" | grep -oP '(?<=storageAccounts/)[^/]+')
echo "[INFO] Estableciendo suscripción: $subscription_id"
az account set --subscription "$subscription_id"
echo "[INFO] Actualizando Storage Account: $storage_account en RG: $rg"
az storage account update --name "$storage_account" --resource-group "$rg" --min-tls-version TLS1_2
}
process_file() {
local file=$1
echo "[INFO] Procesando fichero $file ..."
while IFS= read -r line || [[ -n "$line" ]]; do
update_tls "$line"
done < "$file"
}
# Procesamiento de todos los entornos
for file in poc.txt dev.txt int.txt pre.txt pro.txt test.txt ; do
if [[ -f "$file" ]]; then
process_file "$file"
else
echo "[WARN] Fichero $file no encontrado, se salta."
fi
done
:wq!