【検証】Linux on Azure ~Azure Files をマウントするときのパーミッション設定について~#Azure リレー
2021-07-21
azblob://2022/11/11/eyecatch/2021-07-20-linux-on-azure-azure-files-permission-000.jpg

FIXER藤井です。先週の弊社山川の「Azure上で.NET Core Web APIを動かす #Azureリレー」に続き、今週のAzure リレーを担当します。今回はかなり地味なテーマですが、Azure Linux VMにAzure Filesにマウントするときのディレクトリのパーミッション設定が、挙動にどのような影響を与えるか検証した結果をまとめました。

理解しておくべき概念

具体的な検証内容の前に、理解しておくべき概念を説明いたします。

Azure Files とは

Azure Files とはSMB プロトコルによるファイル共有機能を提供するサービスの1つで、Azure Storage Account に含まれます。「SMB プロトコルによるファイル共有機能」というとイメージが湧きにくいかもしれませんが、「ファイルサーバー(共有サーバー)」としてほとんどのオフィスで長年、利用されてきたサービスのことです。

Azure Filesとは「PaaS型のファイルサーバー」と言い換えることもできます。代表的な用途の例としては、バッチ処理でのバックアップデータの保存などの用途で利用されているオンプレミスのファイルサーバーを、クラウドに移行する場合などに利用されます。同じオンプレミスからクラウドへの移行でも、オフィス環境で一般ユーザーが利用するのであれば、Office 365(OneDriveやSharePoint およびTeams)やBoxで提供される「SaaS型のファイルサーバー」が基本的な選択肢になります。

Azure FilesのLinux VMへのマウントとは

Windows 端末でオンプレミスのファイルサーバーのフォルダーを、「ネットワークドライブ」として追加したことがある方も多いかと思います。Azure FilesでもSMBプロトコルを使っているので同様に追加できます。また接続元はWindows OS環境だけでなく、Linux OS環境でも可能です。詳細は以下のMicrosoft 公式ドキュメント"Linux で Azure Files を使用する"を併せて参照してください。

藤井が思いつく範囲ではLinux VMにマウントしたAzure Filesの用途例は、以下のようなものです。

  • 複数のLinux VMからマウントしているAzure Filesに、共通の設定ファイル(confファイル)をアップロードし各VMに適用する。
  • Linux VMのログファイルを採取したり外部に提供したりする時に、マウントしているAzure Filesを経由して端末にダウンロードする。

Azure PoratalからAzure Files について、以下の画像のようにAzure Files一覧右端のハンバーガーメニューより、「接続」を開くと表示されるコマンドをコピーして、Linux VMにSSHしているターミナルから実行します。


またコマンドのサンプルは以下です。

sudo mkdir /mnt/【ファイル共有名】
if [ ! -d "/etc/smbcredentials" ]; then
sudo mkdir /etc/smbcredentials
fi
if [ ! -f "/etc/smbcredentials/【ストレージアカウント名】.cred" ]; then
sudo bash -c 'echo "username=【ストレージアカウント名】" >> /etc/smbcredentials/【ストレージアカウント名】.cred'
sudo bash -c 'echo "【接続文字列】" >> /etc/smbcredentials/【ストレージアカウント名】.cred'
fi
sudo chmod 600 /etc/smbcredentials/【ストレージアカウント名】.cred
sudo bash -c 'echo "//【ストレージアカウント名】.file.core.windows.net/【ファイル共有名】/mnt/【ファイル共有名】 cifs nofail,vers=3.0,credentials=/etc/smbcredentials/【ストレージアカウント名】.cred,dir_mode=0777,file_mode=0777,serverino" >> /etc/fstab'
sudo mount -t cifs //【ストレージアカウント名】.file.core.windows.net/【ファイル共有名】 /mnt/【ファイル共有名】 -o vers=3.0,credentials=/etc/smbcredentials/【ストレージアカウント名】.cred,dir_mode=0777,file_mode=0777,serverino

パーミッション設定とは

パーミッション設定の概要

