Montar o compartilhamento de arquivo do Azure via SMB no Linux

Arquivos do Azure é o sistema de arquivos de nuvem de fácil acesso da Microsoft. Os compartilhamentos de arquivos do Azure podem ser montados em distribuições do Linux usando o cliente de kernel SMB.

A maneira recomendada para montar um compartilhamento de arquivos do Azure no Linux é usando o SMB 3.1.1. Por padrão, os Arquivos do Azure exigem criptografia em trânsito, o que é compatível com o SMB 3.0+. Os Arquivos do Azure também dão suporte ao SMB 2.1, que não dá suporte à criptografia em trânsito, mas você não pode montar compartilhamentos de arquivos do Azure com o SMB 2.1 de outra região do Azure ou local, por questões de segurança. A menos que seu aplicativo exija especificamente o SMB 2.1, use o SMB 3.1.1.

Distribuição SMB 3.1.1 SMB 3.0
Versão do kernel do Linux
  • Suporte básico do 3.1.1: 4.17
  • Montagem padrão: 5.0
  • Criptografia AES-128-GCM: 5.3
  • Suporte básico do 3.0: 3.12
  • Criptografia AES-128-CCM: 4.11
Ubuntu Criptografia AES-128-GCM: 18.04.5 LTS+ Criptografia AES-128-CCM: 16.04.4 LTS+
Red Hat Enterprise Linux (RHEL)
  • Básico: 8.0+
  • Montagem padrão: 8.2+
  • Criptografia AES-128-GCM: 8.2+
7.5+
Debian Básico: 10+ Criptografia AES-128-CCM: 10+
SUSE Linux Enterprise Server Criptografia AES-128-GCM: 15 SP2+ Criptografia AES-128-CCM: 12 SP2+

Se sua distribuição do Linux não estiver listada na tabela acima, você poderá verificar a versão kernel do Linux com o comando uname:

uname -r

Observação

O suporte ao SMB 2.1 foi adicionado ao kernel do Linux versão 3.7. Se você estiver usando uma versão kernel do Linux posterior a 3.7, ela deve dar suporte ao SMB 2.1.

Aplica-se a

Tipo de compartilhamento de arquivos SMB NFS
Compartilhamentos de arquivos padrão (GPv2), LRS/ZRS Yes No
Compartilhamentos de arquivos padrão (GPv2), GRS/GZRS Yes No
Compartilhamento de arquivos premium (FileStorage), LRS/ZRS Yes No

Pré-requisitos

  • Verifique se pacote de utilitários cifs está instalado.
    O pacote cifs-utils pode ser instalado usando o gerenciador de pacotes na distribuição do Linux escolhida.

    No Ubuntu e noDebian, use o gerenciador de pacotes apt:

    sudo apt update
    sudo apt install cifs-utils
    

    No Red Hat Enterprise Linux 8+ use o gerenciador de pacotes dnf:

    sudo dnf install cifs-utils
    

    Em versões anteriores do Red Hat Enterprise Linux use o gerenciador de pacotes yum:

    sudo yum install cifs-utils 
    

    No SUSE Linux Enterprise Server, use o gerenciador de pacotes zypper:

    sudo zypper install cifs-utils
    

    Em outras distribuições, use o gerenciador de pacotes apropriado ou compile do código-fonte.

  • Use a versão mais recente da CLI (interface de linha de comando) do Azure. Para obter mais informações sobre como instalar a CLI do Azure, confira Instalar a CLI do Azure e selecione seu sistema operacional. Se preferir, você poderá usar o módulo do Azure PowerShell no PowerShell 6+. No entanto, as instruções neste artigo são para a CLI do Azure.

  • Verifique se a porta 445 está aberta: o SMB se comunica pela porta TCP 445, por isso confira se o firewall não está bloqueando as portas TCP 445 do computador cliente. Substituir <your-resource-group> e <your-storage-account>, em seguida, executar o script a seguir:

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

    Se a conexão for bem-sucedida, você verá algo semelhante à seguinte saída:

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

    Se não conseguir abrir a porta 445 em sua rede corporativa ou for impedido de fazer isso por um ISP, você poderá usar uma conexão VPN ou ExpressRoute para resolver o problema da porta 445. Para obter mais informações, confira Considerações sobre rede para acesso direto do compartilhamento de arquivo do Azure.

