setuidとは
setuidは、一般ユーザーがrootユーザー権限でプログラムを実行できる仕組みです。例えば一般ユーザー”vpsuser“が実行可能ファイルhogehoge をroot権限で実行したいとします。
通常ならばvpsuserがhogehogeを実行すると、一般ユーザーvpsuserの権限で実行されますので、root権限で実行することはできません。
しかし、hogehogeにsetuidをつけてあげると、
一般ユーザーvpsuserがhogehogeをroot権限で実行することが可能になります。
ただし、実行ファイルはシェルスクリプトではダメです。バイナリ実行ファイルである必要があります。
実験してみます。
例として、以下のc言語プログラムsetuid_test.cを用意します。
setuid_test.txt という空のファイルをつくるプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <sys types.h=""> #include <sys stat.h=""> #include <fcntl.h> #include <stdlib.h> int main(void); int main(void){ int fd; /* create a file */ fd = creat("setuid_test.txt", 0644); if(fd!=-1) close(fd); } |
$ gcc -o setuid_test setuid_test.c実行ファイルは以下のように、所有者=vpsuser、グループ=vpsuserになっています。
$ ls -l
-rwxr-xr-x 1 vpsuser vpsuser 6579 3月 15 16:38 2016 setuid_test
ここで、この実行ファイルの所有者をrootにして、setuidを設定してみます。(rootユーザーで作業してください)
# chown root setuid_test # chmod 4755 setuid_test # ls -l -rwsr-xr-x 1 root vpsuser 6579 3月 15 16:38 2016 setuid_testlsで確認すると、所有者がroot、rwxのユーザーの部分がrwsとなり、setuidが有効になっていることが分かります。
この状態で一般ユーザーvpsuserでsetuid_testを実行します。
$ ./setuid_test
$ ls -l
-rwsr-xr-x 1 root vpsuser 6579 3月 15 16:38 2016 setuid_test
-rw-r--r-- 1 root vpsuser 0 3月 15 17:04 2016 setuid_test.txt
vpsuserで実行したsetuid_testはroot権限で実行されますので、そのプログラム内で作られた空ファイルは所有者がrootになります。setuidの設定の方法
先ほど紹介したchmod 4755 setuid_test
の4がsetuidセットを意味します。そのあとの755は通常の権限の設定です。
setuidを無効化するには、
chmod 0755 setuid_testのように0をセットすれば良いです。
また、
chmod u+s setuid_test chmod u-s setuid_testのような書き方もできます。
参考:
setuid, setgid, sticky bit:太陽と月:So-netブログ setuid は慎重に
setgidとは
setgidは、setuidのグループ版です。setgidをセットすると、実行ファイルの所有グループの権限で実行することができます。
コマンドは
chmod 2755 setgid_testのように、2をセットすることでsetgidが有効になります。
chmod g+s setgid_test chmod g-s setgid_testのような書き方もできます。
また、setgidをディレクトリに対してセットした場合、
そのディレクトリの下に作られるファイルは、ディレクトリの所有グループの名前になります。
スティッキービットとは
スティッキービット(Sticky Bit)とは、ディレクトリに設定される特殊なアクセス権の事です。スティッキービット(Sticky Bit)が設定されたディレクトリでは、すべてのユーザーがファイルやディレクトリを作成・更新できますが、所有者だけ(rootは除く)しか削除できなくなります。
chmod 1755 dirnameのように1をセットすることでスティッキービットが有効になります。
chmod o+t dirname chmod o-t dirnameのような書き方もできます。
参考
スティッキービット(Sticky Bit) – 特殊なアクセス権