所有者にファイルの作成と読み取りを許可しますが、変更または削除は許可しません


17

特定のディレクトリでファイルを作成および読み取る権限をユーザーに付与しますが、ファイルを変更または削除することはできません。ユーザーが大丈夫なファイルに追加できる場合、私はむしろしたくない。これはUbuntu Linux上にあります。

これは標準のUnixファイル許可では不可能だと思いますが、おそらくACLを使用してこれは可能ですか?ユーザーは常にSFTPを使用して接続するため、SFTP内でこれを制御する何らかの方法があれば(OSの許可とは対照的に)問題ありません。

明確にするために、次のものが必要です。

  • echo hello> test#は成功しました。テストが存在せず、作成が許可されているためです
  • echo hello >> test#は、追加が許可されているかどうかに応じて成功または失敗する場合があります
  • echo hello2>テスト#は失敗しました。テストが既に存在し、変更が許可されていないためです。
  • 読み取りが許可されているため、catテスト#は成功
  • 削除は許可されていないため、rmテスト#は失敗します

なぜ私がこれをしたいのか疑問に思っているなら、それはDupplicatiバックアップシステムをランサムウェアに耐性にすることです。


1
ファイルは常に空で作成されます。実行するecho > testと、シェルはopen("test", O_WRONLY|O_CREAT|O_TRUNC)ファイルを作成し、呼び出しechoてコンテンツを書き込み、それを変更します。これで、最初のopen(WR)のみを成功させることができます。
ステファンシャゼル

@StéphaneChazelas-追加が許可されることを明確にするために編集
-paj28

回答:


16

次の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(ただし、実際のディレクトリの下では、まだステファンによって所有されています)。

ディレクトリは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()、そのファイルに2回目の書き込みを行うことはできません。

$ echo test > dir/file
zsh: permission denied: dir/file

(最初の要件の一部ではないため、追加は許可されていません)。

制限:ビットのdirためにエントリを削除または名前変更することはできませtんが、そこに作成する新しいディレクトリにはそのtビットがないため、エントリを名前変更または削除することができます。


これは素晴らしいです!このようなエレガントなソリューションを作成するために時間を割いていただきありがとうございます。以前にbindfsについて聞いたことがありますが、実際に使用したのはこれが初めてです。
paj28

4

この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

わかりました、これは有望に聞こえます。削除を正しく防ぎ、ファイルに属性がある場合は上書きを防ぎます。ただし、新しいファイルが作成されると、それらは自動的に属性を取得しません。これを自動的に行う方法はありますか?
paj28

ディレクトリに属性がある場合、ファイルは属性が明示的に設定されていなくてもそれに応じて動作します。問題は、新しいサブディレクトリ内のファイルです。たとえば、dir1はchattr +aファイルを作成でき、削除することは許可されず、追加できます。dir1 / dir2を作成した場合、dir2で
修正して

1
残念ながらありません:dpaste.com/042XQ7X
paj28

あぁ、ごめんなさい-私は以前間違ったテストをした
-Fiximan

@ paj28リンクが壊れています:
mjaggard
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.