Поделиться через


Монтирование общих ресурсов Azure SMB на клиентах Linux

Файловые ресурсы Azure можно подключить в дистрибутивах Linux с помощью SMB-клиента в ядре.

В этой статье показано, как подключить файловый ресурс SMB Azure с помощью аутентификации NTLMv2 (ключ учетной записи хранения). Использование проверки подлинности на основе удостоверений предпочтительнее по соображениям безопасности. См. Включение проверки подлинности Active Directory через SMB для клиентов Linux, использующих доступ к файлам Azure.

Применяется к

Модель управления Модель выставления счетов Уровень медиа Избыточность малый и средний бизнес NFS
Microsoft.Storage Настроенная версия 2 HDD (стандартный) Локальное (LRS) Да Нет
Microsoft.Storage Настроенная версия 2 HDD (стандартный) Зона (ZRS) Да Нет
Microsoft.Storage Настроенная версия 2 HDD (стандартный) Гео (GRS) Да Нет
Microsoft.Storage Настроенная версия 2 HDD (стандартный) GeoZone (GZRS) Да Нет
Microsoft.Storage Настроенная версия v1 SSD (премиум) Локальное (LRS) Да Нет
Microsoft.Storage Настроенная версия v1 SSD (премиум) Зона (ZRS) Да Нет
Microsoft.Storage Оплата по мере использования HDD (стандартный) Локальное (LRS) Да Нет
Microsoft.Storage Оплата по мере использования HDD (стандартный) Зона (ZRS) Да Нет
Microsoft.Storage Оплата по мере использования HDD (стандартный) Гео (GRS) Да Нет
Microsoft.Storage Оплата по мере использования HDD (стандартный) GeoZone (GZRS) Да Нет

Протоколы

По умолчанию служба "Файлы Azure" применяет шифрование при передаче. Шифрование SMB доступно начиная с SMB 3.0. Файлы Azure также поддерживают SMB 2.1, что не поддерживает шифрование SMB. В результате файлы Azure не позволяют подключать общие папки с помощью SMB 2.1 из другого региона Azure или локальной среды без дополнительной конфигурации сети по соображениям безопасности. Следует использовать SMB 3.1.1, если приложение не требует более старой версии.

Распределение SMB 3.1.1 (рекомендуется) SMB 3.0
Версия ядра Linux
  • Базовая поддержка 3.1.1: 4.17
  • Точка монтирования по умолчанию: 5.0
  • Шифрование AES 128 GCM: 5.3
  • Шифрование AES-256-GCM: 5.10
  • Базовая поддержка 3.0: 3.12
  • Шифрование AES-128-CCM: 4.11
Ubuntu Шифрование AES 128 GCM: 18.04.5 LTS+ Шифрование AES-128-CCM: 16.04.4 LTS+
Red Hat Enterprise Linux (RHEL)
  • Базовый: 8.0+
  • Установка по умолчанию: 8.2+
  • Шифрование AES 128 GCM: 8.2+
7.5 или выше
Debian Базовый: 10+ Шифрование AES-128-CCM: 10+
SUSE Linux Enterprise Server Шифрование AES 128 GCM: 15 SP2+ Шифрование AES 128 CCM: 12 SP2+

Если дистрибутив Linux не указан в таблице, можно проверить версию ядра Linux с помощью команды #D0:

uname -r

Предварительные условия

  • Убедитесь, что установлен пакет cifs-utils. Установите последнюю версию пакета cifs-utils с помощью диспетчера пакетов в выбранном дистрибутиве Linux.

В Ubuntu и Debian используйте apt диспетчер пакетов:

sudo apt update
sudo apt install cifs-utils

