私の会社には、人々がサインアップするウェブホスティングサービスがあります。サインアッププロセスが完了したら、手動でアクセスして、そのクライアントが使用するテスト/開発環境を作成します。通常、プロセスは次のようになります。
somerandomstring.devserver.com
としてサイトにアクセスできますこれを行うためにスクリプトを使用しますが、ボリュームでは、手動でログインして実行するのは不便になっています。そのため、クライアントのサインアッププロセスが完了した直後に、このプロセスを自動化してトリガーする必要があります。
これを処理する方法をいくつか考えました。
1)ユーザーにadduser
capabilityを与え、PHP exec()
関数を使用してユーザーを作成します。ただし、その機能をwww-data
に提供する必要がありますか? PHPセーフモードで実行すると、exec()のコマンドは指定されたディレクトリに制限されます。したがって、/ usr/sbin/adduserを/ my/custom/dirにコピーして、そのコマンドのみが使用できる場合、セキュリティ上の懸念は何ですか?新しいサイトでサイトで使用可能なフォルダを更新する方法は、ルートが所有しているため、私はまだ迷っています。
2)cronに任せる:人はサービスにサインアップする必要があるため、デフォルトではmysqlにユーザー名と他のクライアントデータが保存されています。 adduser
機能を持つアカウントから、cronに新しいアカウント(おそらく30〜60秒ごと)をチェックするルーチンスクリプトを実行させます。見つかった場合は、それらのLinuxアカウントを作成し、ホームディレクトリにデータを入力し、Apache conf virtualhostファイルを作成して、Apacheをリロードします。
オプション2は、分離された管理者アカウントがwww-dataまたはWebサイトがシステムスクリプトとプログラムを実行する必要なくこれを処理するという点で最も安全な方法のように感じます。問題はバッチです。できれば、オプション1の解決策を見つけて、クライアントがすぐにサインアップされ、インストール済みですぐに使用できるサーバーインスタンスにリダイレクトされるようにしたいと思います。また、Apacheをリロード/再起動する必要があることも好きではありません。
企業、特にWebホスティング企業はこれを毎日行います。たとえば、Bluehostは、サインアッププロセスを完了すると、すぐに対話できる/ home/user/public_htmlにアクセスできます。商用ソリューションが存在するため、安全かつ安全にそれを達成する方法について多くの考えが与えられていると確信しています。私が成し遂げようとしているのは、はるかに小さな規模で、同一です。
⚠
WARNING
⚠これは固有のセキュリティリスクであり、いつでも南に行く可能性のあるlotがあります。この設定には強くお勧めしますが、まあです。
この投稿に記載されている内容に従っていることによって生じた問題については責任を負いません。また、このシステムに従うことをお勧めしません。これは主に教育/研究目的のためです。
Linuxには、 setuid
として知られているものがあり、これにより、任意のプログラム(Sudo
など)を現在実行中のユーザーよりも高い特権で実行できます。シェルスクリプトを記述して、必要なすべてのことを実行できます。
そこから、シェルスクリプトはsetuid
にできないため、これをバイナリに変換する必要があります。これには shc
のようなものを使用できます。
必要なものがすべて含まれるShell擬似バイナリ(サンプル名:bootstrap_user
)を作成したら、楽しい変更を加えて準備を整えることができます。つまり、これ:
root
が所有し、www-data
をグループ化します。
chown root:www-data ./bootstrap_user
所有者(ルート)にRWXパーマを割り当て、グループには読み取りと実行を、他には誰にも割り当てません:
chmod 750 ./bootstrap_user
バイナリをPHPできるexec()
どこかに移動します。
最後に、setuid
ビットを追加して、ルートとして実行されるようにします。
chmod u+s ./bootstrap_user
PHPでは、bootstrap_user
を実行可能ファイルとして呼び出して、必要なパラメーターを渡すことができます。入力をエスケープしてサニタイズするように注意してください。
ブラウザユーザーにUnixユーザーを自動生成する機能を提供することには注意が必要だと思います。行った場合、おそらくキューイングメカニズムとログまたはデータベースの両方を組み込んで、次のことが起こらないようにする必要があります。
では、ユーザーが実行済みまたはまだ実行中の何かを再開始するとどうなりますか?