sudoコマンドにrootパスワードが必要ないのはなぜですか?


48

私はしばらくの間Linuxを使用しており、入力するたびにsudo、コマンドのためにrootユーザーに切り替えると思っていました。

どうやらこれは真実ではないようです。なぜなら、必要なのはユーザーアカウントのパスワードだけだからです。私は複数のユーザーと仕事をしていないので、現実の世界ではこれに気づいていないと思います。

Ubuntuが最初のアカウントをどのように設定するのかわかりません。ルートユーザーはいますか?私はルートですか?インストール時に新しいユーザーを作成したばかりなのに、root権限が与えられたのでしょうか?ここで少し混乱しています...

では、なぜユーザーのパスワードでrootコマンドを実行できるのですか?


パスワードを必要とするユーザーと使用しないユーザーを使用しますか?実行しているコマンドは何ですか?sudoは、パスワードを再入力するまでしばらく保存します。
Braiam 14

11
sudo「setuid」ビットが設定されています。したがって、それを起動するユーザーではなく、それを所有するユーザー(私が間違えなければすべての標準システムのルート)として実行されます。 sudo次に/etc/sudoersファイルをロードし、誰がファイルを起動したかに基づいて許可されている内容を確認します。
ローレンス


1
誰か他の人が言ったことを繰り返して申し訳ありませんが、それを見つけることができませんでした。答えは次のとおりです。それは政策決定です。動機付けの私の最高の推測は、sudo特権を持つ多くの人々がいる大規模なインストールでは、おそらく地理的に分散した場所で、24時間365日勤務で、あなたはすぐに1人の特権アクセスを取り消すことができることを望むことですあなたは彼の整合性を疑います)。誰もが唯一のルートパスワードを使用している場合、事前の調整なしでそれを変更すると、混乱が生じる可能性があります。…
G-Manが「Reinstate Monica」と言う

1
@HagenvonEitzen私は数日遅れていることは知っていますが、これは私たちの質問のduではないのですか?
strugee

回答:


65

詳細には、次のように機能します。

  1. /usr/bin/sudo実行可能ファイルにはsetuidビットが設定されているため、別のユーザーが実行した場合でも、ファイル所有者のユーザーID(その場合はルート)で実行されます。

  2. sudo/etc/sudoersファイルにある特権を確認し、呼び出しているコマンドの実行が許可されているかどうかを確認します。簡単に言うと、/etc/sudoersどのユーザーがsudoメカニズムを使用してどのコマンドを実行できるかを定義するファイルです。

    それが、そのファイルが私のUbuntuでどのように見えるかです:

    # User privilege specification
    root    ALL=(ALL:ALL) ALL
    
    # Members of the admin group may gain root privileges
    %admin ALL=(ALL) ALL
    
    # Allow members of group sudo to execute any command
    %sudo   ALL=(ALL:ALL) ALL
    

    3行目は、おそらくあなたが興味を持っていることです。「sudo」グループの誰でも、任意のユーザーとして任意のコマンドを実行できます。

    Ubuntuがインストール中に最初のアカウントを設定すると、そのアカウントが「sudo」グループに追加されます。どのユーザーがどのグループに属しているかをgroupコマンドで確認できます。

  3. sudoパスワードの入力を求められます。ルートのパスワードではなくユーザーのパスワードが必要であるという事実に関して、それはsudoersマニュアルからの抜粋です:

    認証とログ

    sudoersセキュリティポリシーでは、ほとんどのユーザーがsudoを使用する前に自分自身を認証する必要があります。呼び出しユーザーがrootである場合、ターゲットユーザーが呼び出しユーザーと同じである場合、またはポリシーがユーザーまたはコマンドの認証を無効にしている場合、パスワードは必要ありません。su(1)とは異なり、sudoersは認証を必要とする場合、ターゲットユーザー(またはルート)の資格情報ではなく、呼び出し元のユーザーの資格情報を検証します。これは、後述のrootpw、targetpw、runaspwフラグを使用して変更できます。

    ただし、実際にsudoは、ユーザーパスワードは必要ありません。本当に危険なコマンドを呼び出す前に、あなたが本当にあなたであることを確認し、何らかの警告(または停止する機会)を提供するためだけに要求します。パスワードの確認をオフにする場合は、sudoersエントリを次のように変更します。

    %sudo   ALL=(ALL:ALL) NOPASSWD: ALL
    
  4. 認証後sudo、呼び出されたコマンドを実行する子プロセスが生成されます。子は、親であるsudoプロセスからルートユーザーIDを継承します。


