作者:上村崇 フリーランスのIT系エンジニア
twitter:@uemera facebook:uemura

Linuxの権限について解説。setuidとかsetgidとかスティッキービットとか


setuidとは

例えば一般ユーザー”vpsuser“が実行可能ファイルhogehoge をroot権限で実行したいとします。
通常ならばvpsuserがhogehogeを実行すると、一般ユーザーvpsuserの権限で実行されますので、root権限で実行することはできません。
しかし、hogehogeにsetuidをつけてあげると、
一般ユーザーvpsuserがhogehogeをroot権限で実行することが可能になります。
ただし、実行ファイルはシェルスクリプトではダメです。バイナリ実行ファイルである必要があります。

実験してみます。
例として、以下のc言語プログラムsetuid_test.cを用意します。
setuid_test.txt という空のファイルをつくるプログラムです。
一般ユーザーvpsuserでコンパイルして、setuid_testという実行ファイル(=バイナリの実行ファイル)を作ります。
$ 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_test
lsで確認すると、所有者が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) – 特殊なアクセス権

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です