一覧NW-17-3 · 周辺プロトコル

SMBとNFSによるファイル共有

同じCSVを両方の入口から参照します。SMBの書込み拒否、NFS経由の更新、SMBでの再取得まで行い、どの設定が操作を制限したのか確認します。

説明

SMBとNFSは離れたサーバーのファイルを扱う仕組みです。接続できても、利用者の対応付けや共有の権限によって、読める操作と書ける操作が変わります。

同じCSVを両方の入口から参照します。SMBの書込み拒否、NFS経由の更新、SMBでの再取得まで行い、どの設定が操作を制限したのか確認します。

1共有名と公開パス

filesサーバーの同じディレクトリ/srv/reportsを、SMBではreports、NFSでは/srv/reportsとして公開しています。二つの公開設定の抜粋を表示します。

cat share-settings.txt二つの公開設定の抜粋

SMB共有は認証済みのlearnerに読取りだけを許可し、NFSは指定クライアント範囲に読書きを許可しています。同じファイルでも、入口ごとの設定が違えば操作結果は変わります。

2SMBで元ファイルを取得

smbclientの認証ファイルにはlearnerの演習用設定が入っています。共有名を指定し、getで手元へ取得します。

smbclient //files/reports共有に接続 -A smb.auth設定済みの認証ファイル -c 'get report.csv smb-copy.csv'共有から手元へ取得

//files/reportsが共有への入口で、report.csvは共有内の相対パスです。この転送では19バイトを取得しました。利用者が認証できたことと、書込みを許可されることは別です。

3NFSのマウントと利用者

同じサーバーのNFS共有は/mnt/reportsへマウント済みです。マウント情報と操作する利用者の数値IDを確認します。

findmnt -n -o SOURCE,TARGET,FSTYPE /mnt/reports接続元とマウント先 findmnt -n -o OPTIONS /mnt/reports | tr ',' '\n' | grep -E '^(rw|vers=|sec=)'必要なマウントオプションを抽出 id -u利用者のUID stat -c "%u %g %a %s %n" /mnt/reports/report.csv所有者・権限・長さ

UID1001の利用者が、UID1001所有・モード644のファイルを扱います。このNFS構成はsec=sysでクライアント側の数値IDを使います。SMBの利用者名とNFSのUIDが、どの所有者へ対応するかはサーバーの設定で決まります。

4同じ内容を読んでいるか

SMBで取得したコピーとNFS上のファイルを比較します。

cmp smb-copy.csv /mnt/reports/report.csvバイト単位で比較 && cat smb-copy.csv一致した場合に内容を表示

cmpが成功したため&&の後のcatが実行されました。二つの入口から読んだ内容は一致します。ただし、ここで一致しても書込みの許可まで同じとは限りません。

5SMBの書込み拒否

更新用ファイルupdated.csvはstatusをdoneに変えた18バイトです。SMBの同じ共有に上書きを試みます。

smbclient //files/reports同じ共有に接続 -A smb.auth同じ利用者 -c 'put updated.csv report.csv'手元から共有へ上書き

共有設定のread only = yesによって書込みが拒否されます。ファイル所有者に書込み権限があっても、SMB共有側の制限を越えることはできません。元のreport.csvはreadyのままです。

6NFS経由では更新できるか

同じupdated.csvをNFSのマウント先へコピーします。この操作ではUID1001として書き込みます。

cp updated.csv /mnt/reports/report.csvNFS経由で上書き cat /mnt/reports/report.csv更新後を確認

NFS公開はrwで、ファイルの所有者にも書込み権限があるため更新できます。root_squashはUID0を匿名のIDへ対応付ける設定で、今回のUID1001を読取り専用にする設定ではありません。

7別の入口から更新を確認

SMBからもう一度取得します。共有の書込み禁止は、他の入口から行われた変更を見えなくする設定ではありません。

smbclient //files/reports -A smb.authSMBで再接続 -c 'get report.csv after.csv'更新後を別名で取得 cat after.csv再取得した内容

SMBでもdoneが読めました。同じ保存先に複数の公開経路がある場合、片方を読取り専用にしただけでは保存データ全体の更新を防げません。今回の取得ではサーバー上の更新が反映済みで、元のsmb-copy.csvは取得時点のreadyを保持します。

8変更前のコピーと比較

最初のコピーと再取得したファイルを比較し、実際に変わった行を確認します。

diff -u行単位の差分 --label smb-copy.csv --label after.csv差分ヘッダーの表示名 smb-copy.csv after.csv取得時点の異なるファイル

変化したのはstatusの値です。SMB/NFSというプロトコル名だけで可否を判断せず、公開設定、認証・ID対応、保存先の権限を順に確認します。diffの差分ありは終了コード1で、ファイル比較そのものの失敗ではありません。

まとめ

共有の公開設定とファイル自体の権限は両方確認します。

同じ保存先を複数経路で公開すると、別経路からの更新も参照結果に現れます。

操作履歴と解説を振り返れます。

シェル / 通信とファイル

1
cat share-settings.txt
SMB [reports]
path = /srv/reports
read only = yes
valid users = learner

NFS /srv/reports 192.0.2.0/24(rw,sync,root_squash,sec=sys)
2
smbclient //files/reports -A smb.auth -c 'get report.csv smb-copy.csv'
getting file \report.csv of size 19 as smb-copy.csv (18.6 KiloBytes/sec) (average 18.6 KiloBytes/sec)
3
findmnt -n -o SOURCE,TARGET,FSTYPE /mnt/reports findmnt -n -o OPTIONS /mnt/reports | tr ',' '\n' | grep -E '^(rw|vers=|sec=)' id -u stat -c "%u %g %a %s %n" /mnt/reports/report.csv
files:/srv/reports /mnt/reports nfs4
rw
vers=4.2
sec=sys
1001
1001 1001 644 19 /mnt/reports/report.csv
4
cmp smb-copy.csv /mnt/reports/report.csv && cat smb-copy.csv
id,status
42,ready
5
smbclient //files/reports -A smb.auth -c 'put updated.csv report.csv'
NT_STATUS_ACCESS_DENIED opening remote file \report.csv
6
cp updated.csv /mnt/reports/report.csv cat /mnt/reports/report.csv
id,status
42,done
7
smbclient //files/reports -A smb.auth -c 'get report.csv after.csv' cat after.csv
getting file \report.csv of size 18 as after.csv (17.6 KiloBytes/sec) (average 17.6 KiloBytes/sec)
id,status
42,done
8
diff -u --label smb-copy.csv --label after.csv smb-copy.csv after.csv
--- smb-copy.csv
+++ after.csv
@@ -1,2 +1,2 @@
 id,status
-42,ready
+42,done

演習完了