setuidとsetgid:UNIXにおける特権昇格のメカニズム
UNIX系オペレーティングシステムにおいて、`setuid`と`setgid`は、
実行ファイルのアクセス権を制御するための重要なフラグです。これらのフラグは、プログラムを実行する際に、そのプログラムの所有者やグループの権限で実行できるようにします。これにより、一般ユーザーが通常はアクセスできないリソースや機能を利用できるようになります。
setuid (Set User ID) と setgid (Set Group ID)
`setuid`は「Set User ID」の略で、
実行ファイルにこの属性が付与されていると、そのファイルを実行するユーザーの代わりに、ファイルの所有者のユーザーIDで
プロセスが実行されます。一方、`setgid`は「Set Group ID」の略で、同様に
実行ファイルのグループIDで
プロセスが実行されます。
これらのメカニズムは、特定のタスクを遂行するために必要な一時的な特権昇格を実現するために利用されます。例えば、ユーザーが自分のパスワードを変更する際など、一般ユーザーには許可されていない操作を行うために、これらのフラグが必要になります。また、ネットワークインターフェースに制御パケットを送信する`ping`コマンドなど、特権を必要とする一部のコマンドでも利用されます。
実行ファイルにおける setuid の挙動
実行ファイルに`setuid`属性が付与されている場合、一般ユーザーがそのファイルを実行すると、
プロセス生成時にファイルの所有者(通常は`root`)の権限が付与されます。これにより、アプリケーションは通常は一般ユーザーが実行できないタスクを実行できます。しかし、セキュリティ上のリスクも伴うため、`setuid`が付与されたプログラムの実行は慎重に行う必要があります。例えば、悪意のあるユーザーが、`setuid`属性を持つプログラムを悪用し、特権を取得する可能性があります。そのため、多くのシステムでは、
シェルスクリプトなどの
実行ファイルに`setuid`属性を付与することを禁止しています。
また、`setuid`
プロセスは、起動したユーザーによる
プロセスの操作を制限します。例えば、`ptrace`や`LD_LIBRARY_PATH`
環境変数の操作、シグナル送信などは禁止されます。ただし、端末からのシグナルは受け付けられます。
setgid の挙動
`setgid`属性は、
プロセスのグループベースの特権を変更します。`setuid`と同様に、ファイルのグループIDで
プロセスが実行されるため、グループに属するユーザーに対して特定の権限を付与する場合に利用されます。
chmod コマンドによる setuid/setgid の設定
`setuid`と`setgid`のビットは、通常、`chmod`コマンドで八進数形式の最上位桁に4または2を設定することで設定できます。例えば、`chmod 6711`とすると、`setuid`と`setgid`の両方のビットがセットされ、所有者は読み取り/書き込み/実行が可能で、グループとその他のユーザーは実行のみが許可されます。また、`chmod g+s`のようにシンボル形式で設定することも可能です。
ディレクトリにおける setuid/setgid の挙動
ディレクトリにおいて`setuid`と`setgid`は、
実行ファイルとは異なる意味を持ちます。
特に、
バージョン管理システム(CVSやSubversion)のリポジトリなど、複数のユーザーが共有する
ディレクトリで、グループによるアクセス制御を実現する際に`setgid`が利用されます。
ディレクトリに`setgid`を設定後、既存のファイルやサブ
ディレクトリのグループは変更されないため、必要に応じて`find`コマンドなどで設定する必要があります。
bash
find /path/to/directory -type d -print0 | xargs -0 chmod g+s
または
bash
find /path/to/directory -type d -exec chmod g+s {} \;
setuid の歴史
`setuid`ビットは、デニス・リッチーによって発明されました。
AT&Tは1972年に特許を申請し、1979年に「Protection of data file contents」として特許を取得しました。その後、この特許はパブリックドメインとなりました。
セキュリティ上の注意点
`setuid`と`setgid`は非常に便利な機能ですが、設定を誤るとセキュリティ上のリスクが高まります。特に、`setuid`属性を持つプログラムは、権限を悪用される可能性があるので、慎重に設計する必要があります。そのため、`setuid`属性を持つプログラムの利用は、必要な場合のみに限定し、セキュリティ対策を徹底することが重要です。
関連項目
外部リンク