В других дистрибутивах используйте соответствующий диспетчер пакетов или выполните компиляцию из источника.

  • Самая последняя версия интерфейса командной строки (CLI) Azure. Дополнительные сведения об установке Azure CLI см. в статье Установка Azure CLI и выберите операционную систему. Если вы предпочитаете использовать модуль Azure PowerShell в PowerShell 6+, вы можете использовать его. Однако инструкции, описанные в этой статье, предназначены для Azure CLI.

  • Убедитесь, что порт 445 открыт: SMB взаимодействует через TCP-порт 445. Убедитесь, что брандмауэр или isP не блокирует TCP-порт 445 с клиентского компьютера. Замените <your-resource-group> и <your-storage-account> запустите следующий скрипт:

    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
    

    Если подключение было успешным, отобразятся следующие выходные данные.

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

    Vpn-подключение или ExpressRoute можно использовать, если порт 445 заблокирован в сети. Дополнительные сведения см. в разделе Рекомендации по работе с сетями для прямого доступа к общей папке Azure.

Разрешения

Все сценарии монтирования в этой статье монтируют общие файлы с использованием файловых и папочных разрешений Linux по умолчанию 0755. Это означает, что владелец файла или каталога имеет права на чтение, запись и выполнение, пользователи в группе владельца имеют права на чтение и выполнение, а остальные пользователи — на чтение и выполнение. В зависимости от политик безопасности организации может потребоваться задать альтернативные uid/gid или dir_modefile_mode разрешения в параметрах подключения. Дополнительные сведения о настройке разрешений см. в разделе символьная нотация Unix. Посмотрите опции монтирования для списка опций монтирования.

Поддержка разрешений в стиле Unix

Вы также можете получить поддержку разрешений в стиле Unix для общих папок SMB Azure, используя клиентское управление доступом и добавление modefromsid,idsfromsid параметров монтирования в вашу команду подключения. Чтобы это работало, выполните указанные ниже действия.

  • Все клиенты, обращающиеся к общему ресурсу, должны подключаться с помощью modefromsid,idsfromsid
  • Идентификаторы пользовательского интерфейса или GID должны быть универсальными для всех клиентов.
  • Клиенты должны работать с одним из следующих поддерживаемых дистрибутивов Linux: Ubuntu 20.04+, SLES 15 с пакетом обновления 3 (SP3)

Подключайте файловый ресурс Azure по требованию с помощью монтирования.

При подключении общей папки в ОС Linux удаленный файловый ресурс будет представлен в виде папки в локальной файловой системе. Общие файловые ресурсы можно подключить в любом месте на вашей системе. В следующем примере показано подключение по пути /media. Вы можете изменить его на нужный путь, поменяв переменную $MNT_ROOT.

Замените <resource-group-name>, <storage-account-name> и <file-share-name> соответствующей информацией из своей среды:

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

Затем инициализировать файл учетных данных, выполнив следующий скрипт.

# 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

Теперь вы можете подключить общую папку с помощью команды mount и файла учетных данных. В следующем примере команда $SMB_PATH заполняется с использованием полного доменного имени для файловой конечной точки учетной записи хранения. Смотрите параметры монтирования для списка параметров монтирования SMB.

Примечание.

Начиная с версии ядра Linux 5.0, SMB 3.1.1 является согласованным протоколом по умолчанию. Если вы используете версию ядра Linux старше 5.0, укажите vers=3.1.1 в списке параметров подключения.

# 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

При необходимости можно подключить одну и ту же общую папку Azure к нескольким точкам подключения.

Когда вы закончите использовать общую папку Azure, используйте sudo umount $mntPath для отключения общей папки.

Автоматически подключать общие папки

При подключении общей папки в ОС Linux удаленный файловый ресурс будет представлен в виде папки в локальной файловой системе. Общие файловые ресурсы можно подключить в любом месте на вашей системе. В следующем примере показано подключение по пути /media. Вы можете изменить его на нужный путь, поменяв переменную $MNT_ROOT.

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

Используйте имя учетной записи хранения в качестве имени пользователя общей папки и ключа учетной записи хранения в качестве пароля. Так как учетные данные учетной записи хранения могут меняться со временем, следует хранить учетные данные для учетной записи хранения отдельно от конфигурации подключения.

В следующем примере показано, как создать файл для хранения учетных данных. Не забудьте заменить <resource-group-name> и <storage-account-name> на соответствующую информацию из вашей среды.

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

