質問: 調べたら、「実行可能ファイルの所有者として実行される。ディレクトリに設定したら無視される」 と書いてありました。 > > 以降検証のためにやったこと。 > -------------- > > > 「ec2-user」と「test」の二つのユーザーがいて、testユーザーに切り替えます。 /home/testをほかのユーザーが読みと実行ができるようにします。 drwx---r-x 2 test test 4096 Jun 2 10:31 /home/test testディレクトリにcommand.shを置きます。command.shの中は以下の通りです。 ``` #!/bin/sh /usr/bin/id ``` このcommand.shを以下の権限にします。setuidを付けます。 ``` ls -l /home/test/command.sh -rws---r-x 1 test test 22 Jun 2 10:31 /home/test/command.sh ``` ec2-userに切り替え以下を実行 ``` cd /home/test ./command.sh 実行結果は uid=500(ec2-user) gid=500(ec2-user) groups=500(ec2-user),10(wheel) ``` ここでおもったのが、setuidでtestユーザーとして実行されるのなら実行結果はtestユーザーに関しての情報がでると思っています。 > 実行可能ファイルの所有者として実行される command.shの所有者はtestユーザーです。ec2-userでcommand.shを実行してもtestユーザーとして実行されるのではないのでしょうか?だとしたら実行結果はtestの情報が出るべきではないのでしょうか?
回答: セキュリティ上、シェルスクリプトでは`setuid`は無効となっていることが多いです。 `setuid`を使っている身近な例としては、`passwd`プログラムがあります。パスワードのファイル(`/etc/passwd`や`/etc/shadow`)はrootしか書き込みができませんが、そのままではユーザー自身のパスワード変更も不可能となります。そこで`passwd`プログラムを`setuid`しておいて、一般ユーザーでも自分自身のパスワードは変更できるようになっています。 あと、ICMPパケットを送るために`ping`や`traceroute`も`setuid`してあります。