2013-08-03

sudoについて勘違いしていたこと

root権限を得てコマンドを実行するときの動作を通して、勘違いに気がついた。
sudoは 「指定したユーザーでコマンドを実行する」 ものであり、 「指定したユーザーの権限を得て、コマンド実行する」 ものでは無かった。

ここを混同していても問題ない場合もあるけれど、問題が生じる場合もあることもある。
例えば、fooユーザーでログインしている状態で、sudoでroot権限を得て何らかのファイルを削除する場合を考えてみたい。

$ whoami
foo
$ sudo rm test.txt  #パスワードの入力は省略

test.txtが削除される。削除が目的の場合、どのユーザーが削除したかは特に意識することは無いと思う。このようなケースでは問題無い。

しかし、例えばログインしているユーザーの環境変更などの操作をした際に問題が起こる。ここではログインシェルを変更する操作を例にする。

$ whoami
foo
$ echo $SHELL
/bin/bash
$ sudo chsh -s /bin/sh  # rootのログインシェルをbashからshに変更

上記の通りにコマンド実行すると、fooのログインシェルが変わるのではなく、rootのログインシェルが変更される。

sudoを「指定してユーザーの権限を得てコマンドを実行する」ものだと勘違いしていると、fooが一時的にroot権限を得て、自身のログインシェルを変更しているものだと思ってしまう。
だが実際には、「指定したユーザーでコマンド実行する」ので、fooの代わりにrootがchshコマンドを実行することになり、結果としてログインシェルが変更されるのはrootなのであった。