ACLまたはchmodを使用して他のユーザーに書き込み権限を付与することはできません。

ACLまたはchmodを使用して他のユーザーに書き込み権限を付与することはできません。

Rockyがなぜ手紙を書くことができないのか知っている人はいますか/tmp/afile?他のユーザーが不安定な権限を付与することもchmod o+wできないようです

ベストアンサー1

あなたの予想は正しいです。ファイルへの書き込み権限があり、含まれているすべてのディレクトリに対する実行権限があるため、権限は書き込みを許可するrocky必要があります。ただし、Linuxでは追加のセキュリティ強化メカニズムが発生します。このメカニズムが有効になると、一部のファイルがディレクトリに書き込まれます。afilerocky粘り強いビット禁止。

ディレクトリの固定ビットは、tリスト内のファイルモード/権限の最後の10文字で表され、を使用してls -l設定できますchmod +t。通常、ディレクトリに対する固定ビットの影響は、ファイル所有者だけがファイルを削除または名前変更できることです。既存のファイルへの書き込みには影響しません。

しかしいつfs.protected_regularsysctl がイネーブルの場合、固定ビットは追加の結果を取得します。ユーザーは、ファイルを所有していない限り、書き込み用に固定ディレクトリにあるファイルを開くことはできません。存在しない場合ファイルを生成する方法でファイルを開く場合O_CREAT、プログラムはファイルをシステムコールに渡してopenそれを示します。ここで微妙な点に注意してください。一般的な動作はファイルが存在するかどうかにのみ基づいていますが、改善された動作はファイルが存在しない場合に作成されるかどうかに基づいています。これは、ファイルが作成された可能性がある方法でファイルを開くことにのみ影響します。他の方法を使用してファイルに書き込むことはまだ許可されています。

これは、固定ビットがないディレクトリのファイルには影響しません。特にディレクトリを作成しましたが、ディレクトリ/tmp/foo/tmp/foo固定ビットがない場合、ファイル権限は/tmp/foo正しく機能します。

次の表は、関連するシナリオで書き込み用にファイルを開くときのシステムコールの動作をまとめたものですopen(ディレクトリが存在し、プログラムがその中にあるファイルにアクセスでき、ファイルが存在する場合、プログラムはそれに対する書き込み権限を持ちます。 )。

目次 文書 そしてO_CREAT いいえO_CREAT
rwxr-xr-x(755) 存在、書き込み可能(666) いいね いいね
rwxr-xr-x(755) 存在しない いいね ENOENT
rwxrwxrwx(777) 存在、書き込み可能(666) いいね いいね
rwxrwxrwx(777) 存在しない いいね ENOENT
rwxr-xr-t(1755) 存在、書き込み可能(666) いいね いいね
rwxr-xr-t(1755) 存在しない いいね ENOENT
rwxrwxrwt【1777】普通 存在、書き込み可能(666) いいね いいね
rwxrwxrwt【1777】普通 存在しない いいね ENOENT
rwxrwxrwt(1777)強化されたLinux 存在、書き込み可能(666) EACCES いいね
rwxrwxrwt(1777)強化されたLinux 存在しない いいね ENOENT

ENOENT「該当するファイルまたはディレクトリがありません」エラーです。EACCES「権限が拒否されました」エラーです。)

sysctl fs.protected_regular=0sysctl fs.protected_regular=1(無効)、(グローバルに書き込み可能なディレクトリに対して有効)、またはsysctl fs.protected_regular=2(グローバル書き込み可能またはグループ書き込み可能ディレクトリに対して有効)を使用して、この拡張を有効にするかどうかを制御できます。起動時/etc/sysctl.confまたはで設定を指定できます/etc/sysctl.d/*。一部のディストリビューションではデフォルトで有効にしますが、他のディストリビューションでは有効にしません。このprotected_regular設定は通常のファイルに適用されます。同様の設定があります。名前付きパイプ

これを直接確認するには(Linuxで実行されていてrootアクセス権がある場合)、rootとして次のコマンドを実行します。

mkdir /tmp/experiment
mkdir -m 1777 /tmp/experiment/sticky-world
mkdir -m 777 /tmp/experiment/ordinary-world
mkdir -m 1755 /tmp/experiment/sticky-user
mkdir -m 755 /tmp/experiment/ordinary-user
for d in /tmp/experiment/*; do touch $d/file; chown nobody:nogroup $d/file; chmod 666 $d/file; done

権限を確認してください:

$ ls -l /tmp/experiment 
total 16
drwxr-xr-x 2 root root 4096 Jul  3 21:10 ordinary-user
drwxrwxrwx 2 root root 4096 Jul  3 21:10 ordinary-world
drwxr-xr-t 2 root root 4096 Jul  3 21:10 sticky-user
drwxrwxrwt 2 root root 4096 Jul  3 21:10 sticky-world
$ ls -l /tmp/experiment/*/file
-rw-rw-rw- 1 nobody nogroup 0 Jul  3 21:10 /tmp/experiment/ordinary-user/file
-rw-rw-rw- 1 nobody nogroup 0 Jul  3 21:10 /tmp/experiment/ordinary-world/file
-rw-rw-rw- 1 nobody nogroup 0 Jul  3 21:10 /tmp/experiment/sticky-user/file
-rw-rw-rw- 1 nobody nogroup 0 Jul  3 21:10 /tmp/experiment/sticky-world/file

では、root以外のユーザーとしてフラグを使用して、一度にフラグを付けずに書き込むためにファイルをnobody開くコードを実行しましょう。O_CREATシェルが直接アクセスを提供しないため、Perlを使用していますO_CREAT(シェル書き込みリダイレクトは、アクティブな一部のシェルをO_CREAT除いて常にアクティブになりますnoclobber)。強化されたLinuxの場合:

$ perl -w -MFcntl -e 'foreach (@ARGV) { sysopen(F, $_, O_WRONLY | O_CREAT) or warn "$_: $!\n"; close F; }' /tmp/experiment/*/file
/tmp/experiment/sticky-world/file: Permission denied
$ perl -w -MFcntl -e 'foreach (@ARGV) { sysopen(F, $_, O_WRONLY) or warn "$_: $!\n"; close F; }' /tmp/experiment/*/file

Linux強化がないと、プログラムにファイルの書き込み権限があるため、すべてのファイルを開くことができます。

監査が有効になっている場合、書き込みを試みると記録された監査イベントが/tmp/experiment/sticky-world/fileトリガーされます(またはこれらのログが展開内のすべての場所)。 (それで、以前は知らなかったLinuxメカニズムが見つかりました。)ANOM_CREAT/var/log/audit/audit.log

おすすめ記事