web-dev-qa-db-ja.com

シェルスクリプト:内部でSudoを使用するか、sudoで実行するか?

すべてのコマンドではなく一部のコマンドがスーパーユーザー権限を必要とするシェルスクリプトを記述する場合、

  • スーパーユーザー権限が必要なコマンドにSudoを追加し、Sudoなしでシェルスクリプトを実行する、または

  • スーパーユーザー権限が必要なコマンドにSudoを追加しないでください。ただし、sudoを使用してシェルスクリプトを実行しますか?

2番目の方法では、パスワードを1回入力するだけで済みますが、スクリプト内のすべてのコマンドは、不要なコマンドを含め、スーパーユーザー特権で実行されます。

最初の方法では、さまざまなSudoコマンドに対してパスワードを複数回入力する必要がある場合がありますが、スーパーユーザー権限は、それらを必要とするコマンドにのみ付与されます。

セキュリティ上の問題から、最初の方法の方が優れています。便宜上、2番目の方法の方が適しています。

  1. 最初の方法を採用することを考えています。したがって、私は シェルスクリプトで複数のSudoコマンドに自分のパスワードを提供するという不便さに対処する必要があります。

  2. スティーブンハリスが書いた

    適切に作成されたスクリプトは、適切な権限で実行されているかどうかを検出し、Sudoをまったく呼び出さないでしょうが、多くの悪いスクリプトがあります

    だから私は2番目の方法を使うべきですか?もしそうなら、

    • 「スクリプトが適切な権限で実行されていて、Sudoをまったく呼び出さないかどうかをスクリプトが検出する」と書くにはどうすればよいですか?

    • sudoを使用してスクリプトを実行するときに、スーパーユーザー特権を必要としないコマンドにスーパーユーザー特権を与える問題を回避するために、セキュリティをどのように改善できますか?

  3. この単純なアプローチは、両方のアプローチの中で最も優れていますか?それを必要とするだけのコマンドにSudoを追加し、利便性とセキュリティのどちらを望むかに応じて、Sudoの有無にかかわらずスクリプトを実行しますか?このアプローチには問題がありますか?

ありがとう。

13
Tim

最初の問題に対処するには:

「スクリプトが適切な権限で実行されていて、Sudoをまったく呼び出さないかどうかをスクリプトが検出する」と書くには

Rootの簡単なPOSIXチェックがあります。

#!/bin/sh
is_user_root ()
{
    [ "$(id -u)" -eq 0 ]
}

あるいは、Bashでは、よりパフォーマンス主導のプログラマーが使用したいと思うかもしれません。

#!/bin/bash
is_user_root ()
{
    [ ${EUID:-$(id -u)} -eq 0 ]
}

再利用するために、意図的にコードを関数にラップしたことに注意してください。

2番目の問題に対処するには:

sudoを使用してスクリプトを実行するときに、スーパーユーザー権限を必要としないコマンドにスーパーユーザー権限を与える問題を回避するために、セキュリティをどのように改善できますか?

これについてはあまりできません。少なくとも私の心には何も思い浮かびません。スクリプトを見た場合、提案があるかもしれません。しかし、質問に含まれていなかったので...スクリプト全体をSudoまたはrootとして実行すると、これを制御する方法がわかりません。

コメントに対処するには:

「Sudoを内部で使用するか、Sudoで実行する」についてどう思いますか

私のスクリプトでは、通常、後者の方法を使用しますが、それが必ずしも推奨されているわけではありません。それは、スクリプトの対象者に依存するためです-rootのみ。一部のユーザーがSudo権限を持つことを除いて、ほとんどの場合ユーザー。私がどんな値でも答えられるようにするには、文字通りスクリプトを質問に含める必要があります。

15