0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ubuntu の /tmp のユーザファイルに root で追記できない

Last updated at Posted at 2025-01-17

sticky bit をディレクトリに設定すると、ファイルの所有者、ディレクトリの所有者、またはスーパーユーザーである場合にのみ、削除または名前変更ができるという仕様があり、/tmp は 1777 を付けて、すべてのユーザが、自身が owner のファイルを作成、削除して利用できるようになっている。
ここまではよいのだが、Ubuntu だと少し特殊な挙動が加わる。

sticky bit が付いている /tmp に、test01 ユーザが abc.txt を作成した後、root ユーザが、そこに >> で追記しようとすると、パーミッションエラーで書き込めないのだ。

test01@ubuntu-pc:~$ cd /tmp
test01@ubuntu-pc:/tmp$ touch abc.txt
test01@ubuntu-pc:/tmp$ sudo -s -H
root@ubuntu-pc:/tmp# echo "test" >> abc.txt
bash: abc.txt: Permission denied

これが、通常の sticky bit のないディレクトリなら問題なく書き込める。

そして、この挙動、sticky bit が付いているディレクトリの owner が test01 だった場合は、なぜか起きない。

root@ubuntu-pc:/# mkdir /test-dir
root@ubuntu-pc:/# touch /test-dir/abc.txt
root@ubuntu-pc:/# chown -R test01:test01 /test-dir
root@ubuntu-pc:/# chmod 1777 /test-dir
root@ubuntu-pc:/# echo "test" >> /test-dir/abc.txt      # これは OK
root@ubuntu-pc:/# chown -R root:root /test-dir
root@ubuntu-pc:/# echo "test" >> /test-dir/abc.txt      # これは /tmp と同じで NG
bash: /test-dir/abc.txt: Permission denied

レアケースかもしれないが、Ubuntu で /tmp 直下にある(1段 sticky bit ではないディレクトリ挟めば起きない)ユーザのファイルに、root で書き込めることを期待すると、この問題を踏むことになる。

ログファイルをユーザと root で交互に append するような、スクリプトを書く場合は、気をつけたい。
ユーザが先にファイルを作成しても、root は書き込めない。

2025/1/18 追記

ファイルに Permission denied で書き込めないのは、

  • >> を使った書き込みで、O_CREAT が付いていること、
  • /proc/sys/fs/protected_regular2 が入っていること

が関係しているとコメントいただきました。

O_CREAT を外すか、

echo 0 > /proc/sys/fs/protected_regular

とすることで、書き込めることを確認しました。

詳しくは、コメントをご参照ください。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?