パーミッション設定とは、Linux OSにおけるディレクトリおよびファイルに対する権限の設定です。設定内容のパターンごとに3桁の数字の組み合わせで表現されます。前述のコマンドのサンプルでは、dir_mode=0777がディレクトリに対する設定を、file_mode=0777がファイルに対する設定をそれぞれ意味しています。「0777」の数字は、「所有者/所有者グループ/その他ユーザー」それぞれの権限付与対象に対して、「読取/書込み/実行」の全ての権限内容が付与されているという意味です。以下、「権限の付与対象」と「権限内容」に分けて詳細を解説します。

権限付与の対象について

コマンドのサンプルの「~0777」のうち頭の部分の「0」を除いた3桁の数字は桁ごとに、権限付与の対象と対応しています。

  • 左から1つ目:該当のディレクトリ/ファイルの所有するユーザーを意味します。
  • 左から2つ目:該当のディレクトリ/ファイルの所有するユーザーが所属するグループを意味します。
  • 左から3つ目:該当のディレクトリ/ファイルの所有以外のその他ユーザーを意味します。

権限内容

権限内容は「書込み/読取/実行」の3つの権限についてそれぞれ以下の値を基底として、付与されている権限の組み合わせを、基底の数字の「足し算」で表現します。

基底の値権限
4読取
2書込み
1実行
パターンごとの値権限の内訳
7読取(4) + 書込み(2) + 実行(1)
6読取(4) + 書込み(2)
5読取(4) + 実行(1)
4読取(4)
3書込み(2) + 実行(1)
2書込み(2)
1実行(1)
0権限設定なし

検証詳細

検証の観点

今回の検証ではマウントを実施するコマンドにて、パーミッション設定(dir_mode=~,file_mod=~)について、以下の4パターンを設定します。

  • pattern#1_0777:所有者/所有者グループ/その他ユーザーにフル権限
  • pattern#2_0770:所有者/所有者グループにフル権限、その他ユーザーに権限なし
  • pattern#3_0700:所有者にフル権限、所有者グループ/その他ユーザーに権限なし
  • pattern#4_0000:所有者/所有者グループ/その他ユーザーに権限なし

上記の4パターンについて、以下の操作(1)~操作(3)をそれぞれ試します。

  • 操作(1)Azure Portalからファイルをアップロードする。
  • 操作(2)上記の操作(1)でアップロードしたファイルをLinux VMからを開く(cat コマンド)
  • 操作(3)Linux VMからファイルを新規で作成して保存する。(vimコマンド)
  • 操作(4)上記の操作(3)で作成したファイルをAzure Portalでダウンロードする

検証の目的

検証の目的としては、以下の点になります。

  • Linux VM側でのパーミッションの設定がLinux VM上での操作にのみ影響するのか、Azure Portal側の操作に影響するのかを確認する
  • Azure Portalで用意されている接続コマンドはデフォルトだと「777(すべてのユーザーにフル権限を付与)」で設定されているが、より厳密な他の値を設定することは可能かを確認する

検証の準備(環境の構築)

【注意事項】今回、検証用に構築する環境はあくまでブログ執筆用に作成してすぐに削除する前提のため、以下の2点の設定を割愛しています。通常であればあたとえ本番環境でなくても、セキュリティ上は望ましくないため、読者の方が自分で試してみるときは、十分に注意してください。

  • 省略している点(1):Linux VMへSSH接続するアクセス元のグローバルIPアドレスの制御
  • 省略している点(2):Azure Filesへ接続するアクセス元のグローバルIPアドレスの制御

以下、Azure CLIを使用して環境を構築します。

検証の準備(1)Linux VMの構築

  1. 以下のコマンドによりAzure のサブスクリプションにログインします。
    az login
  2. 以下のコマンドにより「techblog」の名前でリソースグループを作成します。
    az group create --name techblog --location japaneast
  3. 以下のコマンドにより、仮想ネットワークとサブネットを作成します。
    az network vnet create -g techblog -n vnet --address-prefix 10.0.0.0/16 --subnet-name subnet --subnet-prefix 10.0.0.0/24
  4. 以下のコマンドによりLinux 仮想マシンを作成します。【パスワード】は任意で作成します。
    az vm create --admin-username fixeradmin --admin-password 【パスワード】 -n centos -g techblog --location japaneast --vnet-name vnet --subnet subnet --public-ip-address-allocation static --image CentOS --size Standard_A2 --generate-ssh-keys
  5. 以下のコマンドにより仮想マシンのパブリックIPアドレスを確認します。
    az vm show --resource-group techblog --name centos -d --query publicIps -o tsv
  6. 以下のコマンドにより上記で確認した【パブリックIPアドレス】を使ってssh接続が成功すればOKです。
    ssh -l fixeradmin 【パブリックIPアドレス】

