nginxでは、仮想ホストごとに異なるユーザーを構成できますか?
何かのようなもの
server {
user myprojectuser myprojectgroup;
...
}
nginxでは、仮想ホストごとに異なるユーザーを構成できますか?
何かのようなもの
server {
user myprojectuser myprojectgroup;
...
}
回答:
いいえ、nginx構成内のすべてのサーバースタンザは同じワーカープロセスのセットから提供されるためです。さらに、セキュリティの観点からは、そのように実行する方が良いです。これは、コンテンツがWebサーバーによって自動的に書き込み不可である(aのような愚かさはないchmod -R 0777
)ため、nginxに脆弱性がある場合、コンテンツはどれも危険にさらされています。
www-data
と0710
権限を付与します(これにはnginxを構成するためにルートが必要であるため、自動化で必要な権限を設定しても問題ありません)。次に、docrootの内容は、o+x
ディレクトリおよびo+r
ファイル用である必要があります。
www-data
で実行される場合、PHPスクリプトまたはcgi-binプロセスを提供できるすべてのwww-data
ユーザーは、そのユーザーがアクセスできるファイルにアクセスできます。これconfig.php.inc
は、共有マシン上またはそれに類似したデータベースパスワードを保存している人にとっては自明ではないようです。
peter
およびjohn
。彼らはでウェブページをホストしています~/public_html
。これについて議論している人の誰も言及していない別のアプローチがない場合、.phpスクリプトは、Webサーバーと同じ権限を持ちますwww-data
。これは、WebサーバーやPHPインタープリターと同様に、他の.phpスクリプトを読み取ることができることを意味します。
はい。セキュリティを強化することが可能であり、推奨されます(以下の理由を参照)。
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サイトを異なるユーザーで実行することをお勧めします。
上記のIvanのコメントに対応し、OPに適用されるようです。2つのこと:
アプリケーションドキュメントルートはとのようなものに/blah/peterWeb/html
なり/blah/johnWeb/html
ます。NGINXとApache2の両方は、どちらもグループとしてwww-dataを実行している場合でも、一方が他方のディレクトリで閲覧したり操作したりすることを許可しません。
各ディレクトリツリーを独自のユーザーアクセス許可の下に配置すると、各ユーザーはUNIXシステムにssh / loginでき、各ディレクトリをプライベートに保つことができます。各ユーザーをwww-dataグループに入れないでください。同意する場合、あなたの文章:
PHPスクリプトまたはcgi-binプロセスを提供できるすべてのユーザーは、www-dataユーザーがアクセスできるファイルにアクセスできます。
より正確に次のように記述できます。
apache / nginxサーバー(www-data)と同じグループに入れたすべてのユーザーは、アクセス可能な任意のファイル(基本的にはWeb上のすべてのもの)で(phpスクリプトの実行を含む)好きなことを実行できます。サーバ)。
編集1: いくつかのサーバー管理者の問題に対処する必要があるので、このトピックをさらに検討しました。Ivanの情報がどれほど正確かは知りませんでした!ユーザーに共有ホスティング設定でスクリプトをアップロードおよび実行する機能を提供する場合は、注意してください。ここに1つのアプローチがあります。この脆弱性を確実に理解してくれたIvanへのハットヒント。
www-data
です。ジョニーがスクリプトを作成して実行できる場合www-data
(単純なセットアップでは可能)、ジョニーのスクリプトはピーターのスクリプトを読み取り、ジョニーに送り返すことができます。これはグループとは関係ありません。適切な解決策は、suPHP(単純に設定すると、コードの記述が不十分なため、このユーザーのファイルがすべて危険にさらされるため)、または刑務所、またはユーザーごとの専用のWebユーザーを追加することです。