haku-maiのブログ

インフラエンジニアですが、アプリも作ります。

Linuxでchmod -R 777 /した時なぜsudoとかできなくなるのか?

まえがき

  • Linuxでroot directoryから『chmod -R 777 /』実行してしまい障害になったケースはよく聞く。
  • 最近自分の周りでもこうした障害が発生したのだが、当時sudoコマンドとかが使えなくなったという。
  • なぜ使えなくなったのかを調べてみる。

問題のコマンド

rootユーザで以下コマンドを本番環境で実行すると少しハイな気持ちになれます。

# chmod -R 777 / 

まずsudoのそもそものパーミッションをCentOS7で確認してみるとsuidがついている。

# ls -l /usr/bin/sudo
---s--x--x. 1 root root 147336  4月  1  2020 /usr/bin/sudo

実際は4511なので777だとパーミッションが足りないことがわかる。
いや777なら行けそうじゃんと思うが、sudoの実行時にsuidのチェックが実行されるのでNGとなる。
sudoのソースコードを見てみたけど多分この部分でチェックが入っている。 https://github.com/sudo-project/sudo/blob/72df19088b57b32a20a92d97fa4b1181439d49b0/src/sudo.c#L192

suidは一般ユーザが実行時にroot権限で実行できる仕組み。
詳しくはredhat者がちゃんと書いてくれているので以下を見ておくといいかも。   https://www.redhat.com/sysadmin/suid-sgid-sticky-bit

同じくsuidの他にsgidもあるがこれらも同じくそういう制御が入っているはずなので、777にすると動かない 以下でfindするとそこそこある passwdとか確かにsuidの動きだわーと思った。

# find / \( -perm -4000 -or -perm -2000 \) -type f -exec ls -la {} \;
-r-xr-sr-x. 1 root tty 15344  6月 10  2014 /usr/bin/wall
-rws--x--x. 1 root root 23968  4月  1  2020 /usr/bin/chfn
-rws--x--x. 1 root root 23880  4月  1  2020 /usr/bin/chsh
-rwsr-xr-x. 1 root root 32128  4月  1  2020 /usr/bin/su
-rwsr-xr-x. 1 root root 27856  4月  1  2020 /usr/bin/passwd
-rwsr-xr-x. 1 root root 32096 10月 31  2018 /usr/bin/fusermount
-rwsr-xr-x. 1 root root 73888  8月  9  2019 /usr/bin/chage
-rwsr-xr-x. 1 root root 78408  8月  9  2019 /usr/bin/gpasswd
-rwsr-xr-x. 1 root root 41936  8月  9  2019 /usr/bin/newgrp
-rwsr-xr-x. 1 root root 44264  4月  1  2020 /usr/bin/mount
-rwsr-xr-x. 1 root root 23576  4月  1  2020 /usr/bin/pkexec
-rwsr-xr-x. 1 root root 31984  4月  1  2020 /usr/bin/umount
-rwsr-xr-x. 1 root root 57656  8月  9  2019 /usr/bin/crontab
・・・・

ちなみに/etc/ssh/sshd_configは600じゃないとだめって決まってるがその理由は多分これで、同じくパーミッションのチェックが入ってる。
https://github.com/openssh/openssh-portable/blob/2f2ffa4fbe4b671bbffa0611f15ba44cff64d58e/auth.c#L509

sticky bit系のファイルも777にすると誰でも消せるようになるのであんまし良くない。

drwxrwxrwt.   6 root root  4096 11月 10 20:06 2020 tmp