Problema
En entornos donde se necesita transferir archivos de forma frecuente entre sistemas on‑premise y Azure, el protocolo SFTP sigue siendo la opción preferida por su simplicidad y compatibilidad. Tradicionalmente, los administradores crean usuarios locales en el servicio SFTP de Azure Blob Storage y gestionan contraseñas o claves SSH de forma independiente. Este modelo genera varios inconvenientes:
- Gestión de credenciales dispersas – Cada usuario requiere una cuenta y una clave, lo que aumenta la carga operativa y el riesgo de contraseñas débiles o caducadas.
- Falta de control centralizado – No se pueden aplicar políticas de acceso condicional, MFA o auditoría de Azure AD.
- Escalabilidad limitada – Cuando el número de usuarios crece, la administración manual se vuelve impráctica.
El problema general es: cómo ofrecer acceso SFTP a contenedores de Blob sin depender de cuentas locales, aprovechando la identidad de Azure AD (Entra ID) para un control de acceso coherente y seguro.
Causa
Varias causas habituales impiden que los equipos adopten Entra ID para SFTP:
- Feature no habilitada – La capacidad de autenticación con Entra ID es opcional y debe activarse en la cuenta de almacenamiento antes de crear puntos de montaje SFTP.
- Roles y permisos insuficientes – Los usuarios o grupos de Azure AD no disponen del rol
Storage Blob Data Contributor(o superior) sobre el contenedor objetivo, lo que provoca errores de autorización al intentar conectarse. - Configuración de red restrictiva – Cuando la cuenta de almacenamiento está dentro de una red virtual o tiene reglas de firewall, los clientes SFTP pueden quedar bloqueados si no se permite el rango de IP del cliente o la salida a través de Private Endpoint.
- Falta de claves SSH vinculadas a la identidad – Entra ID no usa contraseñas tradicionales; requiere que la identidad tenga una clave pública SSH asociada mediante Azure AD
sshPublicKeyo que se emplee Azure ADAzure AD DSpara la autenticación basada en Kerberos. - Políticas de acceso condicional incompatibles – Algunas políticas de MFA o de ubicación pueden impedir la conexión SFTP si no se configuran excepciones adecuadas.
Solución
La solución se compone de tres bloques: habilitar la característica, asignar los permisos correctos y configurar la red. Cada bloque es reutilizable en cualquier suscripción y no depende de un caso puntual.
1. Activar SFTP con Entra ID
- Crear o actualizar la cuenta de almacenamiento con la opción
allowBlobPublicAccessdesactivada yisSftpEnabledentrue. - Habilitar la autenticación basada en Azure AD mediante la propiedad
allowAzureAdSftp(disponible a partir del anuncio de la semana).
Esto se realiza con Azure CLI:
az storage account update \
--name miCuentaBlob \
--resource-group rg-prod \
--set allowBlobPublicAccess=false \
--set isSftpEnabled=true \
--set allowAzureAdSftp=true
2. Configurar RBAC para los usuarios SFTP
- Crear un grupo de Azure AD que agrupe a todos los usuarios que necesiten acceso SFTP (ej.
SFTP-Admins). - Asignar el rol
Storage Blob Data Contributor(oStorage Blob Data Ownersi se requiere eliminación) al grupo sobre el contenedor o la cuenta completa:
az role assignment create \
--assignee-object-id $(az ad group show --group SFTP-Admins --query objectId -o tsv) \
--role "Storage Blob Data Contributor" \
--scope $(az storage container show --account-name miCuentaBlob --name datos --query id -o tsv)
- Adjuntar una clave SSH pública a cada identidad que usará SFTP. Azure AD permite almacenar la clave en la extensión
sshPublicKey:
az ad user update \
--id [email protected] \
--set extensionAttributes.extensionAttribute1="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC..."
Nota: la clave debe estar en formato OpenSSH y sin comentarios adicionales.
3. Ajustar la red
- Si la cuenta está dentro de una Virtual Network con Private Endpoint, asegúrese de que el cliente SFTP tenga conectividad a través de VPN o ExpressRoute.
- Cuando se usan reglas de firewall, añada la IP pública del cliente o habilite
Allow trusted Microsoft servicespara evitar bloqueos inesperados.
Ejemplo de apertura de rango IP:
az storage account network-rule add \
--account-name miCuentaBlob \
--resource-group rg-prod \
--ip-address 203.0.113.0/24
4. Probar la conexión
Con la clave SSH asociada, el cliente SFTP se conecta usando la sintaxis estándar:
sftp -i ~/.ssh/id_rsa [email protected]@miCuentaBlob.blob.core.windows.net
Si la cuenta está detrás de un Private Endpoint, el nombre DNS será el del endpoint privado.
Cuándo aplicar esta solución
Aplica cuando:
- Necesites ofrecer SFTP a varios usuarios o aplicaciones sin crear cuentas locales en Azure Storage.
- Quieras centralizar la auditoría y aplicar políticas de acceso condicional de Azure AD.
- La carga de trabajo implique transferencia de datos sensible y requiera MFA o condiciones de red.
No aplica si:
- Tu escenario usa exclusivamente Azure Files con SMB y no necesita SFTP.
- La cuenta de almacenamiento es de tipo Blob Storage (v1) que no soporta SFTP.
- La organización prohíbe el uso de claves SSH por política de seguridad y prefiere certificados X.509.
Código
# 1. Habilitar SFTP y autenticación Azure AD
az storage account update \
--name miCuentaBlob \
--resource-group rg-prod \
--set allowBlobPublicAccess=false \
--set isSftpEnabled=true \
--set allowAzureAdSftp=true
# 2. Crear grupo AD y asignar rol
az ad group create --display-name "SFTP-Admins" --mail-nickname sftpadmins
az role assignment create \
--assignee-object-id $(az ad group show --group SFTP-Admins --query objectId -o tsv) \
--role "Storage Blob Data Contributor" \
--scope $(az storage account show --name miCuentaBlob --resource-group rg-prod --query id -o tsv)
# 3. Adjuntar clave SSH a un usuario
az ad user update \
--id [email protected] \
--set extensionAttributes.extensionAttribute1="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC..."
# 4. Configurar regla de red (si es necesario)
az storage account network-rule add \
--account-name miCuentaBlob \
--resource-group rg-prod \
--ip-address 203.0.113.0/24
Verificación
-
Listar la configuración de la cuenta y confirmar que
isSftpEnabledyallowAzureAdSftpaparecen comotrue:az storage account show -n miCuentaBlob -g rg-prod --query "{sftp:isSftpEnabled, adSftp:allowAzureAdSftp}" -
Comprobar la asignación de rol:
az role assignment list --assignee $(az ad group show --group SFTP-Admins --query objectId -o tsv) \ --scope $(az storage account show -n miCuentaBlob -g rg-prod --query id -o tsv) \ --output table -
Realizar una conexión SFTP desde una máquina con la clave SSH configurada. Un mensaje de bienvenida y la lista de directorios indican éxito.
-
Revisar los logs de Azure Monitor para la cuenta de almacenamiento; busca eventos
AuthenticationSuccessconprincipalIdque coincida con el objeto Azure AD del usuario.
Notas adicionales
- Rotación de claves: Azure AD no gestiona la rotación automática de claves SSH. Defina un proceso interno (por ejemplo, cada 90 días) y actualice la extensión
sshPublicKeymediante script. - Políticas de acceso condicional: Si habilita MFA, asegúrese de crear una política que excluya el tráfico SFTP (puerto 22) o que permita la autenticación basada en claves sin requerir MFA, ya que SFTP no soporta prompts interactivos.
- Auditoría: Habilite
Azure Storage loggingpara capturar cada operación SFTP. Los logs pueden enviarse a Log Analytics y combinarse con alertas de actividad sospechosa. - Compatibilidad con clientes: La mayoría de los clientes SFTP modernos aceptan autenticación por clave pública. Si necesita compatibilidad con clientes que solo usan contraseñas, mantenga una cuenta de usuario local paralela, pero limite su uso a entornos aislados.