以下のことをする方が安全でしょうか:
$ sudo dnf update
[ユーザーパスワードを入力]
または
$ su - [enter root password] # dnf update
私は、これらはまったく同じものだと常に思っていました。なぜなら、sudo は setuid-root を利用し、sudo の最初の引数として実行されるプロセスは、sudo の実効 ID (root) で実行されるからです。
私の質問は次のようになります:sudo は最終的にその実効 ID を通常のユーザーのものに落としますか? その場合、上記の 1 番の方が安全な賭けになります。なぜなら、sudo が実行されるプログラムが攻撃者によって侵害された場合、権限がすでに落とされているため、攻撃者が root として実行していない可能性があるからです。
答え1
この最初のコマンドは (おそらく) 正しいパスワードを要求し、dnf update
root として実行されてから終了します。
$ 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
ファイルを使用すると、各ユーザーが実行できる操作と実行できない操作をより細かく制御できます)。