私はいつも「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()
ターゲット・ユーザーに対する変更が呼び出される子プロセスを作成します。- シェルまたはこのサブプロセスで引数として指定されたコマンドを実行します。