(Translated by https://www.hiragana.jp/)
setuid - Wikipedia コンテンツにスキップ

setuid

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』

setuidsetgid は、UNIXにおけるアクセスけんあらわすフラグの名称めいしょうであり、ユーザーが実行じっこうファイル実行じっこうするさいにその実行じっこうファイルの所有しょゆうしゃやグループの権限けんげん実行じっこうできるようにする。それぞれ、set user IDset group IDりゃく一般いっぱんユーザーがたか特権とっけんレベルでしか実行じっこうできないタスクを一時いちじてき実行じっこうできるようにする仕組しくみである。提供ていきょうされるユーザー識別子しきべつしグループ識別子しきべつしによってかなら特権とっけんレベルがたかくなるわけではないが、すくなくともそれら識別子しきべつし特定とくていのものが指定していされている。

setuid と setgid は一般いっぱんユーザーよりもたか特権とっけんレベルが必要ひつようとされるタスクの実行じっこう必要ひつようである。たとえば、そのユーザーのログインパスワードの変更へんこうなどである。なかには意外いがいなタスクで特権とっけんレベルをげる必要ひつようがあることもある。たとえば、ping コマンドはネットワークインタフェースじょう制御せいぎょパケットおくり、応答おうとう必要ひつようがあり、特権とっけん必要ひつようである(なお、現在げんざいではsetuid以外いがい方法ほうほう権限けんげん管理かんりしている場合ばあいもあるため、pingにsetuid属性ぞくせい付与ふよされているとはかぎらない[1][2])。

実行じっこうファイルでの setuid

[編集へんしゅう]

バイナリ実行じっこうファイルに setuid 属性ぞくせい付与ふよしたとき、一般いっぱんユーザーがそのファイルを実行じっこうすると、プロセス生成せいせいにそのファイルの所有しょゆうしゃ通常つうじょうroot)の特権とっけんることができる。root の権限けんげんがそのプロセスにあたえられると、そのアプリケーションは一般いっぱんユーザーが通常つうじょうならできないタスクを実行じっこうできるようになる。それを起動きどうしたユーザーがそのプロセスをなにとかして通常つうじょうでないうごきをさせようとしても、それは禁止きんしされている。たとえば、ptrace使つかったり、LD_LIBRARY_PATH をいじったり、シグナルおくったりといったことである(端末たんまつからのシグナルだけはけられる)。セキュリティじょう危険きけんせいすため、おおくのオペレーティングシステムではシェルスクリプト形式けいしき実行じっこうファイルへの setuid 属性ぞくせい付与ふよ無視むしするようになっている。

setuid 機能きのう非常ひじょう便利べんりだが、注意深ちゅういぶか設計せっけいでされていないプログラムの実行じっこうファイルに setuid 属性ぞくせい付与ふよすると、セキュリティじょう危険きけんせいしょうじる。悪意あくいあるユーザーがそのような実行じっこうファイルを利用りようして特権とっけんたり、一般いっぱんユーザーがづかないうちにトロイの木馬もくば実行じっこうしてしまうといった可能かのうせいがある。

setgid 属性ぞくせいはプロセスのグループベースの特権とっけん変更へんこうする。

setuid 属性ぞくせいがあるのは、UNIXにおいて一般いっぱんユーザーが chroot システムコール実行じっこうできないためである。

setuid ビットと setgid ビットは通常つうじょうchmod コマンドではち進数しんすう形式けいしきさい上位じょういけたを 4 または 2(両方りょうほうなら 6)を設定せっていすることでセットされる。'chmod 6711' としたとき、setuid ビットと setgid ビットがセットされ(6)、所有しょゆうしゃり/み/実行じっこう可能かのうで(7)、グループとそののユーザーは実行じっこうだけ可能かのうとなる(11)。なお、さい上位じょういけた最下位さいかいビットはスティッキービットである。

chmod にはおおくの場合ばあい、これらのビットをシンボルで指定していするシンボリックモードもある。下記かき実施じっしれい使つかっている 'chmod g+s' はそのれいである。

実施じっしれいにあるC言語げんごのプログラムは、プロセスのじつユーザー識別子しきべつしじつグループ識別子しきべつしおよび実効じっこうユーザー識別子しきべつし実効じっこうグループ識別子しきべつし表示ひょうじするだけのものである。実施じっしれいではまず、このプログラムを 'bob' というユーザーでコンパイルし、'chmod' を使つかって setuid と setgid をセットしている。'su' コマンド自身じしんも setuid 機能きのう使つかっているが、ここではユーザーを 'alice' に変更へんこうするために使つかわれている。'chmod' コマンドの効果こうかは 'ls -l' でチェックでき、最終さいしゅうてきにデモプログラムが実行じっこうされ、識別子しきべつし変更へんこうされていることが表示ひょうじされる。/etc/passwd ファイルの内容ないよう比較ひかくしていただきたい。

