web-dev-qa-db-ja.com

PHPベースのWebサイトがLinuxユーザーを作成し、環境と対話することを安全に許可するにはどうすればよいですか?

私の会社には、人々がサインアップするウェブホスティングサービスがあります。サインアッププロセスが完了したら、手動でアクセスして、そのクライアントが使用するテスト/開発環境を作成します。通常、プロセスは次のようになります。

  1. linuxユーザーを作成し、そのユーザーに切り替えます
  2. スクリプトを実行して、テンプレート化されたファイルとディレクトリのセットをホームディレクトリにインストールします。
  3. apache .confファイルを作成します
  4. apacheを再起動します
  5. サーバーがセットアップされ、アクセスの準備ができたことを知らせるメールを送信します
  6. 最後に、クライアントはsomerandomstring.devserver.comとしてサイトにアクセスできます

これを行うためにスクリプトを使用しますが、ボリュームでは、手動でログインして実行するのは不便になっています。そのため、クライアントのサインアッププロセスが完了した直後に、このプロセスを自動化してトリガーする必要があります。

これを処理する方法をいくつか考えました。

1)ユーザーにaddusercapabilityを与え、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にアクセスできます。商用ソリューションが存在するため、安全かつ安全にそれを達成する方法について多くの考えが与えられていると確信しています。私が成し遂げようとしているのは、はるかに小さな規模で、同一です。

5
user658182

WARNING


これは固有のセキュリティリスクであり、いつでも南に行く可能性のあるlotがあります。この設定には強くお勧めしますが、まあです。

この投稿に記載されている内容に従っていることによって生じた問題については責任を負いません。また、このシステムに従うことをお勧めしません。これは主に教育/研究目的のためです。

Linuxには、 setuid として知られているものがあり、これにより、任意のプログラム(Sudoなど)を現在実行中のユーザーよりも高い特権で実行できます。シェルスクリプトを記述して、必要なすべてのことを実行できます。

そこから、シェルスクリプトはsetuidにできないため、これをバイナリに変換する必要があります。これには shc のようなものを使用できます。

必要なものがすべて含まれるShell擬似バイナリ(サンプル名:bootstrap_user)を作成したら、楽しい変更を加えて準備を整えることができます。つまり、これ:

  1. rootが所有し、www-dataをグループ化します。

    chown root:www-data ./bootstrap_user
    
  2. 所有者(ルート)にRWXパーマを割り当て、グループには読み取りと実行を、他には誰にも割り当てません:

    chmod 750 ./bootstrap_user
    
  3. バイナリをPHPできるexec()どこかに移動します。

  4. 最後に、setuidビットを追加して、ルートとして実行されるようにします。

    chmod u+s ./bootstrap_user
    

PHPでは、bootstrap_userを実行可能ファイルとして呼び出して、必要なパラメーターを渡すことができます。入力をエスケープしてサニタイズするように注意してください。

2
Kaz Wolfe

ブラウザユーザーにUnixユーザーを自動生成する機能を提供することには注意が必要だと思います。行った場合、おそらくキューイングメカニズムとログまたはデータベースの両方を組み込んで、次のことが起こらないようにする必要があります。

  1. ユーザーがボタンを押してそれを実現する
  2. プロセスが開始されます
  3. ユーザーがF5を押すか、リロードボタンをクリックする
  4. ユーザーは後でBackspaceボタンを押して、履歴内のページをバックアップします
  5. ユーザーはこのページでブックマークを作成し、何度も再訪します

では、ユーザーが実行済みまたはまだ実行中の何かを再開始するとどうなりますか?

1
Justin Case