私はいつも「sudo」が別のログインプロセスを開始したと思いました。具体的には、「root」をユーザー名として使用してログインするにはパスワードが必要です。プログラムを実行した後、シャットダウンしてログアウトします(またはセッションをしばらく開いたまま終了します)。どこでそんな言葉を聞いたのかはわかりませんが、私の考えはそんなに安いようです。
しかし、今私はこのsudoersオプションを見つけました。
ALL ALL = (root) NOPASSWD: /my/command
これにより、すべてのユーザーに対してrootとしてすべてのプログラムを実行できます。いいえパスワードを尋ねてください。これが私を気にする:
どのように動作しますか?プログラムはどのようにユーザー権限を取得しますか? sudoはサーバー(デーモンなどでrootとして実行)を取得し、そのサーバーに接続して実行する必要があるものを送信し、サーバーはroot権限でそれを実行しますか?
他のユーザーはどうですか?
これがどのように機能するかについての素晴らしく簡単な説明はありますか?
答え1
sudo
次の出力からわかるように、いわゆる「SetUIDバイナリ」ですls -l
。
$ ls -l /usr/bin/sudo
-rwsr-xr-x 1 root root 159016 Mar 21 20:40 /usr/bin/sudo
s
4番目の列(通常は実行可能x
ファイルを見つける場所)は、SetUIDビットが設定されていることを示します。このビットは重要な意味を持ちます。 SetUIDビットが設定されたバイナリが実行されると、呼び出し側のユーザーIDとして実行されるのではなく、バイナリ所有者(この場合root
)のユーザーIDとして実行されます。
それが手がかりです。 sudo
常にスーパーユーザー権限(例root
:)で実行してください。したがって、sudo
許可されたシステム機能のみを呼び出すなど、一部の特権タスクを実行できますroot
。これらのシステムコールの中で最も重要なのはsetuid(2)
and Friendsです。setuid()
プロセスを呼び出すと、次のことができます。変化UIDを目的のUIDに変更します(したがって、他のユーザーとして偽装)。
これがすることはsudo
:
/etc/sudoers
呼び出すユーザーとその権限を見つけるために読み、解析します。- 呼び出し側のユーザーのパスワードを尋ねます(通常はユーザーのパスワードですが、ターゲットユーザーのパスワード、または次のようにスキップすることもできます
NOPASSWD
)。 setuid()
ターゲット・ユーザーに対する変更が呼び出される子プロセスを作成します。- シェルまたはこのサブプロセスで引数として指定されたコマンドを実行します。
答え2
簡単な答えはバイナリsuid
のフラグですsudo
。
ls -l /usr/bin/sudo
---s--x--x. 1 root root 130712 02-26 13:31 /usr/bin/sudo
実行可能ファイルのフラグを使用すると、ルートまたは非ルート人を実行している人に関係なく、バイナリはsuid
システムコールを実行できます。setuid()
残りは個々のバイナリの指示と構成によって異なります。の場合は、sudo
構成ファイル(通常は/etc/sudoers
)を解析してアップグレードを進めるかどうかを決定します。
一部のファイルでは、タイムスタンプ情報はrootユーザーに制限されています。サンプルサーバーの次の例は、アップグレードがsudo
タイムスタンプ情報を提供できる方法を示しています。
[artur@asus-ux21e ~]$ sudo ls -l /var/db/sudo/artur
total 12
-rw-------. 1 root artur 48 04-24 14:07 0
-rw-------. 1 root artur 48 04-24 11:27 1
-rw-------. 1 root artur 48 04-24 11:26 2