なお、'nosuid' オプションきでマウントされたボリュームじょうでは、このプログラムの実効じっこうユーザー識別子しきべつし変更へんこう無視むしされる(変更へんこうされず、エラーも表示ひょうじされない)。

実施じっしれい

[編集へんしゅう]
[bob@foo]$ cat /etc/passwd
alice:x:1007:1007::/home/alice:/bin/bash
bob:x:1008:1008::/home/bob:/bin/bash

[bob@foo]$ cat printid.c

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(void)
{
    printf("Real UID\t= %d\n", getuid());
    printf("Effective UID\t= %d\n", geteuid());
    printf("Real GID\t= %d\n", getgid());
    printf("Effective GID\t= %d\n", getegid());

    return EXIT_SUCCESS;
}

[bob@foo]$ gcc -Wall printid.c -o printid
[bob@foo]$ chmod ug+s printid
[bob@foo]$ su alice 
Password: 
[alice@foo]$ ls -l
-rwsr-sr-x 1 bob bob 6944 2007-11-06 10:22 printid
[alice@foo]$ ./printid 
Real UID        = 1007
Effective UID   = 1008
Real GID        = 1007
Effective GID   = 1008
[alice@foo]$

ディレクトリでの setuid

[編集へんしゅう]

setuid と setgid はディレクトリではまったべつ意味いみつ。

ディレクトリでsetgidパーミッションを設定せっていすると(chmod g+s)、そのそのディレクトリ配下はいか作成さくせいされるファイルやサブディレクトリはそのグループを継承けいしょうする(作成さくせいしたユーザーのしゅグループは無視むしされる。影響えいきょうけるのはグループだけで、所有しょゆうしゃ通常つうじょうどおりである)。あらたに作成さくせいされるサブディレクトリは setgid ビットも継承けいしょうする。

典型てんけいてき使用しようれいは、グループあいだ共有きょうゆうされるディレクトリ、とくCVSSubversionのリポジトリにたいして設定せっていすることである。バージョン管理かんりシステムのプロセスが適切てきせつumask一般いっぱんてきに002)でリポジトリにアクセスすることで、GIDを利用りようしたアクセス制御せいぎょ可能かのうとなる。

既存きそんのファイルやサブディレクトリはもとのままであるてん注意ちゅうい必要ひつようである。既存きそんのサブディレクトリへの setgid ビットの設定せっていおこな必要ひつようがある。そのコマンドぎょう以下いかのようになる。

find /path/to/directory -type d -print0 | xargs -0 chmod g+s

または

[root@foo]# find /path/to/directory -type d -exec chmod g+s {} \;

setuidパーミッションをディレクトリに設定せっていしようとしても、UNIX や Linux では無視むしされる[3]FreeBSDでは設定せってい可能かのうであり、setgid と同様どうよう解釈かいしゃくされる。すなわち、配下はいかのファイルやサブディレクトリはそのディレクトリとおな所有しょゆうしゃとなるよう設定せっていされる[4]

歴史れきし

[編集へんしゅう]

setuid ビットはデニス・リッチー発明はつめいした。リッチーをやとっていたAT&Tは1972ねんにその特許とっきょ申請しんせいし、1979ねん特許とっきょ "Protection of data file contents"(4,135,240)が成立せいりつした。この特許とっきょのちにパブリックドメインとされた。[5]

脚注きゃくちゅう

[編集へんしゅう]
  1. ^ だい42かい Linuxカーネルのケーパビリティ[1] | gihyo.jp”. gihyo.jp⁠. 2024ねん4がつ9にち閲覧えつらん
  2. ^ Changes/EnableSysctlPingGroupRange - Fedora Project Wiki”. Fedora Project. 2024ねん4がつ9にち閲覧えつらん
  3. ^ Bauer, Mick (2004ねん). “Paranoid Penguin - Linux Filesystem Security, Part II”. linuxjournal.com. 2008ねん6がつ24にち閲覧えつらん
  4. ^ chmod manpage on www.freebsd.org”. 2008ねん6がつ24にち閲覧えつらん
  5. ^ Summary of key software patents”. 2008ねん6がつ24にち閲覧えつらん

関連かんれん項目こうもく

[編集へんしゅう]

外部がいぶリンク

[編集へんしゅう]