それで、あなたの質問に正確に答えます:

私はコマンドのためにルートユーザーに切り替えると思っていました。

あなたは正しかった。先行する各コマンドはsudo、rootユーザーID で実行されます。

ルートユーザーはいますか?

はい、システムのインストール中に作成されたユーザーアカウントとは別のルートユーザーアカウントがあります。ただし、Ubuntuのデフォルトでは、rootユーザーとして対話式端末にログインすることは許可されていません。

私はルートですか?

いいえ、あなたはルートではありません。あなたは唯一のルートとして、個々のコマンドを実行する権限を持って使用して、sudo上述のメカニズムを。

では、なぜユーザーのパスワードでrootコマンドを実行できるのですか?

ユーザーのパスワードを入力する必要があるのは、sudo内部セキュリティメカニズムのみです。簡単にオフにできます。rootの権限を取得するに/usr/bin/sudoは、パスワードを入力するのではなく、setuidビットを使用します。


6
答えは実際にsetuid部分から始める必要があります。それが実際に可能な理由だからです。/ etc / sudoersは、sudoコマンドの柔軟性の理由にすぎません。
ダニエルクルマン14

面白い。sudoパスワードを入力せずに実行できることを指定できるとは知りませんでした。素晴らしい答えです!
jwir3 14

1
sudoは、のrootpwフラグを使用してルートパスワードを要求するように設定できることに注意してくださいsudoers
モニカ

2
あなたはできる rootユーザーとして、実際のログインに:sudo su - rootちょうどそれを行うと、あなたのルート端末を提供します。ただし、rootとしてデスクトップセッションに簡単にログインすることはできません。
jmiserez

1
基本的にsudoそれ自体にルート特権があり、構成ファイルに基づいてそれをユーザーに付与するかどうかを決定します。
思源レン

15
  • 全体のポイントはsudo、他のアカウントのパスワードを要求することなく、他の誰かの特権(通常はroot)をあなたに付与することです(とは異なりますsu)。

  • sudo 通行人がロック解除された端末を誤用しないようにするために、ここでパスワードを尋ねています。

  • Ubuntuおよび他の多くのLinuxおよびUnix OSは、インストール時に作成された初期アカウントに、すべてのコマンドを実行する権限を付与していますroot

  • 一方でroot、まだLinuxでのアカウントで、直接rootログインはより優れたセキュリティおよびトレーサビリティのために、デフォルトでは無効になっています。


7
直接ルートログインはデフォルトで実際に無効になっていますが、Ubuntuにはまだルートアカウントがあります。少なくともSolaris上では、デフォルトで役割であるアカウントではなくなりました。
jlliagre

どうもありがとう-とにかくそれがどのように機能するのかいつも疑問に思っていましたが、今ではもっと理にかなっています。
mikeserv 14

5

Piotrは、どのようにsudo機能するかについて非常に良い説明をしました。しかし、彼はそれがなぜこのように機能するのかを実際に動機付けていないので、ここでそれを追加しようとします。

sudoコマンドが作成される前に、コマンドがありましたsu。このコマンドを使用すると、通常、1人のユーザーが別のユーザーとしてコマンドを実行できますrootsudoこれは、デフォルトのターゲットユーザーです)。それはまったく無差別でした。あなたはどんなコマンドでも実行できます。任意のユーザーが使用できるため、そのユーザーとしてログインするのと実質的に同等であるため、ターゲットユーザーのパスワードを知っている必要があります。

ある時点で、もう少しアクセス制御が追加されました。使用するsuには、wheelグループのメンバーである必要がありました。しかし、まだコマンドを実行できるので、パスワードを知っていることを要求することは意味があります。

ただし、ユーザーに互いのパスワードまたはスーパーユーザーのパスワードを知ってもらうことは、あまり安全ではありませんでした。多くの場合、特定のユーザーに他のアカウントへのアクセスを制限したいだけです(これは最小特権の原則と呼ばれるセキュリティ概念の一部です)。また、説明責任が難しくなります。複数の人がアカウントのパスワードを知っていて、そのアカウントが間違いや悪用に関係している場合、誰が実際にそれをやったのかわかりません。

