まず、いくつかの背景:
Smbusersグループのユーザーのみが、ファイルとスナップショットの共有にアクセスできます。同様に、smbprivateグループのユーザーのみがプライベートでファイルにアクセスできます。さらに、Linuxのアクセス許可では、それぞれのグループに属していないユーザーが、ローカルシステムとSamba共有のスナップショット内の両方でファイルとプライベートディレクトリにアクセスすることを禁止しています。
これは素晴らしいことです。これは、セルフバックアップの「バックアップから復元」オプションを備えた完全に機能するファイルサーバーがあることを意味します(ユーザーは、スナップショット共有にアクセスして、自分で復元したいファイルを取得できます)。これまでのところ、重要な要素が1つありません。ローカルシステムでの/ var/smb/snapshotsディレクトリへの非rootアクセスです。
スナップショット必須すべての通常のユーザーに対して厳密に読み取り専用ですが、もちろん、バックアップ操作を実行できるようにするには、ファイルシステムを読み取り/書き込みでマウントする必要があります。これらのディレクトリの権限は現在次のとおりです。
root@odin:/var/smb# ll
total 40
drwxrwxr-x 7 root root 4096 2011-04-11 15:18 ./
drwxr-xr-x 14 root root 4096 2011-04-10 19:07 ../
drwxrwx--- 15 kromey smbusers 4096 2010-12-07 13:09 files/
drwxrwx--- 7 kromey smbprivate 4096 2010-04-07 07:08 private/
drwxrwx--- 3 root root 4096 2011-04-11 15:16 snapshots/
さて、私が欲しいのは、スナップショットディレクトリへのアクセスをroot以外のユーザーに提供することですが、厳密には読み取り専用の方法です。ただし、バックアップを実行するには読み取り/書き込みが必要なため、/ dev/md2を読み取り専用でマウントすることはできません。別のユーザーがバックアップに書き込むことができる時間枠が提供されるため、バックアップ用に読み取り/書き込みで再マウントしてから、読み取り専用に再マウントすることはできません。
以前は、スナップショットディレクトリを読み取り専用のNFSエクスポート(ローカルホストのみ)にしてローカルにマウントすることでこれを行いました(元のルートでは、非ルートユーザーのトラバーサル権限がないディレクトリで保護されています)。これはハックのように感じられ、これを達成するためのより良い方法があるはずです。 mount --bind
オプションですが、2つのディレクトリに異なるアクセスレベル(つまり、読み取り専用と読み取り/書き込み)を持たせることができないようです(何か不足している場合を除きます:mount -r --bind dir1 dir2
)。
NFSを使用せずにこれを実現するにはどうすればよいですか?
TL; DR:バックアップされたファイルの元の権限と所有権を維持しながら、ファイルシステムの内容を選択したユーザーが読み取り/書き込みできるようにするにはどうすればよいですか。このファイルシステムに?
この回答はDebianで機能します(lennyとsqueezeでテスト済み)。調査の結果、Debianパッチのおかげでのみ機能するようです。Ubuntuなどの他のディストリビューションのユーザーは運が悪い可能性があります。
mount --bind
を使用できます。公的にアクセスできないディレクトリの下に「実際の」ファイルシステムをマウントします。より広くアクセスできる読み取り専用のバインドマウントを作成します。読み取り/書き込みアクセスで公開する部分の読み取り/書き込みバインドマウントを作成します。
mkdir /media/hidden /media/hidden/sdz99
chmod 700 /media/hidden
mount /dev/sdz99 /media/hidden/sdz99
mount -o bind,ro /media/hidden/sdz99/world-readable /media/world-readable
mount -o bind /media/hidden/sdz99/world-writable /media/world-writable
あなたのユースケースでは、私はあなたができると思います:
mkdir /var/smb/hidden
mv /var/smb/snapshot /var/smb/hidden
mkdir /var/smb/snapshot
chmod 700 /var/smb/hidden
chmod 755 /var/smb/hidden/snapshot
mount -o bind,ro /var/smb/hidden/snapshot /var/smb/hidden/snapshot
つまり実際のsnapshot
ディレクトリを制限されたディレクトリの下に置きますが、すべての人にsnapshot
読み取り権限を付与します。親のアクセスが制限されているため、直接アクセスすることはできません。誰もがそのパスを介して読み取ることができるように、アクセス可能な場所に読み取り専用でバインドマウントします。
(読み取り専用のバインドマウントが可能になったのは、バインドマウントが導入されてから数年後のことです。そのため、それらが機能しなかったときのことを覚えているかもしれません。現在は旧安定版)。
@Gillesは本当に近かったので、Ubuntu 10.10のマークから少し外れました(彼がDebian Squeezeやおそらく他の人に適していることを疑う理由はありません)。他のユーザーがアクセスできないフォルダー(たとえば、/ var/smb/hidden/snapshots、/ var/smb/hiddenには770の権限があり、root:rootが所有)の下に読み取り/書き込みスナップショットディレクトリをマウントすることで、他のユーザーからの読み取り/書き込みマウント。次に、mount --bind
に続いてmount -o remount,ro
を使用して、マウントをアクセス可能な場所にバインドし、読み取り専用にすることができます。
(逆(元のファイルシステムを読み取り専用でマウントしてから読み取り/書き込みでバインド)は機能しません。同様に、元の読み取り専用をマウントしてから読み取り専用でバインドしてから、元の読み取り/書き込みを再マウントすると、バインドされたディレクトリも読み取り/書き込み。)
要約すると、ここに解決策があります:
mkdir /var/smb/hidden
chown root:root /var/smb/hidden
chmod 770 /var/smb/hidden
mkdir /var/smb/hidden/snapshots
mksdir /var/smb/snapshots
mount /dev/md2 /var/smb/hidden/snapshots
mount --bind /var/smb/hidden/snapshots /var/smb/snapshots
mount -o remount,ro /var/smb/snapshots
そのため、バックアップが読み書き可能で一般的にアクセス可能な短い時間枠がありますが、私のニーズに合わせて使用できるほど短い時間です。/var/smbのアクセス許可を使用したトリッキーにより、この短いウィンドウの間に保護することができます(つまり、トラバース不可にしてから、マウントをバインドしてから、もう一度トラバース可能にしてください)。
これをすべてスクリプトにまとめる必要があります。おそらくすべてがマウントされた直後に、それを起動プロセスに差し込みます。これにより、Sambaがバインドしているディレクトリを共有しようとすることで発生する可能性がある競合を回避できます。
注:ディストリビューションがGillesが投稿したmount -o bind,ro
バージョンをサポートしている場合は、そのソリューションをお勧めします。私の解決策はここにありますonlyは、別のディレクトリにバインドするときにマウントオプションを変更できないUbuntuまたは他のディストリビューションの人々によって使用されるべきです。