実行可能ファイルを見るとsudo
:
$ which sudo
/usr/bin/sudo
$ ls -la /usr/bin/sudo
---s--x--x 2 root root 208808 Jun 3 2011 /usr/bin/sudo
許可ビットが含まれていることに気付くでしょう---s--x--x
。これらは次のように分類できます。
-|--s|--x|--x
- - first dash denotes if a directory or a file ("d" = dir, "-" = file)
--s - only the setuid bit is enabled for user who owns file
--x - only the group execute bit is enabled
--x - only the other execute bit is enabled
そのため、プログラムのsetuidビットが有効になっている(SUIDとも呼ばれる)場合、このプログラムを実行すると、ファイルを所有するユーザーの資格情報(別名)で実行されます。この場合のルート。
例
ユーザーsamlとして次のコマンドを実行した場合:
$ whoami
saml
$ sudo su -
[sudo] password for saml:
の実行がsudo
実際にルートとして実行されていることがわかります。
$ ps -eaf|grep sudo
root 20399 2353 0 05:07 pts/13 00:00:00 sudo su -
setuidメカニズム
SUIDの動作に興味がある場合は、をご覧くださいman setuid
。マニュアルページからの抜粋を以下に示します。
setuid()は、呼び出しプロセスの実効ユーザーIDを設定します。呼び出し元の実効UIDがルートの場合、実際のUIDと保存されたset-user-IDも設定されます。Linuxでは、setuid()は_POSIX_SAVED_IDS機能を備えたPOSIXバージョンのように実装されます。これにより、(root以外の)set-user-IDプログラムは、すべてのユーザー特権を削除し、特権のない作業を行ってから、元の有効なユーザーIDを安全な方法で再利用できます。
ユーザーがrootであるか、プログラムがset-user-ID-rootである場合、特別な注意が必要です。setuid()関数は、呼び出し元の実効ユーザーIDをチェックし、それがスーパーユーザーである場合、すべてのプロセス関連ユーザーIDはuidに設定されます。これが発生した後、プログラムがルート権限を取り戻すことは不可能です。
ここで重要な概念は、プログラムが実際のユーザーID(UID)と有効なユーザーID(EUID)を持っているということです。このビットが有効な場合、Setuidは有効なユーザーID(EUID)を設定しています。
そのため、カーネルの観点からは、この例でsaml
はまだ元の所有者(UID)であることがわかっていますが、EUIDは実行可能ファイルの所有者に設定されています。
setgid
また、sudoコマンドのアクセス許可を分解するとき、2番目のビットグループはグループアクセス許可用であることにも言及する必要があります。グループビットには、set group id(別名、setgid、SGID)と呼ばれるsetuidに似たものもあります。これは、所有者の資格情報ではなくグループの資格情報でプロセスを実行することを除いて、SUIDと同じことを行います。
参照資料
sudo -s
代わりにsudo su
、それはの無駄な使用だからsu
。:)