Montar o compartilhamento de arquivos do Azure sob demanda com montar

Quando você monta um compartilhamento de arquivos em um sistema operacional Linux, o compartilhamento de arquivos remoto é representado como uma pasta em seu sistema de arquivos local. Você pode montar compartilhamentos de arquivos em qualquer lugar do sistema. O exemplo a seguir é montado sob o caminho /mount. Você pode alterá-lo para o caminho da sua preferência modificando a variável $mntRoot.

Lembre-se de substituir <resource-group-name>, <storage-account-name> e <file-share-name> pelas informações apropriadas para o seu ambiente:

resourceGroupName="<resource-group-name>"
storageAccountName="<storage-account-name>"
fileShareName="<file-share-name>"

mntRoot="/mount"
mntPath="$mntRoot/$storageAccountName/$fileShareName"

sudo mkdir -p $mntPath

Em seguida, monte o compartilhamento de arquivos usando o comando mount. No exemplo a seguir, o comando $smbPath é preenchido usando o nome de domínio totalmente qualificado para o ponto de extremidade de arquivo da conta de armazenamento e $storageAccountKey é preenchido com a chave da conta de armazenamento.

Observação

A partir do kernel Linux versão 5.0, o SMB 3.1.1 é o protocolo negociado padrão. Se você estiver usando uma versão kernel do Linux anterior à 5.0, especifique vers=3.1.1 na lista de opções de montagem.

# This command assumes you have logged in with az login
httpEndpoint=$(az storage account show \
    --resource-group $resourceGroupName \
    --name $storageAccountName \
    --query "primaryEndpoints.file" --output tsv | tr -d '"')
