質問: ### 前提・実現したいこと VPSに「CentOS7.3 + Nginx1.10.2 + php7.1.2」の環境を作成し、ウェブページが公開できる状態になったのですが、公開ディレクトリ(/usr/share/nginx/html/)の所有者をどうすればよいのかわかりません。 公開ディレクトリにPHPで書き込めて、SFTPでもアップロード出来るようにしたいです。 皆さんはどのように設定しているのでしょうか? ### 発生している問題・エラーメッセージ ``` Error #3 (/usr/share/nginx/html/test/test.PNG):Permission denied ``` ### 試したこと ファイルをSFTPを使用してアップロードしているのですが、アップロードするには公開ディレクトリのownerが自分のユーザーに設定されている必要があります。しかしownerを自分に設定してしまうとPHPからファイルを書き込みできなくなってしまいます。 一方ownerをnginxに変更すると、PHPからファイルを書き込むことはできるのですが、SFTPからアクセスすることができなくなってしまいます。 現在自分のユーザーのグループがwheelで、NginxのグループはNginxになっています。 一旦ホームディレクトリにアップロードした後、sudo権限でmvすれば良いのですが、出来ればSFTPで直接操作できるようにしたいです。 ### 補足情報(言語/FW/ツール等のバージョンなど) CentOS 7.3 Nginx 1.10.2 PHP 7.1.2 SFTPクライアント MobaXterm
回答: 基本的な注意事項がありますのでこれは守ってください。 * コンテンツが置かれるディレクトリは、Webサーバやアプリケーション(PHPなど)が書き込める権限を与えてはいけません。 * アプリケーションからコンテンツのディレクトリ内にファイルを書き込む必要がある場合は、書き込みを行うディレクトリを限定し、そのディレクトリにのみアプリケーションから書き込める権限を付けてください。 * 上記のアプリケーションから書き込みが出来るディレクトリでは、静的コンテンツのサーブのみが出来るように(スクリプト類が実行されないように)Webサーバを設定してください。 安易にコンテンツのディレクトリにWebサーバやWebアプリから書き込める権限を付けてしまうと、WebサーバやWebアプリの脆弱性を経由しファイルが作成され、コンテンツ改竄や任意コード実行などの被害に繋がります。 単純に解決するには、コンテンツのディレクトリの所有者を自分(SFTPでファイルを転送するユーザ)にすれば良いと思います。書き込み可能にするディレクトリはグループをnginxのグループにし、グループの書き込み権限を追加します。