Compartir vía


Montaje de recursos compartidos de archivos de Azure SMB en clientes Linux

Los recursos compartidos de archivos de Azure se pueden montar en distribuciones de Linux mediante el cliente kernel de SMB.

Para montar un recurso compartido de archivos de Azure en Linux se recomienda usar SMB 3.1.1. De forma predeterminada, Azure Files requiere cifrado en tránsito, que solo se admite SMB 3.0, y en las versiones posteriores. Azure Files también admite SMB 2.1, que no admite el cifrado en tránsito, pero no puede montar recursos compartidos de archivos de Azure con SMB 2.1 desde otra región de Azure o de forma local por motivos de seguridad. Salvo que la aplicación requiera específicamente SMB 2.1, use SMB 3.1.1. La compatibilidad con SMB 2.1 se ha agregado a la versión 3.7 del kernel de Linux, por lo que si usa una versión del kernel de Linux después de la versión 3.7, debe admitir SMB 2.1.

Distribución SMB 3.1.1 (recomendado) SMB 3.0
Versión del kernel de Linux
  • Compatibilidad básica con 3.1.1: 4.17
  • Montaje predeterminado: 5.0
  • Cifrado AES-128-GCM: 5.3
  • Cifrado AES-256-GCM: 5.10
  • Compatibilidad básica con 3.0: 3.12
  • Cifrado AES-128-CCM: 4.11
Ubuntu Cifrado AES-128-GCM: 18.04.5 LTS+ Cifrado AES-128-CCM: 16.04.4 LTS+
Red Hat Enterprise Linux (RHEL)
  • Básico: 8.0 (o posterior)
  • Montaje predeterminado: 8.2 (o posterior)
  • Cifrado AES-128-GCM: 8.2 (o posterior)
7.5 (o posterior)
Debian Básico: 10 (o posterior) Cifrado AES-128-CCM: 10 (o posterior)
SUSE Linux Enterprise Server Cifrado AES-128-GCM: 15 SP2 (o posterior) Cifrado AES-128-GCM: 12 SP2 (o posterior)

Si la distribución de Linux no aparece en la tabla anterior, puede comprobar la versión del kernel de Linux con el comando uname:

uname -r

Nota:

Todos los scripts de montaje de este artículo montarán recursos compartidos de archivos SMB con los permisos predeterminados de archivos y carpetas de Linux 0755. Esto significa leer, escribir y ejecutar para el propietario del archivo o directorio, leer y ejecutar para los usuarios del grupo propietario, y leer y ejecutar para otros usuarios. En función de las directivas de seguridad de la organización, es posible que desee establecer permisos alternativos uid/gid o dir_mode y file_mode en las opciones de montaje. Para obtener más información sobre cómo establecer permisos, consulte Notación numérica de UNIX.

Se aplica a

Tipo de recurso compartido de archivos SMB NFS
Recursos compartidos de archivos Estándar (GPv2), LRS/ZRS Sí No
Recursos compartidos de archivos Estándar (GPv2), GRS/GZRS Sí No
Recursos compartidos de archivos Premium (FileStorage), LRS/ZRS Sí No

Requisitos previos

  • Asegúrese de que el paquete cifs-utils está instalado. El paquete cifs-utils se instala con el administrador de paquetes en la distribución de Linux de su elección.

En Ubuntu y Debian, use el administrador de paquetes apt:

sudo apt update
sudo apt install cifs-utils