だから、sudo作成されました。ユーザーにコマンドの実行を許可するのではなく、Piotrの回答で簡単に触れた精巧な構成ファイルを使用して、それを使用できるユーザー、切り替え可能なユーザー、および実行を許可するコマンドを正確に指定します。誰が誰に何をできるかをきめ細かく制御することで、ユーザーにターゲットアカウントのパスワードを与える必要がなくなりました。その場合、ユーザーとしてログインすることで、構成ファイル内のすべてのコントロールを簡単にバイパスできます。代わりに、通常、自分のパスワードを入力することで、ログインしているユーザーであることを証明するように要求します。これは、端末が無人のままになった場合に誰かがアカウントを利用できないようにするためです。

この要件はスーパーユーザーには免除されます。このアカウントはを使用せずにシステムに対してほとんど何でも実行できるため、不要sudoであると見なされました。ユーザーがパスワードをまったく入力する必要がないことを構成ファイルで指定することもできます。一部の組織は、ワークステーション環境の物理的なセキュリティが悪用を防ぐのに十分であると考える場合にこれを使用します。


私はこれを探求していませんが、suが持っていないsudoの機能の1つは、どのユーザーがどのコマンドを実行したかをログに記録して、問題を簡単に追跡できることですそのソース。kubuntuシステムを調べたところ、このようなログが表示されないため、これはデフォルトの動作ではない可能性があります。
ジョー14

/var/log/auth.logにsudoロギングが見つかりました-私のシステムへのルートsshアクセスを取得しようとしている中国からのIPを含む他の多くのものとともに-sudoを表示したいだけなら、フィルタリングする必要がありますgrepまたは同様の方法で実行します。
ジョー14

正しい。suログも記録しますが、新しいシェルを開始するだけなので、誰かが実行したという事実を記録するだけです。
バーマー14

ログに依存することはできません。rootを取得できるユーザーは誰でもログを変更できます(別のマシンにログを記録し、ロギングトランザクションが完了するまでアクセスを許可しない限り)。ただしsudo、rootパスワードを必要とする全員に再発行することなく、特権を取り消すことができます。
ctrl-alt-delor

1
@richard sudoユーザーが実行できるコマンドを制限できるため、ログを上書きするコマンドへのアクセスを許可しないようにすることができます。
バーマー

3

あなたの質問に対する答えは:

sudoでコマンドを実行すると、昇格された特権、つまりルート特権でコマンドが実行されます。あなた(ユーザー)はルート権限を付与するsudoersファイルに追加されているため、通常のユーザーパスワードを入力するだけです。


2
sudoを除いて、昇格された特権を意味するのではなく、現在のユーザーとは異なる特権だけを意味します。たとえば、シェルを持たない通常のユーザーとしてプログラムを実行できます。また、sudoersファイルに含まれているからといって、rootになりません。
ジェームズトックネル14

1
@aragilar yes sudoは常に昇格された特権を与えるわけではありませんが、それを実行した後、昇格された特権で実行されます(認証を確認し、特権を落とす場合があります)。ユーザーを変更するには、これらの昇格された権限が必要です。
ctrl-alt-delor

1
確かに、sudo昇格された特権を使用しますが(これはsudoに固有ではありません。たとえば、mountも同様です)、呼び出すコマンドはそうcommandsudo commandはありません(設定内容によって異なり /etc/sudoersます)。
ジェームズトックネル

1

まず、アカウントの無効化は通常、暗号化されたパスワードを*に設定することで行われます。これは、文字列の暗号化された値ではありません。今すぐ確認することはできませんが、Ubuntuがルートに対してもそれを行うと信じています。技術的には、Ubuntuにはrootパスワードはありません。

ただし、sudoはUbuntuに先行します。ルートパスワードが確実に存在するシステム用に設計されました。では、なぜrootパスワードが必要ないのでしょうか?基本的に、sudoは特定のユーザーに特定のコマンドを実行する許可を与えるように設計されています。たとえば、開発者のrootアクセスを許可してWebアプリケーションを再起動できますが、任意のサーバーは起動できません。一方、rootパスワードを知っていると、無制限にアクセスできます。loginまたはsuを使用してルートシェルを開き、任意のコマンドを実行できます。sudoはそのレベルのアクセス権を持たない人のために機能する必要があるため、実行するためにルートパスワードを要求することはできません。


また、rootパスワードを変更せずにユーザーのroot権限を取り消すこともできます。
イアンD.スコット14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.