ユーザーに特定のディレクトリでファイルを作成および読み取る権限を付与したいが、ファイルを変更または削除することはできません。ユーザーがファイルに追加できる場合は問題ありませんが、私はそうしない方が良いです。これはUbuntu Linuxにあります。
標準のUnixファイル権限ではこれはできないようですが、ACLを使用することは可能でしょうか?ユーザーは常にSFTPを使用して接続するので(OS権限ではなく)、SFTPでこれを制御する方法がある場合は問題ありません。
確実にするために、以下が欲しいです。
- echo hello> test#成功、テストが存在しないため、生成が許可されます。
- echo hello >>テスト#は、追加の許可によって成功または失敗する可能性があります。
- echo hello2> test#テストがすでに存在し、変更が許可されていないため失敗しました。
- catテスト#読み取りが許可されているため成功しました。
- 削除が許可されていないため、rmテスト#失敗
なぜこれが起こっているのか疑問に思うなら、Duplicatiバックアップシステムをランサムウェアに耐えることができます。
答え1
次のように使用できますbindfs
。
$ ls -ld dir
drwxr-xr-t 2 stephane stephane 4096 Aug 12 12:28 dir/
このディレクトリはStephaneが所有し、Stephaneグループ(Stephaneが唯一のメンバー)に属します。またt
、これにより、ユーザーが自分に属していないアイテムの名前を変更または削除できなくなります。
$ sudo bindfs -u root -p u=rwD,g=r,dg=rwx,o=rD dir dir
私たちはbindfs
dir
ファイルとディレクトリの所有権と権限を固定しました。すべてのファイルは所有者として表示されますroot
(実際のディレクトリにあってもまだStephaneに属します)。
ディレクトリにはdrwxrwxr-x root stephane
権限が付与され、他の種類のファイルには-rw-r--r-- root stephane
権限が付与されます。
$ ls -ld dir
drwxrwxr-t 2 root stephane 4096 Aug 12 12:28 dir
これでディレクトリへの書き込みが可能になり、ファイル生成が機能します。
$ echo test > dir/file
$ ls -ld dir/file
-rw-r--r-- 1 root stephane 5 Aug 12 12:29 dir/file
しかし、二度とはできません。書く open()
権限がないため、このファイルには次の操作を行います。
$ echo test > dir/file
zsh: permission denied: dir/file
(ここでは追加は許可されていません(初期要件の一部ではありません)。)
dir
制限事項:このビットのためにエントリを削除したり名前を変更したりすることはできませんが、t
ここで作成する新しいディレクトリにはそのビットがないため、t
そのエントリの名前を変更または削除できます。
答え2
このchattr +a
オプションは追加のみを許可します。この方法でファイルを変更することはできますが、ファイルを追加(行を追加するなど)でのみ変更できます。既存のファイルを削除することはできませんが、新しいファイルを作成できます。これはあなたの要件に適している可能性があります。
sudo chattr -R +a /dir/to/apply/to
~からman chattr
「a」属性が設定されているファイルは書き込みモードでのみ開くことができます。スーパーユーザーまたはCAP_LINUX_IMMUTABLE機能を持つプロセスのみがこのプロパティを設定または消去できます。
(ディレクトリでも動作することに注意してください)
したがって、リストは次のようになります。
echo hello > test # succeeds, because test doesn't exist, and creation is allowed
echo hello2 > test # fails, because test already exists, and overwriting is not allowed
echo hello3 >> test # succeeds, because appending is allowed
cat test # succeeds, because reads are allowed
rm test # fails, because delete is not allowed