Monter des partages de fichiers SMB Azure sur des clients Linux

Les partages de fichiers Azure peuvent être montés dans des distributions Linux à l’aide du client SMB en mode noyau.

La méthode recommandée pour monter un partage de fichiers Azure sur Linux est d’utiliser SMB 3.1.1. Par défaut, Azure Files exige un chiffrement en transit, que SMB 3.0+ prend en charge. Azure Files prend aussi en charge SMB 2.1, qui ne prend pas en charge le chiffrement en transit, mais des impératifs de sécurité peuvent vous interdire de monter des partages de fichiers Azure avec SMB 2.1 à partir d’une autre région Azure ou de votre environnement local. À moins que votre application nécessite spécifiquement SMB 2.1, utilisez SMB 3.1.1. La prise en charge de SMB 2.1 a été ajoutée au noyau Linux version 3.7. Par conséquent, si vous utilisez une version du noyau Linux après la version 3.7, elle doit prendre en charge SMB 2.1.

Distribution SMB 3.1.1 (recommandé) SMB 3.0
Version de noyau Linux
  • Prise en charge 3.1.1 de base :4.17
  • Montage par défaut : 5.0
  • Chiffrement AES-128-GCM : 5.3
  • Chiffrement AES-256-GCM : 5.10
  • Prise en charge 3.0 de base : 3.12
  • Chiffrement AES-128-CCM : 4.11
Ubuntu Chiffrement AES-128-GCM : 18.04.5 LTS+ Chiffrement AES-128-CCM : 16.04.4 LTS+
Red Hat Enterprise Linux (RHEL)
  • De base : 8.0+
  • Montage par défaut : 8.2+
  • Chiffrement AES-128-GCM : 8.2+
7.5+
Debian De base : 10+ Chiffrement AES-128-CCM : 10+
SUSE Linux Enterprise Server Chiffrement AES-128-GCM : 15 SP2+ Chiffrement AES-128-CCM : 12 SP2+

Si votre distribution Linux n’est pas indiquée dans le tableau ci-dessus, vous pouvez vérifier la version du noyau Linux à l’aide de la commande uname :

uname -r

Remarque

Tous les scripts de montage de cet article montent des partages de fichiers SMB à l’aide des autorisations de fichier et de dossier Linux 0755 par défaut. Cela signifie que la lecture, l’écriture et l’exécution pour le propriétaire du fichier/répertoire, lisent et exécutent pour les utilisateurs du groupe propriétaire, et lisent et exécutent pour d’autres utilisateurs. Selon les stratégies de sécurité de votre organisation, vous pouvez définir d’autres autorisations uid/gid ou dir_mode et file_mode dans les options de montage. Pour plus d’informations sur la façon de définir les autorisations, consultez la notation numérique UNIX.

S’applique à

Type de partage de fichiers SMB NFS
Partages de fichiers Standard (GPv2), LRS/ZRS Oui Non
Partages de fichiers Standard (GPv2), GRS/GZRS Oui Non
Partages de fichiers Premium (FileStorage), LRS/ZRS Oui Non

Prérequis

  • Vérifiez que le package cifs-utils est installé. Installez le package cifs-utils à l’aide du gestionnaire de package sur la distribution Linux de votre choix.

Sur Ubuntu et Debian, utilisez le gestionnaire de packages apt :

sudo apt update
sudo apt install cifs-utils

Sur les autres distributions, utilisez le gestionnaire de packages approprié ou effectuez une compilation à partir de la source.

  • La dernière version de l’interface de ligne de commande Azure (CLI). Pour plus d'informations sur l'installation d’Azure CLI, consultez Installer l’interface de ligne de commande Microsoft Azure et sélectionnez votre système d’exploitation. Si vous préférez utiliser le module Azure PowerShell dans PowerShell 6+, rien ne vous en empêche. Sachez cependant que les instructions de cet article s’appliquent à Azure CLI.

  • Vérifiez que le port 445 est ouvert : SMB communique sur le port TCP 445. Vérifiez que votre pare-feu ou fournisseur de services Internet ne bloque pas le port TCP 445 de la machine cliente. Remplacez <your-resource-group> et <your-storage-account>, puis exécutez le script suivant :

    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 connexion a été établie, vous devez obtenir une sortie semblable à la suivante :

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

    Si vous ne parvenez pas à ouvrir le port 445 sur votre réseau d’entreprise ou que vous n’y êtes pas autorisé par un fournisseur de services Internet, vous pouvez utiliser une connexion VPN ou ExpressRoute pour contourner le port 445. Pour plus d’informations, consultez Considérations relatives à la mise en réseau pour un accès direct à un partage de fichiers Azure.

Montage du partage de fichiers Azure à la demande avec mount