smbPath=$(echo $httpEndpoint | cut -c7-${#httpEndpoint})$fileShareName

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

sudo mount -t cifs $smbPath $mntPath -o username=$storageAccountName,password=$storageAccountKey,serverino,nosharesock,actimeo=30

Você pode usar uid/gid ou dir_mode e file_mode nas opções de montagem do comando mount para definir permissões. Para obter mais informações sobre como definir permissões, consulte Notação numérica UNIX na Wikipédia.

Você também pode montar o mesmo compartilhamento de arquivos do Azure em vários pontos de montagem, se desejar. Ao terminar de usar o compartilhamento de arquivos do Azure, use sudo umount $mntPath para desmontar o compartilhamento.

Montar automaticamente compartilhamentos de arquivos

Quando você monta um compartilhamento de arquivos em um sistema operacional Linux, o compartilhamento de arquivos remoto é representado como uma pasta em seu sistema de arquivos local. Você pode montar compartilhamentos de arquivos em qualquer lugar do sistema. O exemplo a seguir é montado sob o caminho /mount. Você pode alterá-lo para o caminho da sua preferência modificando a variável $mntRoot.

mntRoot="/mount"
sudo mkdir -p $mntRoot

Para montar um compartilhamento de arquivos do Azure no Linux, use o nome da conta de armazenamento como o nome de usuário do compartilhamento de arquivos e a chave da conta de armazenamento como a senha. Como as credenciais da conta de armazenamento podem mudar ao longo do tempo, você deve armazenar as credenciais da conta de armazenamento separadamente da configuração de montagem.

O exemplo a seguir mostra como criar um arquivo para armazenar as credenciais. Lembre-se de substituir <resource-group-name> e <storage-account-name> pelas informações apropriadas para o seu ambiente.

resourceGroupName="<resource-group-name>"
storageAccountName="<storage-account-name>"

# Create a folder to store the credentials for this storage account and
# any other that you might set up.
credentialRoot="/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.
storageAccountKey=$(az storage account keys list \
    --resource-group $resourceGroupName \
    --account-name $storageAccountName \
    --query "[0].value" --output tsv | tr -d '"')

# Create the credential file for this individual storage account
smbCredentialFile="$credentialRoot/$storageAccountName.cred"
if [ ! -f $smbCredentialFile ]; then
    echo "username=$storageAccountName" | sudo tee $smbCredentialFile > /dev/null
    echo "password=$storageAccountKey" | sudo tee -a $smbCredentialFile > /dev/null
else 
    echo "The credential file $smbCredentialFile 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 $smbCredentialFile

Para montar automaticamente um compartilhamento de arquivos, você tem a opção de usar uma montagem estática por meio do utilitário /etc/fstab ou usando uma montagem dinâmica por meio do utilitário autofs.

Montagem estática com /etc/fstab

Usando o ambiente anterior, crie uma pasta para o compartilhamento de arquivos/conta de armazenamento na pasta de montagem. Substitua <file-share-name> pelo nome apropriado do seu compartilhamento de arquivos do Azure.

fileShareName="<file-share-name>"

mntPath="$mntRoot/$storageAccountName/$fileShareName"
sudo mkdir -p $mntPath

Por fim, crie um registro no arquivo /etc/fstab para o compartilhamento de arquivos do Azure. No comando a seguir, as permissões de arquivo e pasta padrão 0755 do Linux são usadas, o que significa leitura, gravação e execução para o proprietário (com base no arquivo/diretório do proprietário do Linux), leitura e execução para usuários no grupo proprietário e leitura e execução para outras pessoas no sistema. Talvez você queira definir permissões alternativas de uid e gid ou dir_mode e file_mode para montar, conforme desejado. Para obter mais informações sobre como definir permissões, consulte Notação numérica UNIX na Wikipédia.

httpEndpoint=$(az storage account show \
    --resource-group $resourceGroupName \
    --name $storageAccountName \
    --query "primaryEndpoints.file" --output tsv | tr -d '"')
smbPath=$(echo $httpEndpoint | cut -c7-${#httpEndpoint})$fileShareName

if [ -z "$(grep $smbPath\ $mntPath /etc/fstab)" ]; then
    echo "$smbPath $mntPath cifs nofail,credentials=$smbCredentialFile,serverino,nosharesock,actimeo=30" | 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 may want to double check /etc/fstab to ensure the configuration is as desired."
fi

sudo mount -a

Observação

A partir do kernel Linux versão 5.0, o SMB 3.1.1 é o protocolo negociado padrão. Você pode especificar versões alternativas de protocolo usando a opção de montagem vers (as versões de protocolo são 3.1.1, 3.0 e 2.1).

Montar dinamicamente com o autofs

Para montar dinamicamente um compartilhamento de arquivos com o utilitário autofs, instale-o usando o gerenciador de pacotes na distribuição do Linux de sua escolha.

Em distribuições Ubuntu e Debian, use o gerenciador de pacotes apt:

sudo apt update
sudo apt install autofs

No Red Hat Enterprise Linux 8+, use o gerenciador de pacotes dnf:

sudo dnf install autofs

Em versões anteriores do Red Hat Enterprise Linux use o gerenciador de pacotes yum:

sudo yum install autofs 

No SUSE Linux Enterprise Server, use o gerenciador de pacotes zypper:

sudo zypper install autofs

Em seguida, atualize os arquivos de configuração autofs.

fileShareName="<file-share-name>"

httpEndpoint=$(az storage account show \
    --resource-group $resourceGroupName \
    --name $storageAccountName \
    --query "primaryEndpoints.file" --output tsv | tr -d '"')
smbPath=$(echo $httpEndpoint | cut -c7-$(expr length $httpEndpoint))$fileShareName

echo "$fileShareName -fstype=cifs,credentials=$smbCredentialFile :$smbPath" > /etc/auto.fileshares

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

A etapa final é reiniciar o serviço autofs.

sudo systemctl restart autofs

Próximas etapas

Veja estes links para obter mais informações sobre o Arquivos do Azure: