Nginxの仮想ホストごとのユーザー


回答:


7

いいえ、nginx構成内のすべてのサーバースタンザは同じワーカープロセスのセットから提供されるためです。さらに、セキュリティの観点からは、そのように実行する良いです。これは、コンテンツがWebサーバーによって自動的に書き込み不可である(aのような愚かさはないchmod -R 0777)ため、nginxに脆弱性がある場合、コンテンツはどれも危険にさらされています。


2
だから、ユーザーのファイルを別のユーザーから隠す方法はありませんか?ユーザーのコンテンツはすべて、www-dataで読み取り可能である必要がありますか?
アレックスNetkachov

1
ファイルにwww-data(またはWebサーバーを実行するユーザー)からアクセスできるようにするために、システム上の他のユーザーがファイルにアクセスできる必要はありません。
ワンブル

2
vhostのセットアップ時にドキュメントルートにグループwww-data0710権限を付与します(これにはnginxを構成するためにルートが必要であるため、自動化で必要な権限を設定しても問題ありません)。次に、docrootの内容は、o+xディレクトリおよびo+rファイル用である必要があります。
ワンブル

13
注意:PHPスクリプト(またはcgi-binプロセス)がの下www-dataで実行される場合、PHPスクリプトまたはcgi-binプロセスを提供できるすべてのwww-dataユーザーは、そのユーザーがアクセスできるファイルにアクセスできます。これconfig.php.incは、共有マシン上またはそれに類似したデータベースパスワードを保存している人にとっては自明ではないようです。
イヴァンヴチカ14

2
@Ricalsin UNIXはマルチユーザーオペレーティングシステムであり、サーバーは複数のユーザーを持つことができます。たとえば、peterおよびjohn。彼らはでウェブページをホストしています~/public_html。これについて議論している人の誰も言及していない別のアプローチがない場合、.phpスクリプトは、Webサーバーと同じ権限を持ちますwww-data。これは、WebサーバーやPHPインタープリターと同様に、他の.phpスクリプトを読み取ることができることを意味します。
イヴァンヴチカ14年

9

はい。セキュリティを強化することが可能であり、推奨されます(以下の理由を参照)。

PHP-FPMを使用していることを考慮して(おそらく最も一般的です)、ドメインごとに異なるユーザーが所有するスプールを作成できます。

PS:詳細なステップバイステップのチュートリアルをここに書きました:

https://learnwithdaniel.com/2019/06/user-per-virtual-host-nginx/

1.スプールを作成します。

新しいスプールごとにスプールを追加する/etc/php/7.0/fpm/pool.d/www.confか、新しい.confファイルを作成します。

スプール#1(myuser1):

[myprojectuser1]
user = myuser1
group = myprojectgroup
..
listen = /run/php/myuser1.sock
...  
listen.owner = www-data
listen.group = www-data

スプール#2(myuser2):

[myprojectuser2]
user = myuser2
group = myprojectgroup
..
listen = /run/php/myuser2.sock
...  
listen.owner = www-data
listen.group = www-data

PS:listen.owner / listen.groupを同じnginxユーザー(通常はwww-data)にしてください。

2.各スプールをそのサーバーブロック(Apacheユーザーの仮想ホスト)に割り当てます。

ホスト1:

server {
  ...
  location ~ \.php$ {
    fastcgi_pass unix:/run/php/myuser1.sock;
  }
  ...
}

ホスト2:

server {
  ...
  location ~ \.php$ {
    fastcgi_pass unix:/run/php/myuser2.sock;
  }
  ...
}

FPMおよびNGINXサービスを再起動します

sudo /etc/init.d/php7.0-fpm restart
sudo service nginx restart

テスト:

現在のプロセスユーザーを表示するpinfo.php(または任意の名前)ファイルを作成します。

<?php 
echo str_replace("\n", '<br>', shell_exec('ps -u -p '.getmypid()));

または、bash経由でpinfo.phpファイルを作成します。

echo "<?php echo str_replace(\"\\n\", '<br>', shell_exec('ps -u -p '.getmypid()));" > pinfo.php

次に、ブラウザで「http://.../pinfo.php」を開きます。


複数のユーザーを使用する理由(セキュリティ上の理由):

すべてのWebサイトを同じユーザー(www-data)で実行している場合、system()/ passthru()/ exec()へのPHP呼び出しはすべてのWebサイトにアクセスできます!NGINXはこれに対してあなたを保護しません。PHPは単なる例ですが、一般的なWebサーバー言語には同様の呼び出しがあります。ハッカーとして、「ls ..」ですべてのWebサイトをナビゲートし、「cp / echo / mv」で任意のファイル(別のWebサイトファイルを含む)に独自のコードを書き込むことができます。サーバー上のすべてのWebサイトが同じ人(例:あなた)によって所有されている場合でも、最終的なハッカー/ウイルス(例:Wordpressウイルス)が他のWebサイトにアクセスするのを防ぐため、各Webサイトを異なるユーザーで実行することをお勧めします。


5

上記のIvanのコメントに対応し、OPに適用されるようです。2つのこと:

  1. アプリケーションドキュメントルートはとのようなものに/blah/peterWeb/htmlなり/blah/johnWeb/htmlます。NGINXとApache2の両方は、どちらもグループとしてwww-dataを実行している場合でも、一方が他方のディレクトリで閲覧したり操作したりすることを許可しません。

  2. 各ディレクトリツリーを独自のユーザーアクセス許可の下に配置すると、各ユーザーはUNIXシステムにssh / loginでき、各ディレクトリをプライベートに保つことができます。各ユーザーをwww-dataグループに入れないでください。同意する場合、あなたの文章:

    PHPスクリプトまたはcgi-binプロセスを提供できるすべてのユーザーは、www-dataユーザーがアクセスできるファイルにアクセスできます。

    より正確に次のように記述できます。

    apache / nginxサーバー(www-data)と同じグループに入れたすべてのユーザーは、アクセス可能な任意のファイル(基本的にはWeb上のすべてのもの)で(phpスクリプトの実行を含む)好きなことを実行できます。サーバ)。

編集1: いくつかのサーバー管理者の問題に対処する必要があるので、このトピックをさらに検討しました。Ivanの情報がどれほど正確かは知りませんでした!ユーザーに共有ホスティング設定でスクリプトをアップロードおよび実行する機能を提供する場合は、注意してください。ここに1つのアプローチがあります。この脆弱性を確実に理解してくれたIvanへのハットヒント。


4
いいえ。あなたはそれを見逃しています。PHPスクリプトは、Apacheのプロセス(または他のWebサーバー)で実行されると、ホスティングプロセスの特権で実行されます。多数の単純なセットアップでは、このユーザーはwww-dataです。ジョニーがスクリプトを作成して実行できる場合www-data(単純なセットアップでは可能)、ジョニーのスクリプトはピーターのスクリプトを読み取り、ジョニーに送り返すことができます。これはグループとは関係ありません。適切な解決策は、suPHP(単純に設定すると、コードの記述が不十分なため、このユーザーのファイルがすべて危険にさらされるため)、または刑務所、またはユーザーごとの専用のWebユーザーを追加することです。
イヴァンヴチカ14年

(また、コメントの代わりに回答を追加するとStackOverflowタイプのサイトが悪用されます。実際に回答を提供しているという印象です。それを避けてください。)
IvanVučica14年

@IvanVučicaあなたのアドバイスをサポートする役立つリンクを更新して追加しました。ありがとう。
リカルシン14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.