Azure ファイル共有は、SMB カーネル クライアントを使用して Linux ディストリビューションにマウントできます。
この記事では、NTLMv2 認証 (ストレージ アカウント キー) を使用して SMB Azure ファイル共有をマウントする方法を示します。 セキュリティ上の理由から、ID ベースの認証を使用することをお勧めします。 「Azure Files にアクセスする Linux クライアントに対して SMB 経由の Active Directory 認証を有効にする」を参照してください。
適用対象
管理モデル | 課金モデル | メディア階層 | 冗長性 | 中小企業 | ネットワークファイルシステム(NFS) |
---|---|---|---|---|---|
Microsoft.Storage | プロビジョニング済み v2 | HDD (標準) | ローカル (LRS) |
![]() |
![]() |
Microsoft.Storage | プロビジョニング済み v2 | HDD (標準) | ゾーン (ZRS) |
![]() |
![]() |
Microsoft.Storage | プロビジョニング済み v2 | HDD (標準) | ジオ (GRS) |
![]() |
![]() |
Microsoft.Storage | プロビジョニング済み v2 | HDD (標準) | ジオゾーン (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 (標準) | ジオゾーン (GZRS) |
![]() |
![]() |
プロトコル
既定では、Azure Files は転送中の暗号化を強制します。 SMB 暗号化は、SMB 3.0 以降で使用できます。 Azure Files では SMB 2.1 もサポートされていますが、SMB 暗号化はサポートされていません。 その結果、セキュリティ上の理由から、Azure Files では、セキュリティ上の理由から、追加のネットワーク構成なしで、別の Azure リージョンまたはオンプレミスから SMB 2.1 を使用してファイル共有をマウントすることはできません。 アプリケーションで特に古いバージョンが必要な場合を除き、SMB 3.1.1 を使用する必要があります。
配布 | SMB 3.1.1 (推奨) | SMB 3.0 |
---|---|---|
Linux カーネル バージョン |
|
|
Ubuntu | AES-128-GCM 暗号化: 18.04.5 LTS 以上 | AES-128-CCM 暗号化: 16.04.4 LTS 以上 |
Red Hat Enterprise Linux (RHEL) |
|
7.5+ |
デビアン | 基本: 10 以上 | AES-128-CCM 暗号化: 10 以上 |
SUSE Linux Enterprise Server | AES-128-GCM 暗号化: 15 SP2 以上 | AES-128-CCM 暗号化: 12 SP2 以上 |
お使いの Linux ディストリビューションが表にない場合は、 uname
コマンドで Linux カーネルのバージョンを確認できます。
uname -r
前提条件
- cifs-utils パッケージがインストールされていることを確認します。任意の Linux ディストリビューションに、パッケージ マネージャーを使用して cifs-utils パッケージの最新バージョンをインストールします。
Ubuntu と Debian では、apt
パッケージ マネージャーを使用します。
sudo apt update
sudo apt install cifs-utils
他のディストリビューションでは、適切なパッケージ マネージャーを使用するか、ソースからコンパイルします。
Azure コマンド ライン インターフェイス (CLI) の最新バージョン。 Azure CLI をインストールする方法の詳細については、Azure CLI のインストールに関するページを参照し、ご利用のオペレーティング システムを選択してください。 PowerShell 6 以降で Azure PowerShell モジュールを使用することは可能ですが、この記事の手順は 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!
ネットワーク上でポート 445 がブロックされている場合は、VPN 接続または ExpressRoute を使用できます。 詳細については、直接の Azure ファイル共有アクセスのネットワークに関する考慮事項に関するページを参照してください。
アクセス許可
この記事のすべてのマウント スクリプトは、既定の 0755 Linux ファイルとフォルダーのアクセス許可を使用してファイル共有をマウントします。 これは、ファイルとディレクトリの所有者の場合は読み取り、書き込み、実行、所有者グループ内のユーザーの場合は読み取りと実行、他のユーザーの場合は読み取りと実行を意味します。 組織のセキュリティ ポリシーによっては、マウント オプションで代替の uid
/gid
または dir_mode
および file_mode
アクセス許可を設定することもできます。 アクセス許可を設定する方法の詳細については、UNIX シンボリック表記に関するページを参照してください。 マウント オプションの一覧については、「マウント オプション」を参照してください。
Unix スタイルのパーミッションのサポート
また、クライアントによるアクセス制御を使用し、マウント コマンドに modefromsid,idsfromsid
マウント オプションを追加することで、SMB Azure ファイル共有に対する Unix スタイルのアクセス許可のサポートを取得することもできます。 これを機能させるには、次の操作を行います。
- 共有にアクセスするすべてのクライアントは、
modefromsid,idsfromsid
- UID/GID は、すべてのクライアントで均一である必要があります
- クライアントは、サポートされている Linux ディストリビューション Ubuntu 20.04+、SLES 15 SP3+ のいずれかを実行している必要があります。
Azure ファイル共有を mount を使用してオンデマンドでマウントする
Linux OS でファイル共有をマウントすると、リモートのファイル共有がローカル ファイル システム内のフォルダーとして表示されます。 ファイル共有は、システム上の任意の場所にマウントできます。 次の例では、/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 です。 5\.0 より前のバージョンの Linux カーネルを使用する場合は、mount のオプション リストに 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 OS でファイル共有をマウントすると、リモートのファイル共有がローカル ファイル システム内のフォルダーとして表示されます。 ファイル共有は、システム上の任意の場所にマウントできます。 次の例では、/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
最後に、Azure ファイル共有のレコードを /etc/fstab
ファイルに作成します。 次のコマンドでは、Linux のファイルとフォルダーに既定のアクセス許可である 0755 が使用されています。これは、所有者 (ファイルまたはディレクトリの Linux 所有者に基づく) には読み取り、書き込み、および実行が、所有者グループのユーザーには読み取りおよび実行が、システム上の他のユーザーには読み取りおよび実行が許可されることを意味します。 必要に応じて、マウント時に代替の uid
と gid
または dir_mode
と file_mode
のアクセス許可を設定できます。 アクセス許可を設定する方法の詳細については、UNIX の数値表記に関する記事を参照してください。 SMB マウント オプションの一覧については、「マウント オプション」を参照してください。
ヒント
.NET Core アプリケーションを実行する Docker コンテナーが Azure ファイル共有に書き込めるようにする場合は、SMB マウント オプションに nobrl を含め、バイト範囲ロック要求をサーバーに送信しないようにします。
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
マウント オプション
Linux で SMB Azure ファイル共有をマウントする場合は、次のマウント オプションを使用できます。
マウント オプション | 推奨値 | 説明 |
---|---|---|
username= |
ストレージ アカウント名 | NTLMv2 認証には必須です。 |
password= |
ストレージ アカウントの主キー | NTLMv2 認証には必須です。 |
password2= |
ストレージ アカウントのセカンダリ キー | ダウンタイムのないキーローテーションが望ましい場合に推奨されます。 |
mfsymlinks |
該当なし | 推奨要件。 シンボリック リンクをサポートするようにマウントを強制し、git などのアプリケーションでシンボリック リンクを使用してリポジトリを複製できるようにします。 |
actimeo= |
30-60 | 推奨要件。 CIFS クライアントがサーバーから属性情報を要求するまでにファイルまたはディレクトリの属性をキャッシュする時間 (秒単位)。 30 秒未満の値を使用すると、ファイルおよびディレクトリ用の属性キャッシュの有効期限切れが早すぎるため、パフォーマンスが低下する場合があります。
actimeo は 30 から 60 秒の間で設定することをお勧めします。 |
nosharesock |
該当なし | 省略可能。 SMB マウントへの既存の接続がある場合でも、クライアントは常にサーバーに新しい接続を確立するように強制します。 これにより、各マウント・ポイントが異なるTCPソケットを使用するため、パフォーマンスを向上させることができます。 場合によっては、nosharesock は、同じクライアントから 2 つのマウントから開いたときに同じファイルをキャッシュされないため、パフォーマンスが低下する可能性があります。 |
max_channels= |
4 | SMB マルチチャネルを使用する場合に推奨されます。 ファイル共有へのチャネル (ネットワーク接続) の最大数を指定します。 SMB マルチチャネルを 4 つ以上のチャネルで使用すると、パフォーマンスが低下します。 |
remount |
該当なし | ファイル共有を再マウントし、指定した場合はマウント オプションを変更します。 元のマウント後に期限切れのパスワードを修正する代替パスワードを指定する場合は、password2 オプションと共に使用します。 |
nobrl |
該当なし | アドバイザリ ロックが必要な場合は、単一クライアントのシナリオで推奨されます。 Azure Files はアドバイザリ ロックをサポートしていないため、この設定により、バイト範囲ロック要求がサーバーに送信されません。 |
snapshot= |
時間 | ファイル共有の特定のスナップショットをマウントします。 時間は、要求されたスナップショットを識別する正の整数である必要があります (1601 年 1 月 1 日以降に経過した 100 ナノ秒単位、または GMT 形式 (例: @GMT-2024.03.27-20.52.19)) で指定することもできます)。 |
closetimeo= |
5 | 遅延終了タイムアウト (ハンドル キャッシュ) を秒単位で構成するか、0 に設定して無効にします。 既定値は 5 秒です。 |
nostrictsync |
該当なし | fsync() でフラッシュするようにサーバーに要求しないでください。 一部のサーバーでは、既定でバッファリングされない書き込みが実行され、その場合、フラッシュは不要になります。 このオプションを使用すると、クライアントが多数の小さな書き込み + fsync の組み合わせを実行し、ネットワーク待ち時間がサーバーの待ち機時間よりもはるかに長いワークロードのパフォーマンスを向上させることができます。 |
multiuser |
該当なし | サーバーにアクセスするときに、ユーザー アクセスを個々の資格情報にマップします。 既定では、CIFS マウントでは、共有にアクセスするときに使用するユーザー資格情報 (マウント資格情報) のセットは 1 つだけです。 このオプションを使用すると、新しいユーザーがマウントにアクセスするたびに、クライアントはユーザーの資格情報を使用してサーバーとの新しいセッションを作成します。 そのユーザーによるその後のアクセスも、これらの資格情報を使用します。 カーネルはパスワードの入力を求めることができないため、マルチユーザー マウントは、パスワードを必要としない sec= オプションを使用するマウントに限定されます。 |
cifsacl |
該当なし | このオプションは、LINUX アクセス許可ビットとの間で CIFS/NTFS ACL をマップしたり、UID と GID との間で SID をマップしたり、セキュリティ記述子を取得および設定したりするために使用されます。 NTLMv2 認証でのみサポートされます。 |
idsfromsid,modefromsid |
該当なし | クライアントがクライアント強制認可を行う必要がある場合に推奨されます。 Unix スタイルのアクセス許可を有効にします。 UID/GID がすべてのクライアント間で均一である場合にのみ機能します。 NTLMv2 認証でのみサポートされます。 |
cruid= |
uid またはユーザー名 | 省略可能。 資格情報キャッシュの所有者の uid を設定します。 これは主に sec=krb5 で役立ちます。 デフォルトは、マウントを実行するプロセスの実際の uid です。 このパラメーターは、デフォルトの資格情報キャッシュ ファイルに必要な Kerberos チケットを持つユーザーの uid またはユーザー名に設定することをお勧めします。 これにより、アップコールは、そのユーザーが所有する資格情報キャッシュを検索するように指示します。 |
sec= |
krb5 | Kerberos 認証に必要です。 Kerberos セキュリティ モードを有効にするには、sec=krb5 を設定します。 例: sudo mount -t cifs $SMB_PATH $MNT_PATH -o sec=krb5,cruid=$UID,serverino,nosharesock,actimeo=30,mfsymlinks 。 このオプションを使用する場合は、ユーザー名とパスワードを省略する必要があります。 Linux クライアントはドメインに参加している必要があります。 「Linux クライアントの SMB 経由の Active Directory 認証を有効にする」を参照してください。 |
uid= |
0 | 省略可能。 マウントされたファイルシステム上のすべてのファイルまたはディレクトリを所有する uid を設定します。これは、サーバーが所有権情報を提供しない場合です。 ユーザー名または数値の UID のいずれかとして指定できます。 指定しない場合は、0 が既定値です。 |
gid= |
0 | 省略可能。 マウントされたファイルシステム上のすべてのファイルまたはディレクトリを所有する gid を設定します。これは、サーバーが所有権情報を提供しない場合です。 グループ名または数値の GID のいずれかとして指定できます。 指定しない場合は、0 が既定値です。 |
file_mode= |
該当なし | 省略可能。 サーバーが CIFS Unix 拡張機能をサポートしていない場合は、既定のファイル モードがオーバーライドされます。 |
dir_mode= |
該当なし | 省略可能。 サーバーが CIFS Unix 拡張機能をサポートしていない場合は、ディレクトリの既定のモードがオーバーライドされます。 |
handletimeout= |
該当なし | 省略可能。 フェールオーバー後にクライアントの再接続を待機するためにサーバーがファイル ハンドルを予約する時間 (ミリ秒単位)。 |
次のステップ
Linux での SMB Azure ファイル共有の使用の詳細については、次を参照してください。