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


74

sudo内部的にはどのように機能しますか?どうして、rootパスワードを持たなくてもrootになることができるのsuでしょうか?どのシステムコールなどがプロセスに関与していますか?Linuxの大きなセキュリティホールではありませんか(たとえば、sudo通常の処理を実行するだけsudoで、特権のないユーザーのパスワードを要求しない、非常に多くの修正プログラムをコンパイルできないのはなぜですか)。

loginとsu internalsを読みました。また、sudoの使用方法を読んでいます。しかし、タイトルにもかかわらず、彼らは主の間の違いに対処suしてsudo

回答:


80

実行可能ファイルを見ると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と同じことを行います。

参照資料


4
あなたは使用する必要がありますsudo -s代わりにsudo su、それはの無駄な使用だからsu。:)
トーター

4

実際のsudoバイナリはsetuid rootであり、このように設定されたファイルを単に存在させることはできません。

setuidおよびsetgid(「実行時にユーザーIDを設定」および「実行時にグループIDを設定」の略)[1]は、ユーザーが実行可能ファイルの所有者またはグループの許可で実行可能ファイルを実行できるようにするUnixアクセス権フラグです。ディレクトリ内の動作を変更します。


さて、それは私の質問の一部に答えます。あなたはsudoは、このビットが何をするか、私はこの答えを受け入れてみたいにもう少しこのビットを使用し、どのように手の込んだしたい場合
strugee

2

誰も触れていないように見えるsyscallに関する部分に答えるために、重要なsyscallの1つはsetresuid()またはsetresgid()のいずれかです。他にもあると思いますが、これら2つはsetuid / sudoに非常に固有のようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.