Introducción: En la era digital actual, donde la seguridad y la eficiencia son fundamentales, la capacidad de transferir archivos de manera segura a la nube es esencial. Azure Blob Storage ofrece una solución robusta para el almacenamiento de datos no estructurados, como archivos de texto o binarios. En este artículo, exploraremos cómo automatizar el proceso de transferencia de archivos a Azure Blob Storage utilizando PowerShell, asegurando la seguridad de los datos mediante el uso de Service Principal Authentication y Shared Access Signatures (SAS).
Instalación del Módulo Az: Antes de comenzar, es crucial asegurarse de que el módulo de Azure PowerShell esté instalado en el sistema. Si no está presente, podemos instalarlo fácilmente utilizando PowerShell con el siguiente comando:
Install-Module -Name Az -AllowClobber -Force
Este comando garantiza que el módulo se instale sin conflictos y de manera forzada, si es necesario.
CÓDIGO:
# Verificar si el módulo Az está instalado
$azModulePath = "$env:ProgramFiles\WindowsPowerShell\Modules\Az"
if (Test-Path $azModulePath) {
Write-Host "El módulo de Azure PowerShell está instalado."
} else {
Write-Host "El módulo de Azure PowerShell no está instalado. Iniciando la instalación..."
# Instalar el módulo de Azure PowerShell
Write-Host "Instalando el módulo de Azure PowerShell..."
Install-Module -Name Az -AllowClobber -Force
Write-Host "El módulo de Azure PowerShell se ha instalado correctamente."
}
# Define las credenciales de la identidad de servicio (Service Principal)
$clientId = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
$clientSecret = "XXXXXXXX~XXXXXXXXXXXX_XXXXXXXXXXXX"
$tenantId = "XXXXXXXX~XXXXXXXXXXXX_XXXXXXXXXXXX"
$subscriptionId = "XXXXXXXX~XXXXXXXXXXXX_XXXXXXXXXXXX"
# Autentica con el Service Principal
$secureClientSecret = ConvertTo-SecureString $clientSecret -AsPlainText -Force
$cred = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $clientId, $secureClientSecret
Connect-AzAccount -ServicePrincipal -Credential $cred -Tenant $tenantId -Subscription $subscriptionId | Out-Null
# Define los parámetros para generar la firma de acceso compartido (SAS) con el usuario delegado
$storageAccountName = "storageaccount01"
$containerName = "container01"
$blobName = "test00001.txt"
$ResourceGroup = "RG-REDORBITA-01"
$expiry = (Get-Date).AddHours(3) # SAS válida por 1 hora
# Ruta local del archivo que se transferirá al blob
$localFilePath = "C:\Users\rokitoh\test00001.txt"
# Genera la firma de acceso compartido (SAS) con el usuario delegado para el blob
$sasToken = New-AzStorageBlobSASToken -Context (New-AzStorageContext -StorageAccountName $storageAccountName) `
-Container $containerName -Blob $blobName -Permission racwd -ExpiryTime $expiry -FullUri
# Muestra la URL completa con la SAS para el blob
Write-Host "URL del blob con SAS: $sasToken"
# Sube el archivo al blob utilizando la URL de SAS generada
Invoke-WebRequest -Uri $sasToken -Method Put -Headers @{"x-ms-blob-type"="BlockBlob"} -InFile $localFilePath
Write-Host "El archivo se ha transferido exitosamente al blob."
A Continuación vamos a explicar detalladamente el script:
- Verificación del Módulo Az:
$azModulePath = "$env:ProgramFiles\WindowsPowerShell\Modules\Az"
if (Test-Path $azModulePath) {
Write-Host "El módulo de Azure PowerShell está instalado."
} else {
Write-Host "El módulo de Azure PowerShell no está instalado. Iniciando la instalación..."
# Instalar el módulo de Azure PowerShell
Write-Host "Instalando el módulo de Azure PowerShell..."
Install-Module -Name Az -AllowClobber -Force
Write-Host "El módulo de Azure PowerShell se ha instalado correctamente."
}
Este bloque de código verifica si el módulo de Azure PowerShell está instalado en el sistema. Primero, define la ruta del módulo de Azure. Luego, utiliza Test-Path para verificar si el módulo existe en la ruta especificada. Si el módulo está presente, muestra un mensaje indicando que está instalado. Si no está presente, inicia la instalación del módulo utilizando Install-Module, asegurándose de que no haya conflictos (-AllowClobber) y forzando la instalación (-Force). Una vez instalado, muestra un mensaje de confirmación.
- Definición de Credenciales y Autenticación con Service Principal:
$clientId = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
$clientSecret = "XXXXXXXX~XXXXXXXXXXXX_XXXXXXXXXXXX"
$tenantId = "XXXXXXXX~XXXXXXXXXXXX_XXXXXXXXXXXX"
$subscriptionId = "XXXXXXXX~XXXXXXXXXXXX_XXXXXXXXXXXX"
$secureClientSecret = ConvertTo-SecureString $clientSecret -AsPlainText -Force
$cred = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $clientId, $secureClientSecret
Connect-AzAccount -ServicePrincipal -Credential $cred -Tenant $tenantId -Subscription $subscriptionId | Out-Null
En este fragmento, se definen las credenciales del Service Principal, que incluyen el ID del cliente ($clientId), el secreto del cliente ($clientSecret), el ID del inquilino ($tenantId) y el ID de la suscripción ($subscriptionId). El secreto del cliente se convierte en un objeto seguro utilizando ConvertTo-SecureString. Luego, se crea un objeto de credencial ($cred) utilizando New-Object y se autentica con Azure utilizando Connect-AzAccount con el tipo de autenticación de Service Principal y las credenciales proporcionadas.
- Generación de Shared Access Signatures (SAS) y Transferencia de Archivos:
$storageAccountName = "storageaccount01"
$containerName = "container01"
$blobName = "test00001.txt"
$ResourceGroup = "RG-REDORBITA-01"
$expiry = (Get-Date).AddHours(3)
$localFilePath = "C:\Users\jrodrigue319\test00001.txt"
$sasToken = New-AzStorageBlobSASToken -Context (New-AzStorageContext -StorageAccountName $storageAccountName) `
-Container $containerName -Blob $blobName -Permission racwd -ExpiryTime $expiry -FullUri
Invoke-WebRequest -Uri $sasToken -Method Put -Headers @{"x-ms-blob-type"="BlockBlob"} -InFile $localFilePath
Aquí, se definen los parámetros necesarios para la generación de la firma de acceso compartido (SAS). Luego, se utiliza New-AzStorageBlobSASToken para generar la SAS con permisos específicos (racwd), una fecha de expiración ($expiry) y se obtiene la URL completa utilizando -FullUri. Finalmente, se utiliza Invoke-WebRequest para cargar el archivo local especificado en el blob de Azure utilizando la URL de la SAS generada.
Consideraciones de Seguridad: Es importante tener en cuenta los permisos asignados al Service Principal y al almacenamiento de Azure. En este caso, se deben otorgar los roles de «Storage Account Key Operators» y «Storage Blob Delegator» al Service Principal para garantizar que tenga los permisos necesarios para realizar operaciones de lectura y escritura en el blob de destino.
:wq!