概要
ファイルやディレクトリに対する許可属性を変更するchmod
コマンドですが、
「安易にchmod 777
とか使わないでねー」という注意をよく耳にします。
その理由として
- 第三者によって重要なファイルが読み取れる状態になり、セキュリティ上良くない
- sshできなくなる
- 一部コマンドが適切に実行できなくなる
などが挙げられます。
今回は「なぜ権限を変更することでコマンドが実行できなくなるのか」について、
その仕組みを学ぶため/usr/bin/sudo
で検証してみます。
sudoの権限を見てみる
$ ls -l /usr/bin/sudo
---s--x--x 1 root root 147240 Feb 8 2021 sudo
sudoはどのユーザーで実行してもrootで実行するというコマンドですが、「誰が実行しても所有者が実行したことになる」パーミッション属性を 「SUID」(Set User ID) と呼びます。
---s--x--x
パーミッション属性にはr,w,x (読み取り・書き込み・実行)の他に、SUIDの許可フラグがあり、実行権限が付与されているSUIDはs
, 実行権限のないSUIDはS
と表示される
sudoからSUID許可フラグを剥奪する
注意
以下の操作は実験用のサーバで実行しております。
大事なサーバで安易に真似しないようにしてください。
$ chmod 777 /usr/bin/sudo
$ ls -l /usr/bin/sudo
-rwxrwxrwx 1 root root 147240 Feb 8 2021 /usr/bin/sudo
$ sudo echo hello
sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set
chmod 777
を実行することによって、usr/bin/sudo
からSUID許可フラグが剥奪される。
その状態でsudoを実行すると
sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set
とエラーが発生し、コマンドを実行できなくなる。
ここでいうuid 0
とは、特権ユーザ(root)のことを指しており、rootによって所有されるべきコマンドなのに、パーミッション設定が適切でないためコマンドを正常に実行させない仕組みが働いている。
(chown
で所有ユーザをroot以外にしても同様のエラーが発生する)
元に戻す
ルートユーザにログインする
su root
chmodで元に戻します。
$ chmod 4111 /usr/bin/sudo
$ ls -l /usr/bin/sudo
---s--x--x 1 root root 147240 Feb 8 2021 sudo
# 正常に使えることを確認
$ sudo echo hello
hello
chmod 4111
所有ユーザ・グループ・その他ユーザに実行権限を付与するのに加え、SUID許可フラグを付与します。
まとめ
今回の検証では、「権限を書き換えたことによって、正常にsudoを実行できなくなる」ということが分かりました。
sudoだけが使えなくなるならルートユーザに切り替えて権限を元に戻せば大丈夫ですが、suやpasswdコマンドなど他の重要なコマンドが使えなくなったら、ルートユーザに切り替えて元に戻すこともできなくなり、その他重要な操作も行えなくなってしまうかもしれません。
(今回は権限変更によってコマンドが使えなくなる仕組みを検証してみましたが、chmod 777
によってファイルにアクセスできなくなったり、sshできなくなったりと他にもいろいろと問題があるみたいなので、近いうちに検証したいと思います。)
権限操作は慎重に行い、くれぐれもルートディレクトリで実行しないように気をつけたいものです。
参考