Rockyがなぜ手紙を書くことができないのか知っている人はいますか/tmp/afile
?他のユーザーが不安定な権限を付与することもchmod o+w
できないようです
答え1
あなたの予想は正しいです。ファイルへの書き込み権限があり、含まれているすべてのディレクトリに対する実行権限があるため、権限は書き込みを許可するrocky
必要があります。ただし、Linuxでは追加のセキュリティ強化メカニズムが発生します。このメカニズムが有効になると、一部のファイルがディレクトリに書き込まれます。afile
rocky
粘り強いビット禁止。
ディレクトリの固定ビットは、t
リスト内のファイルモード/権限の最後の10文字で表され、を使用してls -l
設定できますchmod +t
。通常、ディレクトリに対する固定ビットの影響は、ファイル所有者だけがファイルを削除または名前変更できることです。既存のファイルへの書き込みには影響しません。
しかしいつfs.protected_regular
sysctl がイネーブルの場合、固定ビットは追加の結果を取得します。ユーザーは、ファイルを所有していない限り、書き込み用に固定ディレクトリにあるファイルを開くことはできません。存在しない場合ファイルを生成する方法でファイルを開く場合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=0
sysctl 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
答え2
(+ t)のスティッキービットのため/tmp
。
man 1 chmod
制限除去フラグまたは固定ビット
The restricted deletion flag or sticky bit is a single bit, whose in‐ terpretation depends on the file type. For directories, it prevents unprivileged users from removing or renaming a file in the directory unless they own the file or the directory; this is called the re‐ stricted deletion flag for the directory, and is commonly found on world-writable directories like /tmp.