検証の準備(2)Azure Filesの構築

  1. 以下のコマンドによりStorage Accountを作成します。【ストレージアカウント名】はグローバルで一意になる値を入力します。
    az storage account create -n 【ストレージアカウント名】 -g json -l japaneast --sku Standard_LRS
  2. 以下のコマンドにより、検証のpattern1~pattern4ごとにAzure FIlesを作成します。
    az storage share-rm create --resource-group techblog --storage-account 【ストレージアカウント名】 --name pattern1 --quota 1024 --enabled-protocols SMB
    az storage share-rm create --resource-group techblog --storage-account 【ストレージアカウント名】--name pattern2 --quota 1024 --enabled-protocols SMB
    az storage share-rm create --resource-group techblog --storage-account 【ストレージアカウント名】 --name pattern3 --quota 1024 --enabled-protocols SMB
    az storage share-rm create --resource-group techblog --storage-account 【ストレージアカウント名】 --name pattern4 --quota 1024 --enabled-protocols SMB

検証の準備(3)Azure Filesのマウント

  1. Azure Files「pattern1」についてAzure Portalより接続コマンドを確認します。確認方法は前述の「Azure FilesのLinux VMへのマウントとは」を参照します。
  2. Linux VMにSSH接続し、「pattern1」の接続コマンドを実行します。
  3. Azure Files「pattern2」についてAzure Portalより接続コマンドを確認します。接続コマンドのうち、以下の部分を変更します。該当の箇所は2か所あります。
    (変更前)dir_mode=0777,file_mode=0777
    (変更後)dir_mode=0770,file_mode=0770
  4. Linux VMにSSH接続し、変更した「pattern2」の接続コマンドを実行します。
  5. Azure Files「pattern3」についてAzure Portalより接続コマンドを確認します。接続コマンドのうち、以下の部分を変更します。該当の箇所は2か所あります。
    (変更前)dir_mode=0777,file_mode=0777
    (変更後)dir_mode=0700,file_mode=0700
  6. Linux VMにSSH接続し、変更した「pattern3」の接続コマンドを実行します。
  7. Azure Files「pattern4」についてAzure Portalより接続コマンドを確認します。接続コマンドのうち、以下の部分を変更します。該当の箇所は2か所あります。
    (変更前)dir_mode=0777,file_mode=0777
    (変更後)dir_mode=0000,file_mode=0000
  8. Linux VMにSSH接続し、変更した「pattern4」の接続コマンドを実行します。
  9. LInux VMにて以下のコマンドを実行しAzure Files をマウントします。
    sudo mount -a
  10. LInux VMにて以下のコマンドを実行し、各ディレクトリが表示されることを確認します。
    ls -l /mnt/

検証結果

検証結果は以下の表のとおりです。結論から言うと、パーミッションの設定はLinux VM内の操作にのみAzure Portal側からの操作には一切、影響しません。Azure Portalで用意されている接続コマンドはデフォルトだとPattern1「777(すべてのユーザーにフル権限を付与)」で設定されていますが、Linux VM側からのアクセス制限をより厳しくしたいときは、他の値を設定することも十分に検討に値すると言えます。

操作(1)
Azure Portal
からアップロード
操作(2)
Linux VM
から閲覧
操作(3)
Linux VM
から作成
操作(4)
Azure Portal
からダウンロード
Pattern1OKOKOKOK
Pattern2OKOK(要sudo)OK(要sudo)OK
Pattern3OKOK(要sudo)OK(要sudo)OK
Pattern4OKOK(要sudo)OK(要sudo)OK

今後の構想

今回の記事のためにAzure Filesへのアクセス権限について調べていく中で、「Azure AD DSによるアクセス権限の制御」が次のテーマになると感じており、また調査結果をブログに書こうと思っています。パーミッション設定による制御はあくまで、Linux VM側のため、Azure 側の制御という観点では「Azure AD DSによるアクセス制御」を組み合わせることになると予想しています。