Чтобы автоматически подключить общую папку, можно воспользоваться статическим подключением через служебную программу /etc/fstab или использовать динамическое подключение через служебную программу autofs.

Статическое подключение с помощью /etc/fstab

Используя более раннюю среду, создайте папку для учетной записи хранения данных или общего доступа в папке монтирования. Замените <file-share-name> на соответствующее имя общей папки Azure.

FILE_SHARE_NAME="<file-share-name>"

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

Наконец, создайте запись в файле /etc/fstab для файлового обмена Azure. В приведенной ниже команде по умолчанию использованы разрешения для файлов и папок Linux 0755, что означает права на чтение, запись и выполнение для владельца (имеется в виду владелец файла/каталога Linux), права на чтение и выполнение для пользователей в группе владельца, а также права на чтение и выполнение для прочих пользователей системы. Возможно, вы хотите задать альтернативные разрешения uid и gid или dir_mode и file_mode на подключение по мере необходимости. Дополнительные сведения о настройке разрешений см. в разделе Числовая нотация UNIX. Смотрите параметры монтирования для списка параметров монтирования SMB.

Совет

Если вы хотите, чтобы контейнеры Docker под управлением приложений .NET Core могли записывать данные в общую папку Azure, включите nobrl в параметры подключения SMB, чтобы избежать отправки запросов на блокировку диапазона байтов на сервер.

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

Примечание.

Начиная с версии ядра Linux 5.0, SMB 3.1.1 является согласованным протоколом по умолчанию. Можно указать альтернативные версии протокола с помощью параметра подключения vers (версии протокола: 3.1.1, 3.0 и 2.1).

Динамическое подключение с помощью autofs

Чтобы динамически подключить сетевую папку с помощью служебной программы autofs, установите её с помощью диспетчера пакетов в дистрибутиве Linux на ваш выбор.

В дистрибутивах Ubuntu и Debian используйте apt диспетчер пакетов:

sudo apt update
sudo apt install autofs

Затем обновите файлы конфигурации autofs. Смотрите параметры монтирования для списка параметров монтирования SMB.

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

Последним шагом является перезапуск службы autofs.

sudo systemctl restart autofs

Параметры подключения

При монтировании SMB Azure файловых хранилищ в Linux можно использовать следующие параметры монтирования.

