これを行う方が安全ですか?
$ sudo dnf update
[ユーザーパスワードを入力してください]
または
$ su - [enter root password] # dnf update
sudoはsetuid-rootを使用しているので、私はいつも同じことを前提としています。したがって、sudoの最初の引数として実行されるプロセスは、sudoの有効ID(たとえばroot)として実行されます。
私の質問は次のとおりです。sudoは最終的に一般ユーザーに有効なIDを放棄しますか?したがって、この場合、上記の1番がより安全な選択になります。なぜなら、sudo で実行されるプログラムが攻撃者によって破壊された場合、権限が削除されたため、攻撃者が root として実行されない可能性があるからです。
答え1
最初のコマンドは(おそらく)正しいパスワードを必要とし、rootdnf update
として実行して終了します。
$ sudo dnf update [enter user password]
2番目のコマンドはルートのパスワードを要求し、ルートシェルを起動します。このシェルで以下を実行しますdnf update
。
$ su - [enter root password] # dnf update
実際、リンゴとリンゴを比較するものではありません。これら2つのコマンドを比較できます。どちらも、少なくともコマンドを実行するルートシェルを起動します。dnf update
sudo -s
dnf update
su -
dnf update
あるいは、2つのコマンドを比較することもできます。どちらのコマンドもroot特権インスタンスを起動し、dnf update
呼び出し元のシェルで再び終了します。
sudo dnf update
su root -c 'dnf update'
実際にあなたが尋ねるのは、root権限で単一のコマンドを呼び出す方が良いか、または1つ以上のコマンドを実行するためにルートシェルを起動する方が良いかどうかです。
- 機能やダウンロードが何らかの方法で破損している場合、
dnf
実行方法は重要ではありません。問題はまったく実行されることです。 - システムの破損について話している場合は、ユーザーパスワード(
sudo
)とルートパスワード()のsu
セキュリティレベルによって異なります。 - このユーザーを信頼できるかどうかを検討している場合は、複数のコマンドを実行するルートシェルを取得するか、一度に1つのコマンドを実行するルートシェルを取得するかは重要ではありません。問題は、コマンドをrootとして実行できることです。
個人的に必要に応じて使い方を混ぜ合わせてマッチさせます。私はめったに使用しませんが、複数のコマンド(Debianパッケージ管理ツールなど)を実行する必要がある高速なワンタイムセッションまたはショートセッションに使用しますsu
。sudo {command....}
sudo -s
apt-get update
apt-get upgrade
答え2
例では、sudo
子プロセスが終了したときに権限を放棄します。この場合はdnf
。su
子プロセスが終了すると、権限が削除されます。この場合は対話型シェルです。したがって、このsudo
例では権限をより早く放棄します。
sudo
ここに記載されていない他の利点もあります。 (たとえばsudoers
、このファイルを使用すると、各ユーザーができることとできないことをより効果的に制御できます。)