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で、ファイル比較そのものの失敗ではありません。
まとめ
共有の公開設定とファイル自体の権限は両方確認します。
同じ保存先を複数経路で公開すると、別経路からの更新も参照結果に現れます。
操作履歴と解説を振り返れます。
シェル / 通信とファイル
cat share-settings.txtSMB [reports] path = /srv/reports read only = yes valid users = learner NFS /srv/reports 192.0.2.0/24(rw,sync,root_squash,sec=sys)
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)
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.csvfiles:/srv/reports /mnt/reports nfs4 rw vers=4.2 sec=sys 1001 1001 1001 644 19 /mnt/reports/report.csv
cmp smb-copy.csv /mnt/reports/report.csv && cat smb-copy.csvid,status 42,ready
smbclient //files/reports -A smb.auth -c 'put updated.csv report.csv'NT_STATUS_ACCESS_DENIED opening remote file \report.csv
cp updated.csv /mnt/reports/report.csv
cat /mnt/reports/report.csvid,status 42,done
smbclient //files/reports -A smb.auth -c 'get report.csv after.csv'
cat after.csvgetting file \report.csv of size 18 as after.csv (17.6 KiloBytes/sec) (average 17.6 KiloBytes/sec) id,status 42,done
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
演習完了