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


13

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

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

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

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

最初の方法では、さまざまなsudoコマンドにパスワードを複数回提供する必要があるかもしれませんが、スーパーユーザー権限はそれらを必要とするコマンドにのみ付与されます。

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

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

  2. スティーブン・ハリスは書きました

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

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

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

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

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

ありがとう。


sudoデフォルトの資格情報キャッシュがあると思いました。これはプラットフォームで無効になっていますか?
パイプ

@pipeたとえば、彼のスクリプトが一定の時間スリープしている可能性があり、その場合、キャッシュが機能しない可能性があります。
LinuxSecurityFreak 2018年

回答:


15

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

「スクリプトが適切な権限で実行されていて、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を使用するvs sudoで実行する」についてどう思いますか

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


sudo -u "$SUDO_USER" command...
Michael Homer

ありがとう。「内部でsudoを使用するvs sudoで実行する」についてどう思いますか?
ティム

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

@MichaelHomer私はsudo -u "$SUDO_USER" commandここで何を意味することになっているのだろうと思っていましたか?
ティム

@ティム私はそのアプローチで何の問題も見つけませんが、誰かが合理的な議論で反対するかもしれません。これは本当に元の質問の範囲外です。今は毎月のM-Discバックアップを行う必要があるので、今日はまだ利用できないと思います。申し訳ありません。少なくとも要点はお答えしたかと思います。また明日ね。
LinuxSecurityFreak 2018年

-4

私はこれに答えられると思います。

だから私は2番目の方法を使うべきですか?

ここで問題が発生する理由はありません。これが理由です。

ニーズをrootとして実行することを唯一のコマンドが存在する場合、runなどあなたのプログラムrootsudo理由はsudo、スクリプト内は長い道です。プログラマーが怠惰であることを忘れましたか?

あなたは多くのコマンドが必要な場合runなどroot、次にとしてそれを実行しますrootsudo

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

他のユーザーがrunあなたのプログラムを必要とする場合sudo、それらsudoは多くのカスタマイズが可能であり、あなたのニーズを満たします。

以下に例を示しsudoます。

visudosudoersファイルを編集するときは常に使用する.....

kate ALL=(ALL) NOPASSWD: /usr/local/bin/script ARG1 ARG2

sudo プログラム/スクリプト内のユーザーを変更するのにも最適です。これは私のスクリプトの1つからの行です。

sudo -i -u "$user" user="$user" CURRENTDIR="$CURRENTDIR" BASHRC="$BASHRC" bash <<'EOF'

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

https://www.cyberciti.biz/tips/shell-root-user-check-script.html
how-do-i-determine-if-a-shell-script-is-running-with-root-permissions

bash/sh:

#!/bin/bash
# (Use #!/bin/sh for sh)
if [ `id -u` = 0 ] 
then
        echo "I AM ROOT, HEAR ME ROAR"
fi

csh:

#!/bin/csh
if ( `id -u` == "0" ) 
then
        echo "I AM ROOT, HEAR ME ROAR"
endif

#!/bin/bash
if [[ $EUID -ne 0 ]]; then
  echo "You must be a root user" 2>&1
  exit 1
else
  mount /dev/sdb1 /mnt/disk2
fi

紳士@terdonからのリクエストにより編集:

このようにスクリプトを考えてみてください。

公開スクリプトですか(使用する人以外の人)スクリプトは何をしますか?時間を教えてくれますか?それとも200システムのiptablesを更新しますか?あなただけが使用する場合、それは仕事/専門家関連ですか、それとも個人使用ですか?

ユーザーグループが何で構成されているかを事前に知る必要があるだけです。

writtenそれでも管理者に譲渡または販売する場合は、それでも、なぜscript実行を許可すべきではないのですrootか?それはどんな害を及ぼすことができますか?

実際のスクリプト/プログラムは特権ユーザーとして頻繁に実行され、誰もそれが問題ではないと述べていませんが、プログラマー、ほとんどが私のような初心者がこれらのことについて話すとき、それは本当のセキュリティの脅威です.....参照することはエレガントではありませんが、一部の人々はあなたが持っているコントロールsystemとあなたのコードを見るということです...あなたが使用するよりも多くのアクセス許可にファイルを設定していますか?ロジックか、才能のあるプログラマーがコードの危険性を一目で見ようとしているのでしょうか?

あなたの場合、code needs rootを使用しsudo、そして多くの場合、それを実行するだけでroot.......私の答えはここで終わりですphew


2
ルート権限を必要とするコマンドが1つしかない場合でも、スクリプトを常にルートとして実行することを推奨する理由を説明できますか?答えには2つの可能性があります(1つのコマンドでroot権限または複数の権限が必要です)が、両方に同じことを提案します。
terdon

2
私はこの問題について考え、他の同様の議論を読みました。この答えは私を混乱させます。(しかし、すでに十分な
Joe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.