どちらがより安全でしょうか? sudo dnf update または su - ; dnf update

どちらがより安全でしょうか? sudo dnf update または su - ; dnf update

以下のことをする方が安全でしょうか:

  1. $ sudo dnf update[ユーザーパスワードを入力]

または

  1. $ su - [enter root password]
    # dnf update
    
    

私は、これらはまったく同じものだと常に思っていました。なぜなら、sudo は setuid-root を利用し、sudo の最初の引数として実行されるプロセスは、sudo の実効 ID (root) で実行されるからです。

私の質問は次のようになります:sudo は最終的にその実効 ID を通常のユーザーのものに落としますか? その場合、上記の 1 番の方が安全な賭けになります。なぜなら、sudo が実行されるプログラムが攻撃者によって侵害された場合、権限がすでに落とされているため、攻撃者が root として実行していない可能性があるからです。

答え1

この最初のコマンドは (おそらく) 正しいパスワードを要求し、dnf updateroot として実行されてから終了します。

$ sudo dnf update [enter user password]

この 2 番目のコマンドは、root のパスワードを要求し、root シェルを起動します。そのシェルで、次を実行しますdnf update

$ su - [enter root password]
# dnf update

実際には、同じもの同士を比較しているわけではありません。これらの2つのコマンドを比較することができます。どちらもルートシェルを起動し、その中で(少なくとも)コマンドを実行します。dnf update

sudo -s
dnf update

su -
dnf update

あるいは、これら2つのコマンドを比較することもできます。どちらもルート権限のインスタンスを起動しdnf update、呼び出し元のシェルに戻ります。

sudo dnf update

su root -c 'dnf update'

実際に尋ねているのは、ルート権限で単一のコマンドを呼び出す方がよいのか、それともルート権限のシェルを起動して 1 つ以上のコマンドを実行する方がよいのか、ということだと思います。

  • 機能やダウンロードが何らかの形で危険にさらされている場合dnf、それがどのように実行されるかは問題ではなく、そもそも実行されることが問題です。
  • sudoシステムを危険にさらすことについて話しているのであれば、それはユーザーのパスワード( )とルートのパスワード(su)のセキュリティに帰着します。
  • ユーザーを信頼できるかどうかを検討している場合、複数のコマンドを実行するルートシェルを取得するか、一度に1つのコマンドを実行するルートシェルを取得するかは実際には重要ではありません。問題は、コマンドがルートとして実行できることです。

個人的には、必要に応じて使い方を組み合わせます。 はほとんど使用しませんsuが、sudo {command....}簡単な単発作業や、sudo -s複数のコマンドを実行する必要がある短いセッション (たとえば、Debian パッケージ管理ツールapt-get updateの後にapt-get upgrade) には使用します。

答え2

Yes はsudo、子プロセスが終了したときに権限を削除します。この場合はdnf。一方、 as は、su子プロセスが終了したときに権限を削除します。この場合は対話型シェルです。したがって、sudo例ではより早く権限を削除します。

sudoまた、ここでは説明されていない他の利点もあります。(たとえば、sudoersファイルを使用すると、各ユーザーが実行できる操作と実行できない操作をより細かく制御できます)。

関連情報