En otras distribuciones, use el administrador de paquetes apropiado o compile desde el origen.

  • La versión más reciente de la interfaz de la línea de comandos (CLI). Para más información sobre cómo instalar la CLI de Azure, consulte Instalación de la CLI de Azure y seleccione el sistema operativo. Si prefiere usar el módulo de Azure PowerShell en PowerShell 6+, puede hacerlo. Sin embargo, las instrucciones de este artículo son para la CLI de Azure.

  • Asegúrese de que el puerto 445 está abierto: SMB se comunica a través del puerto TCP 445, así que asegúrese de que el firewall o ISP no bloquea el puerto TCP 445 en el equipo cliente. Reemplace <your-resource-group> y <your-storage-account> y luego ejecute el siguiente script:

    RESOURCE_GROUP_NAME="<your-resource-group>"
    STORAGE_ACCOUNT_NAME="<your-storage-account>"
    
    # This command assumes you have logged in with az login
    HTTP_ENDPOINT=$(az storage account show \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $STORAGE_ACCOUNT_NAME \
        --query "primaryEndpoints.file" --output tsv | tr -d '"')
    SMBPATH=$(echo $HTTP_ENDPOINT | cut -c7-${#HTTP_ENDPOINT})
    FILE_HOST=$(echo $SMBPATH | tr -d "/")
    
    nc -zvw3 $FILE_HOST 445
    

    Si la conexión se realizó correctamente, verá algo parecido a la siguiente salida:

    Connection to <your-storage-account> 445 port [tcp/microsoft-ds] succeeded!
    

    Si no puede abrir el puerto 445 en su red corporativa o si un ISP le impide hacerlo, puede utilizar una conexión VPN o ExpressRoute como solución alternativa al puerto 445. Para más información, consulte Consideraciones de redes para el acceso directo a los recursos compartidos de archivos de Azure.

Montaje del recurso compartido de archivos de Azure a petición con mount

Al montar un recurso compartido de archivos en un sistema operativo Linux, el recurso compartido de archivos remoto se representa como una carpeta en el sistema de archivos local. Los recursos compartidos de archivos se pueden montar en cualquier lugar del sistema. En el ejemplo siguiente el montaje se realiza en la ruta de acceso /media. Para cambiarla por otra que desee, modifique la variable $MNT_ROOT.

Reemplace <resource-group-name>, <storage-account-name> y <file-share-name> por la información correcta para su entorno:

RESOURCE_GROUP_NAME="<resource-group-name>"
STORAGE_ACCOUNT_NAME="<storage-account-name>"
FILE_SHARE_NAME="<file-share-name>"

MNT_ROOT="/media"
MNT_PATH="$MNT_ROOT/$STORAGE_ACCOUNT_NAME/$FILE_SHARE_NAME"

sudo mkdir -p $MNT_PATH

A continuación, inicialice el archivo de credenciales ejecutando el siguiente script.

# Create a folder to store the credentials for this storage account and
# any other that you might set up.
CREDENTIAL_ROOT="/etc/smbcredentials"
sudo mkdir -p "/etc/smbcredentials"

# Get the storage account key for the indicated storage account.
# You must be logged in with az login and your user identity must have
# permissions to list the storage account keys for this command to work.
STORAGE_ACCOUNT_KEY=$(az storage account keys list \
    --resource-group $RESOURCE_GROUP_NAME \
    --account-name $STORAGE_ACCOUNT_NAME \
    --query "[0].value" --output tsv | tr -d '"')

# Create the credential file for this individual storage account
SMB_CREDENTIAL_FILE="$CREDENTIAL_ROOT/$STORAGE_ACCOUNT_NAME.cred"
if [ ! -f $SMB_CREDENTIAL_FILE ]; then
    echo "username=$STORAGE_ACCOUNT_NAME" | sudo tee $SMB_CREDENTIAL_FILE > /dev/null
    echo "password=$STORAGE_ACCOUNT_KEY" | sudo tee -a $SMB_CREDENTIAL_FILE > /dev/null
else
    echo "The credential file $SMB_CREDENTIAL_FILE already exists, and was not modified."
fi

# Change permissions on the credential file so only root can read or modify the password file.
sudo chmod 600 $SMB_CREDENTIAL_FILE

Ahora puede montar el recurso compartido de archivos con el comando mount mediante el archivo de credenciales. En el siguiente ejemplo, el comando $SMB_PATH se rellena con el nombre de dominio completo para el punto de conexión del archivo de la cuenta de almacenamiento.

Nota:

A partir de la versión 5.0 del kernel de Linux, SMB 3.1.1 es el protocolo negociado predeterminado. Si usa una versión del kernel de Linux anterior a la 5.0, especifique vers=3.1.1 en la lista de opciones de montaje.

# This command assumes you have logged in with az login
HTTP_ENDPOINT=$(az storage account show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $STORAGE_ACCOUNT_NAME \
    --query "primaryEndpoints.file" --output tsv | tr -d '"')
SMB_PATH=$(echo $HTTP_ENDPOINT | cut -c7-${#HTTP_ENDPOINT})$FILE_SHARE_NAME

STORAGE_ACCOUNT_KEY=$(az storage account keys list \
    --resource-group $RESOURCE_GROUP_NAME \
    --account-name $STORAGE_ACCOUNT_NAME \
    --query "[0].value" --output tsv | tr -d '"')

sudo mount -t cifs $SMB_PATH $MNT_PATH -o credentials=$SMB_CREDENTIAL_FILE,serverino,nosharesock,actimeo=30,mfsymlinks

Si lo desea, también puede montar el mismo recurso compartido de archivos de Azure en varios puntos de montaje. Cuando haya terminado de usar el recurso compartido de archivos de Azure, use sudo umount $mntPath para desmontarlo.

Montaje automático de recursos compartidos de archivos

Al montar un recurso compartido de archivos en un sistema operativo Linux, el recurso compartido de archivos remoto se representa como una carpeta en el sistema de archivos local. Los recursos compartidos de archivos se pueden montar en cualquier lugar del sistema. En el ejemplo siguiente el montaje se realiza en la ruta de acceso /media. Para cambiarla por otra que desee, modifique la variable $MNT_ROOT.

MNT_ROOT="/media"
sudo mkdir -p $MNT_ROOT

Para montar un recurso compartido de archivos de Azure en Linux, use el nombre de la cuenta de almacenamiento como nombre de usuario del recurso compartido de archivos y la clave de la cuenta de almacenamiento como contraseña. Dado que las credenciales de la cuenta de almacenamiento pueden cambiar con el tiempo, deben almacenarse por separado de la configuración de montaje.

En el ejemplo siguiente se muestra cómo crear un archivo para almacenar las credenciales. No olvide reemplazar <resource-group-name> y <storage-account-name> por la información correcta para su entorno.

RESOURCE_GROUP_NAME="<resource-group-name>"
STORAGE_ACCOUNT_NAME="<storage-account-name>"

# Create a folder to store the credentials for this storage account and
# any other that you might set up.
CREDENTIAL_ROOT="/etc/smbcredentials"
sudo mkdir -p "/etc/smbcredentials"

# Get the storage account key for the indicated storage account.
# You must be logged in with az login and your user identity must have
# permissions to list the storage account keys for this command to work.
STORAGE_ACCOUNT_KEY=$(az storage account keys list \
    --resource-group $RESOURCE_GROUP_NAME \
    --account-name $STORAGE_ACCOUNT_NAME \
    --query "[0].value" --output tsv | tr -d '"')

# Create the credential file for this individual storage account
SMB_CREDENTIAL_FILE="$CREDENTIAL_ROOT/$STORAGE_ACCOUNT_NAME.cred"
if [ ! -f $SMB_CREDENTIAL_FILE ]; then
    echo "username=$STORAGE_ACCOUNT_NAME" | sudo tee $SMB_CREDENTIAL_FILE > /dev/null
    echo "password=$STORAGE_ACCOUNT_KEY" | sudo tee -a $SMB_CREDENTIAL_FILE > /dev/null
else
    echo "The credential file $SMB_CREDENTIAL_FILE already exists, and was not modified."
fi

# Change permissions on the credential file so only root can read or modify the password file.
sudo chmod 600 $SMB_CREDENTIAL_FILE

Para montar automáticamente un recurso compartido de archivos, puede elegir entre usar un montaje estático a través de la utilidad /etc/fstab o un montaje dinámico a través de la utilidad autofs.

Montaje estático con /etc/fstab

Utilice el entorno anterior para crear una carpeta para su cuenta de almacenamiento o recurso compartido de archivos en la carpeta de montaje. Reemplace <file-share-name> por el nombre adecuado del recurso compartido de archivos de Azure.

FILE_SHARE_NAME="<file-share-name>"

MNT_PATH="$MNT_ROOT/$STORAGE_ACCOUNT_NAME/$FILE_SHARE_NAME"
sudo mkdir -p $MNT_PATH

Por último, cree un registro en el archivo /etc/fstab para el recurso compartido de archivos de Azure. En el comando siguiente, se usa el valor predeterminado de los permisos de archivo y carpeta de Linux, 0755, lo que significa lectura, escritura y ejecución para el propietario (según el propietario de Linux de archivo o directorio), lectura y ejecución para los usuarios en el grupo de propietarios y lectura y ejecución para otros en el sistema. Es posible que desee establecer los permisos uid y gid, o dir_mode y file_mode alternativos en el montaje según sea necesario. Para obtener más información sobre cómo establecer permisos, consulte Notación numérica de UNIX.

Sugerencia

Si quiere que los contenedores Docker que ejecutan aplicaciones de .NET Core puedan escribir en el recurso compartido de archivos de Azure, incluya nobrl en las opciones de montaje de SMB para evitar el envío de solicitudes de bloqueo de intervalo de bytes al servidor.

HTTP_ENDPOINT=$(az storage account show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $STORAGE_ACCOUNT_NAME \
    --query "primaryEndpoints.file" --output tsv | tr -d '"')
SMB_PATH=$(echo $HTTP_ENDPOINT | cut -c7-${#HTTP_ENDPOINT})$FILE_SHARE_NAME

if [ -z "$(grep $SMB_PATH\ $MNT_PATH /etc/fstab)" ]; then
    echo "$SMB_PATH $MNT_PATH cifs _netdev,nofail,credentials=$SMB_CREDENTIAL_FILE,serverino,nosharesock,actimeo=30,mfsymlinks" | sudo tee -a /etc/fstab > /dev/null
else
    echo "/etc/fstab was not modified to avoid conflicting entries as this Azure file share was already present. You might want to double check /etc/fstab to ensure the configuration is as desired."
fi

sudo mount -a

Nota:

A partir de la versión 5.0 del kernel de Linux, SMB 3.1.1 es el protocolo negociado predeterminado. Puede especificar versiones alternativas del protocolo mediante la opción de montaje vers (las versiones de protocolo son 3.1.1, 3.0 y 2.1).

Montaje dinámico con autofs

Para montar dinámicamente un recurso compartido de archivos con la utilidad autofs, instálelo mediante el administrador de paquetes en la distribución de Linux que prefiera.

En las distribuciones de Ubuntu y Debian, use el administrador de paquetes apt:

sudo apt update
sudo apt install autofs

A continuación, actualice los archivos de configuración autofs.

FILE_SHARE_NAME="<file-share-name>"

HTTP_ENDPOINT=$(az storage account show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $STORAGE_ACCOUNT_NAME \
    --query "primaryEndpoints.file" --output tsv | tr -d '"')
SMB_PATH=$(echo $HTTP_ENDPOINT | cut -c7-$(expr length $HTTP_ENDPOINT))$FILE_SHARE_NAME

echo "$FILE_SHARE_NAME -fstype=cifs,credentials=$SMB_CREDENTIAL_FILE,serverino,nosharesock,actimeo=30,mfsymlinks :$SMB_PATH" > /etc/auto.fileshares

echo "/fileshares /etc/auto.fileshares --timeout=60" > /etc/auto.master

El último paso es reiniciar el servicio autofs.

sudo systemctl restart autofs

Pasos siguientes

Consulte los vínculos siguientes para más información sobre Azure Files: