ファイルがルートによって生成されたプレーンテキストファイルの場合は、次のコマンドを使用します。
echo 'foo' > ./file.txt
あなたのls -l
もの:
-rw-r--r-- root root ./file.txt
ただし、一般ユーザーとしてこの設定を変更できます。ウィムで保存する:w!
かsedコマンド、これが発生した場合ユーザーとグループファイル所有者は次のように変更されます。
-rw-r--r-- user user ./file.txt
他人の読み取り権限が削除された場合はchmod o-r ./file.txt
変更できなくなりましたが、復元するとchmod o+r ./file.txt
再度変更できることがわかりました。
ここで何が起こっているのでしょうか? 「その他」の読み取り権限でルートが所有するファイルを変更し、ユーザーとグループの所有権を変更できるのはなぜですか。
なぜこれが起こるのですか?
PS:私はDebian SIDを使用しています。
答え1
これは、次の2つの理由で発生します。
vim
(少なくともこの場合)、sed
ライブ編集を行うと、実際には元のファイルが削除され、同じ名前の新しいファイルが作成されます。ファイル削除機能は、ファイル自体の権限ではなく、ファイルを含むディレクトリの権限によって異なります。
したがって、ここで何が起こるのかは、ディレクトリへの書き込み権限があるということです。これは、ファイルの削除や作成など、ディレクトリの内容を変更できることを意味します。したがって、実行sed -i
または保存すると、:w!
元のファイルが削除され、新しいファイルが生成されます。これが所有権が変更される理由でもあります。実際には別のファイルです。
ファイルの内容を確認できます。インデックスノード編集前と後:
$ ls -ld foo/
drwxr-xr-x 2 terdon terdon 266240 Nov 16 13:43 foo/
$ cd foo
$ sudo sh -c 'echo foo > file'
$ ls -l
total 4
-rw-r--r-- 1 root root 4 Nov 16 13:43 file
このコマンドの後、一般ユーザーはfile
書き込み権限を持つディレクトリのルート所有権を持ちます。foo/
それではls -i
、次のようにinodeを確認し、変更してもう一度確認してsed
みましょう。
$ ls -li file
26610890 -rw-r--r-- 1 root root 4 Nov 16 13:43 file
$ sed -i 's/foo/bar/' file
$ ls -li file
26610859 -rw-r--r-- 1 terdon terdon 4 Nov 16 15:40 file
vim
次のコマンドを実行して同じことを確認することもできます。
strace vim file 2> strace.out
その後、ファイルを編集して別の:w!
名前で保存すると、次のようにstrace.out
なります。
unlink("file") = 0
open("file", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 4
write(4, "bar\n", 11) = 11
したがって、ファイルが最初に削除され(unlink("file")
)、同じ名前の新しいファイルが作成され(open("file", O_WRONLY|O_CREAT|O_TRUNC, 0644)
)、修正がそのファイルに書き込まれます(write(4, "bar\n", 11)
)。
上記のように、inodeが変更されました。同じ名前の新しいファイルです。したがって、書き込み権限のないファイルを実際に変更するのではなく、目次そのディレクトリからファイルを削除し、そのディレクトリに古いファイルと同じ名前で新しいファイルを作成すると、書き込みアクセス権があります。
私は同様の質問に答えました。https://askubuntu.com/a/815849/85695。
答え2
vim
ファイルは変更できませんが、ファイルが関連付けられているディレクトリへの書き込み権限があり、ディレクトリを所有しているか、t
その権限にビットを設定していない場合は、ファイルを削除して所有する新しいコピーに置き換えることができます。あなたによって。
これを防ぐには、次の手順をroot
実行します。
- ファイルに
immutable
(chattr +i
)または()フラグを設定しますappend-only
。 (これは削除できません。)chattr +a
root
- 親ディレクトリへの書き込み権限のみがあることを確認してください
root
(ユーザーroot
とビットのみを所有しています;、)。w
chown root:
chmod u=rwx,go=rx
- 所有するディレクトリは
root
他の人が書き込むことができますが、権限にt
(削除制限²)ビット()があります(したがって、ユーザーは自分が所有するファイルのみを削除または名前変更できます)。chmod o+t
/a/b/file
¹ ifという名前のファイルに対するthenuser
への書き込みアクセス権がある場合は、名前を変更してその中に独自の名前を再作成することも/a
できます。/a/b
/a/b.old
/a/b
/a/b/file
²聞いたことがあるでしょう。粘り強いビットこのビットの用語ですが、通常の実行可能ファイル(非常に古いシステムでのみ)に適用されると、実行可能ファイルのテキストをメモリに保持するようにシステムに指示(指示するために使用されます)されます。このビットは、ディレクトリに適用されるときに他の無関係な意味を持ちます。