内部的にはどのように機能しますかsudo
?ルートとは異なり、ルートパスワードなしでルートになる方法は何ですかsu
?このプロセスにはどのようなシステムコールなどが含まれますか?これはLinuxの大きなセキュリティ抜け穴ではありません(たとえば、一般sudo
的な操作だけを実行するsudo
が権限のないユーザーのパスワードを要求しない大規模なパッチバージョンをコンパイルできないのはなぜですか?)
私が読んでログインと su 内部構造。私も読んだsudoはどのように使用されますか?しかし、タイトルにもかかわらず主su
にとの違いを扱っていますsudo
。
ベストアンサー1
実行ファイルを見ると次のようになります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
これが実際にrootとして実行されていることがわかります。
$ 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バージョンと同様に実装されています。これにより、設定されたユーザーID(ルートを除く)プログラムは、すべてのユーザー権限を放棄し、特権のないいくつかの操作を実行し、元の有効なユーザーIDを安全な方法で再利用できます。
ユーザーがrootまたはプログラムがset-user-ID-rootの場合は、特別な注意が必要です。 setuid()関数は呼び出し元の有効なユーザーIDを確認し、スーパーユーザーの場合はすべてのプロセス関連のユーザーIDをuidに設定します。これが発生した後、プログラムがroot権限を再取得することは不可能になります。
ここで重要な概念は、プログラムに実際のユーザーID(UID)と実効ユーザーID(EUID)があることです。このビットが有効になると、Setuidは有効なユーザーID(EUID)を設定します。
したがって、カーネルの観点から見ると、この例ではsaml
依然として元の所有者(UID)ですが、EUIDは実行可能ファイルの所有者に設定されています。
設定
また、sudoコマンドの権限を分析するときは、2番目のビットセットがグループ権限に使用されることにも注意する必要があります。グループビットには、set group id(setgid、SGIDとも呼ばれます)というsetuidに似たエントリもあります。これは、所有者の資格情報の代わりにグループ資格情報を使用してプロセスを実行することを除いて、SUIDと同じことを行います。