rootユーザーとしてPHPでシェルスクリプトを実行しますか?

rootユーザーとしてPHPでシェルスクリプトを実行しますか?

次の行はPHPで実行する必要があります。

$ res = shell_exec( 'sudo sh /home/nicklas/cronjobs/make_account.shユーザー名パスワード');

問題は、実行しても何も起こらないということです。 $resをechoしようとすると空白になります。私も同じ結果を持ってsystem()を使ってみました。 www-dataユーザーには、デフォルトではないrootアクセス権でスクリプトを実行する必要があるため、機能しないようです。アクセス権を取得するために、/etc/sudoersに次の行を追加しました。

www-データ ALL=(ALL:ALL) NOPASSWD: /home/nicklas/cronjobs/make_account.sh

しかし、成功しませんでした。途中でApacheを再起動してみましたが、何の変更もありませんでした。

私は何を逃したことがありませんか?

答え1

私はWebサーバー上で高い権限で何かを実行することは常に悪い考えであることに強く同意しません。

Webアプリケーションのセキュリティ問題は、そのデータを使用する正確なプロセスではなく、ユーザー提供のデータへの信頼で発生します。

つまり、データの妥当性を確認してクリーンアップしないともっと安全ではないデータを処理し、www-dataユーザーがsudoを介して実行できるようにするラッパースクリプトを作成するのではなく、名前付きパイプを介してルート所有プロセスに渡します。

現実的に、ほとんどのデータ処理/検証/クリーンアップ操作は、データがsudoスクリプトに渡される前に実行する必要があります。 sudo スクリプトは a) データの最終確認を行い、b) 実行する必要があります。ただより高い権限を必要とするタスク。

実際、後者がより簡単で理解しやすいので、より安全だと思います。何かをより複雑にするほど、間違いを起こす可能性が高くなります。

どの方法を使用しても構いません(名前付きパイプ、sudoラッパーなど)。批判的重要なことは、ユーザーが提供したデータを確認し、それを実行する前に、非常に狭く定義された基準を満たしていることを確認することです。何もないそれを書いてください。

Stackexchangeのウェブサイトを含むウェブには、CGIセキュリティに関する多くの記事やガイドがありますが、いくつかの一般的なトピックは次のとおりです。

  • データが安全であることを確認するために、データを検査および/または変更するまでは、データを「汚染された」と見なし、信頼できないものとして扱ってください。
  • データを調べます。たとえば、許可または禁止されている文字の正規表現と一致するかどうかをテストします。最も安全な方法は、奇妙なことが発生した場合に停止することです。それ以外の場合は、正規表現またはバリアントを使用して潜在的に安全でない要素を削除します。
  • いつもデータが外部シェルスクリプトに渡されると、データが引用されます。たとえば、シェルスクリプトは変数の周りに二重引用符を使用する必要があります。
  • 同様に、データベースにデータを挿入するときは、エスケープや引用に依存するのではなく、プレースホルダ値をサポートするデータベースライブラリを使用する必要があります。こここれはユーモラスな絵です。

続行できますが、ここで回答に要約する内容が多すぎます。 CGIセキュリティは広範なトピックです。 Googleで検索してみてくださいCGI安全またはCGI入力検証


安全に対するあなたの態度は、「私はそれを使用する唯一の人だから気にしない」です。これによりあなたの足を吹き飛ばす装填された散弾銃を与えるように感じられるが、顔に足を撃つのは貴重な学習経験。以下は、ユーザーアカウントを作成する簡単なスクリプトです。 root権限が必要です。

このスクリプトは、Debian と Debian 派生システムだけでなく、他のシステムで使用できる adduser によって異なります。システムで利用できない場合は、useraddを使用するように修正してください。

#! /bin/bash 

# make the script abort on any error
set -e

U="$1"
P="$2"

[ -z "$U" ] && echo "Error: No username provided" >&2 && exit 1
[ -z "$P" ] && echo "Error: No password provided" >&2 && exit 1

# simple check - only allow lower-case letters and digits in usernames.
[ "$U" !~ '^[a-z0-9]*$' ] && echo "Error: Invalid Username" >&2 && exit 1

# create user if they don't already exist
if ! getent passwd "$U" > /dev/null ; then

   # create the user using adduser, must provide the gecos field 
   # and disable the password so adduser doesn't ask for them. 
   adduser --gecos "$U" --disabled-password "$U"

   # now change the password
   echo "$U:$P" | chpasswd
else
    echo "Error: Username already exists" >&2
    exit 1
fi

スクリプトをどこかに保存し、chmodを使用して実行可能にします。

www-dataがパスワードなしでrootとして実行されるようにするには、/ etc / sudoersを編集してvisudo次を追加します。

Cmnd_Alias APACHEADDUSER = /path/to/makeaccount.sh

www-data ALL = NOPASSWD: APACHEADDUSER

答え2

セキュリティ上の理由から、もともと持っていたよりも多くの権限を持つユーザーwww-dataで特定のタスクを実行しようとしないでください。しばらく前にApacheアクセスがwww-dataに移動された理由があります。コンピュータでrootとして何かをする必要があり、パスワードを変更したりアカウントを作成することが「作業」の場合は、インターフェイスを構築する必要があります。 PHPスクリプトに何かをどこかに置き、ルートで実行されているスクリプトを介してスキャンしてそこで処理させます。 www-dataからアクセス可能なディレクトリに追加するユーザーを含むファイルを作成し、ルートクローン操作で5分(またはそれ以下)ごとにこれを実行し、タイムスタンプフォルダを使用してファイルを完了するように移動します。進行状況を制御できます。に。

関連情報