Lorsque vous montez un partage de fichiers sur un système d’exploitation Linux, votre partage de fichiers distant est représenté sous la forme d’un dossier dans votre système de fichiers local. Vous pouvez monter des partages de fichiers sur n’importe quel emplacement de votre système. L’exemple suivant monte sous le chemin d’accès /media. Vous pouvez remplacer cela par le chemin d’accès par défaut que vous souhaitez en modifiant la variable $MNT_ROOT.

Remplacez <resource-group-name>, <storage-account-name> et <file-share-name> par les informations correspondant à votre environnement :

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

Ensuite, initialisez le fichier d’informations d’identification en exécutant le script suivant.

# 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

Vous pouvez maintenant monter le partage de fichiers à l’aide de la commande mount à l’aide du fichier d’informations d’identification. Dans l’exemple suivant, la commande $SMB_PATH est remplie à l’aide du nom de domaine complet du point de terminaison de fichier du compte de stockage.

Notes

À partir de la version 5.0 du noyau Linux, SMB 3.1.1 est le protocole négocié par défaut. Si vous utilisez une version du noyau Linux antérieure à 5.0, spécifiez vers=3.1.1 dans la liste d’options de montage.

# 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

Vous pouvez également monter le même partage de fichiers Azure sur plusieurs points de montage, si vous le souhaitez. Quand vous avez terminé d’utiliser le partage de fichiers Azure, utilisez sudo umount $mntPath pour démonter le partage.

Monter automatiquement les partages de fichiers

Lorsque vous montez un partage de fichiers sur un système d’exploitation Linux, votre partage de fichiers distant est représenté sous la forme d’un dossier dans votre système de fichiers local. Vous pouvez monter des partages de fichiers sur n’importe quel emplacement de votre système. L’exemple suivant monte sous le chemin d’accès /media. Vous pouvez remplacer cela par le chemin d’accès par défaut que vous souhaitez en modifiant la variable $MNT_ROOT.

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

Pour monter un partage de fichiers Azure sur Linux, utilisez le nom du compte de stockage comme nom d’utilisateur du partage de fichiers et la clé du compte de stockage comme mot de passe. Puisque les informations d’identification du compte de stockage peuvent changer au fil du temps, vous devez stocker les informations d’identification du compte de stockage séparément de la configuration de montage.

L’exemple suivant montre comment créer un fichier pour stocker les informations d’identification. N’oubliez pas de remplacer <resource-group-name> et <storage-account-name> par les informations correspondant à votre environnement.

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

Pour monter automatiquement un partage de fichiers, vous avez le choix entre l’utilisation d’un montage statique via l’utilitaire /etc/fstab ou l’utilisation d’un montage dynamique via l’utilitaire autofs.

Montage statique avec /etc/fstab

À l’aide de l’environnement précédent, créez un dossier pour votre compte de stockage/partage de fichiers dans votre dossier de montage. Remplacez <file-share-name> par le nom approprié de votre partage de fichiers Azure.

FILE_SHARE_NAME="<file-share-name>"

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

Enfin, créez un enregistrement dans le fichier /etc/fstab de votre partage de fichiers Azure. Dans la commande ci-dessous, le fichier Linux 0755 et les autorisations de dossier par défaut sont utilisés, ce qui signifie lecture, écriture et exécution pour le propriétaire (en fonction du propriétaire Linux des fichiers/répertoires), lecture et exécution pour les utilisateurs du groupe propriétaire, et lecture et exécution pour les autres utilisateurs du système. Vous pouvez définir d’autres autorisations uid et gid ou dir_mode et file_mode sur le montage comme vous le souhaitez. Pour plus d’informations sur la façon de définir les autorisations, consultez la notation numérique UNIX.

Conseil

Si vous souhaitez que les conteneurs Docker exécutant des applications .NET Core puissent écrire dans le partage de fichiers Azure, incluez nobrl dans les options de montage SMB pour éviter d’envoyer des demandes de verrouillage de plage d’octets au serveur.

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

Notes

À partir de la version 5.0 du noyau Linux, SMB 3.1.1 est le protocole négocié par défaut. Vous pouvez spécifier d’autres versions de protocole à l’aide de l’option de montage vers (les versions de protocole sont 3.1.1, 3.0 et 2.1).

Montage dynamique avec autofs

Pour monter un partage de fichiers de manière dynamique avec l’utilitaire autofs, installez-le à l’aide du gestionnaire de package sur la distribution Linux de votre choix.

Sur les distributions Ubuntu et Debian, utilisez le gestionnaire de packages apt :

sudo apt update
sudo apt install autofs

Ensuite, mettez à jour les fichiers de configuration 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

La dernière étape consiste à redémarrer le service autofs.

sudo systemctl restart autofs

Étapes suivantes

Consultez ces liens pour en savoir plus sur Azure Files :