Montare condivisioni file di Azure SMB nei client Linux

Le condivisioni file di Azure possono essere montate nelle distribuzioni Linux usando il client del kernel SMB.

Il modo consigliato per montare una condivisione file di Azure in Linux è usare SMB 3.1.1. Per impostazione predefinita, File di Azure richiede la crittografia in transito, supportata da SMB 3.0+. File di Azure supporta anche SMB 2.1, che non supporta la crittografia in transito. Tuttavia, per motivi di sicurezza, non è possibile montare le condivisioni file di Azure con SMB 2.1 da un'altra area di Azure o in locale. A meno che l'applicazione non richieda in modo specifico SMB 2.1, usare SMB 3.1.1. Il supporto per SMB 2.1 è stato aggiunto alla versione 3.7 del kernel Linux. Se si usa una versione del kernel Linux successiva alla 3.7, dovrebbe quindi supportare SMB 2.1.

Distribuzione SMB 3.1.1 (scelta consigliata) SMB 3.0
Versione del kernel Linux
  • Supporto di base 3.1.1: 4.17
  • Montaggio predefinito: 5.0
  • Crittografia AES-128-GCM: 5.3
  • Crittografia AES-256-GCM: 5.10
  • Supporto di base 3.0: 3.12
  • Crittografia AES-128-CCM: 4.11
Ubuntu Crittografia AES-128-GCM: 18.04.5 LTS+ Crittografia AES-128-CCM: 16.04.4 LTS+
Red Hat Enterprise Linux (RHEL)
  • Basic: 8.0+
  • Montaggio predefinito: 8.2+
  • Crittografia AES-128-GCM: 8.2+
7.5+
Debian Basic: 10+ Crittografia AES-128-GCM: 10+
SUSE Linux Enterprise Server Crittografia AES-128-GCM: 15 SP2+ Crittografia AES-128-GCM: 12 SP2+

Se la distribuzione di Linux non è elencata nella tabella precedente, è possibile controllare la versione del kernel Linux con il comando uname:

uname -r

Nota

Tutti gli script di montaggio in questo articolo monteranno le condivisioni file SMB usando le autorizzazioni predefinite per file e cartelle Linux 0755, ovvero lettura, scrittura ed esecuzione per il proprietario di file/directory, lettura ed esecuzione per gli utenti del gruppo proprietario e lettura ed esecuzione per gli altri utenti. In base ai criteri di sicurezza dell'organizzazione, è possibile impostare autorizzazioni uid/gid alternative o dir_mode e file_mode nelle opzioni di montaggio. Per altre informazioni su come impostare le autorizzazioni, vedere Notazione numerica UNIX.

Si applica a

Tipo di condivisione file SMB NFS
Condivisioni file Standard (GPv2), archiviazione con ridondanza locale/archiviazione con ridondanza della zona Sì No
Condivisioni file Standard (GPv2), archiviazione con ridondanza geografica/archiviazione con ridondanza geografica della zona Sì No
Condivisioni file Premium (FileStorage), archiviazione con ridondanza locale/archiviazione con ridondanza della zona Sì No

Prerequisiti

  • Assicurarsi che il pacchetto cifs-utils venga installato. Installare il pacchetto cifs-utils tramite il sistema di gestione pacchetti nella distribuzione Linux scelta.

In Ubuntu e Debian usare il sistema di gestione pacchetti apt:

sudo apt update
sudo apt install cifs-utils

In altre distribuzioni usare l'utilità di gestione dei pacchetti appropriata o compilare il codice sorgente.

  • La versione più recente dell'interfaccia della riga di comando di Azure. Per altre informazioni su come installare l'interfaccia della riga di comando di Azure, vedere Installare l'interfaccia della riga di comando di Azure e selezionare il sistema operativo in uso. Se si preferisce, è anche possibile usare il modulo Azure PowerShell in PowerShell 6+, ma le istruzioni riportate in questo articolo fanno riferimento all'interfaccia della riga di comando di Azure.

  • Assicurarsi che la porta 445 sia aperta: SMB comunica tramite la porta TCP 445. Verificare che il firewall o il provider di servizi internet non blocchi la porta TCP 445 del computer client. Sostituire <your-resource-group> e <your-storage-account>, quindi eseguire lo script seguente:

    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
    

    Se la connessione ha avuto esito positivo, verrà visualizzato un risultato simile all'output seguente:

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

    Se non è possibile aprire la porta 445 nella rete aziendale o il provider di servizi Internet ne impedisce questo tipo di operazione, è possibile usare una connessione VPN o ExpressRoute per aggirare la porta 445. Per maggiori informazioni, consultare la sezione Considerazioni sulla rete per l'accesso diretto alla condivisione file di Azure.

