sudoは内部的にどのように機能しますか?

sudoは内部的にどのように機能しますか?

内部的にはどのように機能しますか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と同じことを行います。

引用する

おすすめ記事