web-dev-qa-db-ja.com

ルートがスクリプトを実行するのを妨げる方法

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

ルートアクセスを許可することを回避するオプションはありません。開発者は、ローカルマシンでこれを行うのに慣れているため、忘れてしまいます。 asadminスクリプトを変更して非特権ユーザーとして実行するか、オプションでスクリプトがrootによって実行されるたびにエラーメッセージを表示するようにしたいと思います。

Bashシェルが使用されます。

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

10
tronda

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

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

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

18
bahamat

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

id -u
$UID

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

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