web-dev-qa-db-ja.com

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

特定のディレクトリ内のファイルを作成および読み取るためのアクセス許可をユーザーに与えますが、ファイルを変更または削除することはできません。ユーザーがファイルに追加できる場合は問題ありませんが、私はそうではありません。これはUbuntu Linuxにあります。

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

明確にするために、私は次のことを望みます。

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

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

17
paj28

次のように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
_

bindfsdirは、ファイルとディレクトリの所有権と権限が固定されています。すべてのファイルは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
_

ただし、そのファイルに対して2番目のwriteopen()を実行することはできません。これは、ファイルに対する権限がないためです。

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

(追加は許可されないことに注意してください(初期要件の一部ではないため))。

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

16

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
4
Fiximan