
私は学生向けに macOS マシンの小グループ (20 台程度) を運用していますが、それらすべてに Homebrew やその他のパッケージやアプリケーションなどの設定が必要です。各コンピューターに必要なものをすべて自動的にインストールする bash スクリプトを作成しています。使用するコマンドの一部は root として実行する必要がありますが、ほとんどのコマンドは必要ありません。
スクリプト内の各コマンドを個別に sudo する方がよいのか、それともスクリプトから sudo を省いてスクリプト全体を sudo する方がよいのか疑問に思っています。どちらがより安全 (セキュリティの観点) で、私の状況に適しているのかを知りたいです。スクリプト全体でパスワードを要求されるのは避けたいのですが、スクリプト内のすべての行を root として実行するのは安全ではないので、避けたいです。
答え1
最小権限の原則に従い、root として実行できる権限は最小限に抑えます。そのため、スクリプト内から sudo を実行します。
sudo を必要とするコマンドが初めてある場合は、プロンプトが表示されることに注意してください。(/etc/sudoers で NOPASSWD を適切に使用している場合は、この限りではありません。この手法も安全ではないため、多くの人が避けるでしょう。) ただし、sudo を実行してパスワードを入力すると、sudo は一定期間成功を記憶します。デフォルトでは、その期間は 5 分です。したがって、「sudo echo hi」を実行し、パスワードを入力してから、その直後にスクリプトを実行した場合、スクリプトの実行時にパスワードの入力を求める必要はありません。より現実的には、スクリプトを実行するだけの場合、スクリプトが残りのタスクを完了するのに数分もかからないと仮定すると、sudo を 1 回だけ要求される可能性があります。
いくつかのecho
コマンドについては心配しないかもしれませんが、追加の権限なしで実行できる重要なコンテンツがある場合は、セキュリティのために、通常は最小限の権限昇格で実行できる範囲を最大限にすることを好みます。
権限を最小限に抑える例として、別のサンプル シナリオを示します。代わりに:
sudo -c "sample-command >> /var/log/output.txt"
私がよく使うもの:
sample-command | sudo tee -a /var/log/output.txt >> /dev/null
こうすることで、コマンド全体が sudo なしで実行され、拡張権限が付与されるのは、拡張権限が必要な部分、つまりファイルに書き込む部分のみになります。
明らかに、ここでの私の目標は、昇格された処理を最小限に抑えることです。同様に、スクリプト全体で昇格が必要ない場合は、(セキュリティの観点から) 昇格された処理を最小限に抑えることをお勧めします。
答え2
コマンドの内容によります。インターネットからダウンロードするコマンドは、root として実行しない方がよいでしょう。しかし、他のコマンドは root として実行しても問題ありません。私なら、コマンドを 2 つのスクリプトに分けます。1 つは非 root コマンド用、もう 1 つは root コマンド用です。
コマンドのリストを入手できれば、もっと役立つかもしれません。
答え3
通常、(私が思うに) スクリプトは他のコマンド/アプリケーション/ユーティリティと同じように扱われるはずです。その場合、権限を昇格するためのパスワードの入力を求められることは通常なく、拒否されてエラーが表示されます。次のようになります。
Permission denied
、 またはOperation not permitted
。
しかし、あなたは具体的に次のように述べました:
「..スクリプト内のすべての行を root として実行したくない...」sudo
したがって、関連する特定のコード行で 明示的に排他的に呼び出す以外の方法は実際には見当たりません。
また、次のようなことも述べていました:
「スクリプト全体でパスワードの入力を求められないようにしたい。」
おそらくそうはならないでしょう。操作間にかなりの時間が経過しない限り、sudo が呼び出されるたびにプロンプトが表示されることはありません。
答え4
root
解決策の 1 つは、を使用してスクリプトを実行しsudo
、 を使用する元のユーザーとして昇格された権限を必要としないコマンドを実行することですsudo -u $SUDO_USER <command>
。
以下にスクリプトの例を示しますexample.sh
。
#!/bin/bash
if [ "$(whoami)" != "root" ] ; then
echo "Run this script with sudo" >&2
exit 1
fi
sudo -u "${SUDO_USER:-$USER}" this_command_run_as_user
this_command_run_as_root
this_command2_run_as_root
次のように実行します:
sudo ./example.sh
この方法の利点は、スクリプトの開始時にユーザーのパスワードが最大で 1 回だけ要求されることです。 のタイムアウトを心配する必要はありませんsudo
。