Montare la condivisione file di Azure su richiesta con il comando mount

Quando si monta una condivisione file in un sistema operativo Linux, la condivisione file remota viene rappresentata come una cartella nel file system locale. È possibile montare condivisioni file in qualsiasi punto del sistema. Nell'esempio seguente il montaggio viene eseguito nel percorso /media. È possibile passare al percorso preferito modificando la variabile $MNT_ROOT.

Sostituire <resource-group-name>, <storage-account-name> e <file-share-name> con le informazioni appropriate per l'ambiente:

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

Inizializzare quindi il file delle credenziali eseguendo lo script seguente.

# 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

È ora possibile montare la condivisione file usando il comando mount e il file delle credenziali. Nell'esempio seguente il comando $SMB_PATH viene popolato usando il nome di dominio completo per l'endpoint file dell'account di archiviazione.

Nota

A partire dal kernel Linux versione 5.0, SMB 3.1.1 è il protocollo negoziato predefinito. Se si usa una versione del kernel Linux precedente alla 5.0, specificare vers=3.1.1 nell'elenco delle opzioni di montaggio.

# 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

È anche possibile montare la stessa condivisione file di Azure in più punti di montaggio, se necessario. Dopo aver usato la condivisione file di Azure, è possibile usare sudo umount $mntPath per smontarla.

Montare le condivisioni file automaticamente

Quando si monta una condivisione file in un sistema operativo Linux, la condivisione file remota viene rappresentata come una cartella nel file system locale. È possibile montare condivisioni file in qualsiasi punto del sistema. Nell'esempio seguente il montaggio viene eseguito nel percorso /media. È possibile passare al percorso preferito modificando la variabile $MNT_ROOT.

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

Per montare una condivisione file di Azure in Linux, usare il nome dell'account di archiviazione come nome utente della condivisione file e la chiave dell'account di archiviazione come password. Poiché le credenziali dell'account di archiviazione potrebbero cambiare nel tempo, è necessario archiviare le credenziali per l'account di archiviazione separatamente dalla configurazione di montaggio.

Nell'esempio seguente viene illustrato come creare un file per archiviare le credenziali. Ricordare di sostituire <resource-group-name> e <storage-account-name> con le informazioni appropriate per l'ambiente.

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

Per montare automaticamente una condivisione file, è possibile scegliere tra l'uso di un montaggio statico tramite l'utilità /etc/fstab o l'uso di un montaggio dinamico tramite l'utilità autofs.

Montaggio statico con /etc/fstab

Usando l'ambiente precedente, creare una cartella per l'account di archiviazione o la condivisione file nella cartella di montaggio. Sostituire <file-share-name> con il nome appropriato della condivisione file di Azure.

FILE_SHARE_NAME="<file-share-name>"

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

Infine, creare un record nel file /etc/fstab per la condivisione file di Azure. Nel comando seguente vengono usate le autorizzazioni predefinite per file e cartelle Linux 0755, ovvero lettura, scrittura ed esecuzione per il proprietario (in base al proprietario di file/directory Linux), lettura ed esecuzione per gli utenti nel gruppo proprietario e lettura ed esecuzione per altri utenti del sistema. È possibile impostare autorizzazioni uid e gid o dir_mode e file_mode alternative per il montaggio in base alle esigenze. Per altre informazioni su come impostare le autorizzazioni, vedere Notazione numerica UNIX.

Suggerimento

Se si vuole che i contenitori Docker che eseguono applicazioni .NET Core possano scrivere nella condivisione file di Azure, includere nobrl nelle opzioni di montaggio SMB per evitare l'invio di richieste di blocco dell'intervallo di byte al server.

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 partire dal kernel Linux versione 5.0, SMB 3.1.1 è il protocollo negoziato predefinito. È possibile specificare versioni di protocollo alternative usando l'opzione di montaggio vers (le versioni del protocollo sono 3.1.1, 3.0 e 2.1).

Eseguire il montaggio dinamico con autofs

Per montare dinamicamente una condivisione file con l'utilità autofs, installarla usando la gestione pacchetti nella distribuzione Linux di propria scelta.

Nelle distribuzioni basate su Ubuntu e Debian usare il sistema di gestione pacchetti apt:

sudo apt update
sudo apt install autofs

Aggiornare quindi i file di configurazione 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

Il passaggio finale consiste nel riavvio del servizio autofs.

sudo systemctl restart autofs

Passaggi successivi

Per altre informazioni su File di Azure, vedere i collegamenti seguenti: