rootがスクリプトを実行できないようにする方法


10

Glassfishのアプリケーション・サーバーは、アプリケーションサーバーを管理し、またそれらを開始し、停止し、私はこのスクリプトを実行しているから、rootユーザーを制限したいためにスクリプトを提供しています。その理由は、一部の主要な開発者が非特権ユーザーとしてサーバーを管理することを忘れており、アプリケーションサーバーをrootユーザーとして再起動する場合、アプリケーションサーバーはrootユーザーによって実行される必要があるためです[*]。

ローカルマシンでこれを行うのに慣れているため、rootアクセスを与えないようにすることはできません。私は希望のasadmin非特権ユーザーとして実行したり、必要に応じて、エラーメッセージにスクリプトがrootで実行されるたびに表示するためのいずれかの変化にスクリプトを。

バッシュシェルを使用しています。

[*]:ファイルの権限を修正しようとしましたが、rootが所有する多くのファイルを追跡してそれらをchmodしたにもかかわらず、アプリケーションで奇妙なエラーが発生し、rootとして再度実行する必要があります。

回答:


18

他の答えと同様ですが、あなたが望む方向に。

if [[ $EUID -eq 0 ]]; then
  echo "This script must NOT be run as root" 1>&2
  exit 1
fi

または、sudoスクリプト内で使用して、非特権ユーザーとして、実行-uするユーザーを指定するフラグを使用して強制的に実行することもできます。Glassfishは使用しませんが、プロトサンプルの疑似スクリプトを次に示します。

#!/bin/bash

if [ $1 == "start" ]; then
  sudo -u nobody /usr/bin/glassfish
fi

うまくいけば、あなたはアイデアを得ます。申し訳ありませんが、スクリプトがどのように表示されるのか、または特権のないユーザーの名前はわかりません。


2

@Tshepangは正しい考えを持っています。どちらが最も移植性があるかはわかりませんが、ユーザーがrootであるかどうかを検出する他の方法を次に示します。

id -u
$UID

または、同じパラメータを使用して、別のユーザーとして実行するように強制することもできます。

if [[ "$USER" != appuser ]]
then
    exec sudo -u appuser "$0" "$@"
fi

1
これは逆です。彼はroot がこのスクリプトを実行しないようにしたいと考えてます。
バハマート2011

ドー、sudoちょっと忘れました。今それは仕事をするべきです。
l0b0 2011

@TobySpeightいいえ、ユーザーがrootの場合、スクリプトは意図したとおりに何もしませ$@空の場合、あなたの変更は追加の引数にもなると思います。他の場所にあるパターンを使用するように変更しました。
l0b0

ありがとう、@ TobySpeight、修正。ゼロ引数が正しく渡されることを確認する方法として、どこかでこのフォームが見られたのは確かです。。また、間違いなく(それはフォーク爆弾はありませんでしたが、単に無限に自分自身を呼ぶようなバグがありました小切手、固定
l0b0

各インスタンスがの新しいシェルをフォークしsudo(それを使用していませんexec)、親がそれを待機するため、最終的には完全なプロセステーブルが作成されるため、フォーク爆弾だったと私は思います。execそこに入力する価値はまだあります(コードをfi間違ったユーザーとして実行する予定がない場合)。
Toby Speight 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.