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なのであった。

h3pei
フリーランスのソフトウェアエンジニア。Ruby / Rails アプリケーションの開発が得意領域。設計・実装・運用まで含めてプロダクト開発が好きです。
Questalという目標達成コミュニティサービスを開発しました。仲間と一緒に目標達成に取り組みたい方はぜひご利用ください。
<< 前の記事【Linux】ハードリンクとシンボリックリンク
次の記事 >>ビルドとかコンパイルとかリンクとか