質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.33%

  • PHP

    21413questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • nginx

    906questions

    nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

  • SSH

    590questions

    SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

Nginxの公開ディレクトリのパーミッションについて

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 2,412

takumi9942

score 3

前提・実現したいこと

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

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+4

以下の方法ではどうでしょうか。

1. SFTPユーザーを nginx グループに所属させる
(サブグループに nginx を追加する)

# id sftpuser
uid=1000(sftpuser) gid=10(wheel) groups=10(wheel)
# usermod -G nginx sftpuser
# id sftpuser
uid=1000(sftpuser) gid=10(wheel) groups=10(wheel),993(nginx)

2. 共有するディレクトリのグループを nginx にし、set GID ビットを立てる

# chown root:nginx /usr/share/nginx/html/test/
# chmod 2775 /usr/share/nginx/html/test/
drwxrwsr-x. 2 root nginx 6 Feb 24 00:41 /usr/share/nginx/html/test/

これで、SFTPユーザーで書き込みができるようになります。
ただし、作成したファイル、ディレクトリのパーミッションは umask 設定によります。
644, 755 など、グループ書き込み権限が付いていないと、PHP から上書きできません。

3. SFTP コピー後のファイル、ディレクトリにグループ書き込み権限を与える
これは、SFTPクライアント側で設定できると思うのですが、コピーしたファイルのパーミッションを 664 に、コピーしたディレクトリのパーミッションを 775 にするよう設定します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/24 09:14

    完璧に動作しました!ありがとうございました!
    念のためusermodにはaオプションを付けて実行しました。
    sudo usermod -aG nginx ユーザー名
    chown -R nginx:nginx /usr/share/nginx/html/
    chmod 2775 /usr/share/nginx/html/

    キャンセル

  • 2017/02/24 13:45

    /usr/share/nginx/html にnginx(PHP)が書き込みできる権限を設定してはいけません。権限設定には注意が必要ですので、別に回答している内容を確認してくだださい。

    キャンセル

+4

基本的な注意事項がありますのでこれは守ってください。

  • コンテンツが置かれるディレクトリは、Webサーバやアプリケーション(PHPなど)が書き込める権限を与えてはいけません。
  • アプリケーションからコンテンツのディレクトリ内にファイルを書き込む必要がある場合は、書き込みを行うディレクトリを限定し、そのディレクトリにのみアプリケーションから書き込める権限を付けてください。
  • 上記のアプリケーションから書き込みが出来るディレクトリでは、静的コンテンツのサーブのみが出来るように(スクリプト類が実行されないように)Webサーバを設定してください。

安易にコンテンツのディレクトリにWebサーバやWebアプリから書き込める権限を付けてしまうと、WebサーバやWebアプリの脆弱性を経由しファイルが作成され、コンテンツ改竄や任意コード実行などの被害に繋がります。

単純に解決するには、コンテンツのディレクトリの所有者を自分(SFTPでファイルを転送するユーザ)にすれば良いと思います。書き込み可能にするディレクトリはグループをnginxのグループにし、グループの書き込み権限を追加します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/24 13:47

    回答ありがとうございます!
    安全性についてほとんど考えていませんでした!
    書き込みが必要なディレクトリだけnginxグループにしておきたいと思います

    キャンセル

+1

若干使い勝手が変わってしまうかもしれませんが、nginxのユーザでSFTPでログインできるように設定し、そのユーザでファイル操作を行った方が、nginxユーザ以外からデータの操作ができないようになるので、セキュリティ上からもそちらの方が好ましいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/24 09:17

    回答ありがとうございます!
    出来ればnginxユーザーの権限は増やしたくなかったので、Taichi Yanagiyaさんの方法を利用しました。

    キャンセル

同じタグがついた質問を見る

  • PHP

    21413questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • nginx

    906questions

    nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

  • SSH

    590questions

    SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。