Опция монтирования Рекомендуемое значение Description
username= Имя учетной записи хранилища Обязательно для проверки подлинности NTLMv2.
password= Первичный ключ учетной записи хранения Обязательно для проверки подлинности NTLMv2.
password2= Дополнительный ключ учетной записи хранения Рекомендуется в случае, если желательна смена ключей без простоя.
mfsymlinks Н/Д Рекомендуется. Принудительное монтирование с поддержкой символьных ссылок, что позволяет приложениям, таким как git, клонировать репозитории, содержащие символические ссылки.
actimeo= 30-60 Рекомендуется. Время (в секундах), которое клиент CIFS кэширует атрибуты файла или каталога перед запросом сведений о атрибутах с сервера. Использование значения ниже 30 секунд может привести к снижению производительности, так как кэши атрибутов для файлов и каталогов истекают слишком быстро. Рекомендуется задать actimeo от 30 до 60 секунд.
nosharesock Н/Д Необязательно. Заставляет клиента всегда создавать новое подключение к серверу, даже если у него есть существующее подключение к SMB. Это может повысить производительность, так как каждая точка подключения использует другой сокет TCP. В некоторых случаях nosharesock может снизить производительность из-за отсутствия кэширования одного и того же файла при его открытии с двух монтирований с одного клиента.
max_channels= 4 Рекомендуется при использовании SMB Multichannel. Указывает максимальное количество каналов (сетевых подключений) к общей папке. Использование SMB Multichannel с более чем четырьмя каналами приводит к снижению производительности.
remount Н/Д Перемонтирует общий ресурс и изменяет параметры монтирования, если указаны. Используйте опцию password2 в случаях, когда требуется указать альтернативный пароль, чтобы исправить истекший пароль после изначального монтирования.
nobrl Н/Д Рекомендуется в сценариях с одним клиентом, когда требуются блокировки рекомендаций. Файлы Azure не поддерживает блокировки рекомендаций, и этот параметр предотвращает отправку запросов на блокировку диапазона байтов на сервер.
snapshot= Время Подключите определенный моментальный снимок общей папки. Время должно быть положительным целым числом, определяющим запрошенный моментальный снимок (в единицах, равных 100 наносекундам, прошедших с 1 января 1601 г.), или же его можно указать, используя формат GMT, например, @GMT-2024.03.27-20.52.19).
closetimeo= 5 Настраивает отложенное время ожидания закрытия (обработчик кэша) в секундах или отключает его, установив значение 0. Значение по умолчанию — 5 секунд.
nostrictsync не применимо Не просите сервер выполнять сброс при fsync(). Некоторые серверы выполняют не буферизируемые записи по умолчанию, в этом случае очистка является избыточной. Этот параметр может повысить производительность рабочих нагрузок, в которых клиент выполняет много небольших сочетаний записи и fsync, а задержка в сети значительно выше, чем задержка сервера.
multiuser Н/Д Сопоставление доступа пользователей к отдельным учетным данным при доступе к серверу. По умолчанию CIFS использует только один набор учетных данных пользователя (учетные данные монтирования) при доступе к общей папке. Вместо этого с помощью данного параметра клиент создает новый сеанс с сервером, используя учетные данные пользователя всякий раз, когда новый пользователь обращается к точке монтирования. Дополнительные доступы к этим пользователям также используют эти учетные данные. Так как ядро не может запрашивать пароли, многопользовательские подключения ограничены подключениями с помощью sec= параметров, которые не требуют паролей.
cifsacl Н/Д Этот параметр используется для сопоставления списков управления доступом CIFS/NTFS с битами разрешений Linux, сопоставления идентификаторов SID и идентификаторов uiD и GID, а также получения и задания дескрипторов безопасности. Поддерживается только для проверки подлинности NTLMv2.
idsfromsid,modefromsid Н/Д Рекомендуется, когда клиенту необходимо выполнить авторизацию, осуществляемую самим клиентом. Включает разрешения в стиле Unix. Работает только в том случае, если идентификаторы пользовательского интерфейса или GID являются универсальными для всех клиентов. Поддерживается только для проверки подлинности NTLMv2.
sec= krb5 Требуется для аутентификации Kerberos. Чтобы включить режим безопасности Kerberos, установите флажок sec=krb5. При использовании этого параметра необходимо не указывать имя пользователя и пароль. Клиент Linux должен быть присоединен к домену. См. раздел Включение аутентификации Active Directory через SMB для клиентов Linux.
uid= 0 Необязательно. Задает идентификатор пользователя, который будет владельцем всех файлов или каталогов в подключенной файловой системе, если сервер не предоставляет информацию о владельце. Его можно указать как имя пользователя, так и числовой идентификатор пользователя. Если значение не указано, значение по умолчанию равно 0.
gid= 0 Необязательно. Задает gid, который владеет всеми файлами или каталогами в подключенной файловой системе, если сервер не предоставляет сведения о собственности. Его можно указать либо как имя группы, либо как числовой идентификатор группы. Если значение не указано, значение по умолчанию равно 0.
file_mode= Н/Д Необязательно. Если сервер не поддерживает расширения CIFS Unix, это переопределяет режим файлов по умолчанию.
dir_mode= Н/Д Необязательно. Если сервер не поддерживает расширения CIFS Unix, это переопределяет режим по умолчанию для каталогов.
handletimeout= Н/Д Необязательно. Время (в миллисекундах), в течение которого сервер должен резервировать дескриптор файла после переключения на резервный, ожидая повторного подключения клиента.

Следующий шаг

Дополнительные сведения об использовании общих папок SMB Azure с Linux см. в следующей статье: