

## 環境

  * Ubuntu 20.04.4
  * nginx
  * php-fpm
  * Laravel 9
  * php 8.1

## 質問概要

Linuxのグループにユーザを追加したが、書き込み権限がないと言われるがなぜ？

## 質問詳細

### 事象

VPSを使い、Webサービスを作ってみようとUbuntuでサーバを立ち上げてみました。  
この際、rootとは別に、作業するアカウント「admin」を用意し、作業しています。

デプロイをGitLabのCIで行いたいと思い、これを機に権限周りをしっかりしてみようと、「web」グループを作成しました。

[code]

    $ sudo groupadd web
    
[/code]

そしてそこにadminユーザと、Nginxを使っているのでwww-dataユーザを追加しました。

[code]

    $ sudo usermod -aG web admin
    $ sudo usermod -aG web www-data
    
[/code]

最後に、DocumentRootのオーナー権限を変更しました。

[code]

    $ sudo chown -R admin:web /var/www/html/
    
[/code]

これでVPS上のサイトにアクセスしてみると、  
途中のPHPの処理でファイルが書き出せないというエラーが発生し、  
500エラーが返されました。

そこで一旦、DocumentRootのアクセス権を765に変更しました。

[code]

    $ sudo find /var/www/html/ -type d -print | xargs sudo chmod 765
    
[/code]

しかし状況は変わりませんでした。

しかたないので、DocumentRootのオーナー権限をwww-dataに変更しました。

[code]

    $ sudo chown -R www-data:www-data /var/www/html/
    
[/code]

すると正常に動作しました。

### 質問

**① うまくいかない理由を知りたいです**  
なぜこれでうまくいかないのでしょうか？

「web」グループにはwww-dataユーザも含まれているため、  
読み書きができると思っているのですがこの認識が間違っているのでしょうか？

**② 正常動作させるにはどうすれば良いでしょうか？**  
「admin」ユーザと「www-data」ユーザが両方このディレクトリを操作でき、  
正常にWebサービスを動作させるにはどうすればよいのでしょうか？

**③ そもそもこの環境構築の考え方は正しいのでしょうか？**  
インフラも勉強中で、あまり詳しくはないのですが、  
このような考え方で大丈夫なのでしょうか？  
`www-data:www-data`で動作させるほうが良かったりするのでしょうか？

* * *

以上、おわかりの方がいらっしゃいましたらご教示頂けますと幸いです。  
よろしくお願いいたします。

* * *

## ご回答いただいた内容に基づいて行った手順

### 2022/05/17

**（1）www-dataからユーザを変更**

[code]

    sudo chown -R admin:web /var/www/html/
    
[/code]

**（2）ディレクトリの権限を2775に変更**

[code]

    sudo find /var/www/html -type d -print | xargs sudo chmod 2775
    
[/code]

ここまででサイトは表示されるのですが、wordファイルを作成する[PHPWord](https://github.com/PHPOffice/PHPWord)がエラーを吐きます。

[code]

    Unable to set visibility for file docx. {"userId":1,"exception":"[object] (League\\Flysystem\\UnableToSetVisibility(code: 0): Unable to set visibility for file docx.
    
[/code]

ファイルのパーミッションが変更できないかと思い、以下を追加で実行しました。

[code]

    find /var/www/html -type f -print | xargs chmod 664
    
[/code]

しかし、エラーが解消できず一旦もとに戻しました。


CC BY-SA 4.0
2022-05-14T14:44:28.760
88816
2023-11-18T18:08:06.010
2022-05-17T08:02:55.770
31257
31257
question
ubuntu nginx
Linuxのグループの使い方


私が普段使っているのは Apache であり Nginx の経験は無いのですが、web サーバとして共通する部分もあるので回答してみます。

* * *

ブラウザ経由で web アプリ(= プログラム) が呼び出された際、プログラムを実行するのはファイル自体の所有者ではなく、web
サーバのプロセスになります。同様に、プログラムからファイルの読み書きを行う場合には、web
サーバのプロセスに対して適切な権限が付与されている必要があります。

あなたが試した中にも出てきた `www-data` という名前が、web サーバのプロセスが動作する際に使用される一般的なユーザー/グループ名となります。  
(環境によって `apache`, `nginx` 等が使用される場合もあります)

Apache, Nginx ともに設定ファイルで実際に使用する権限 (ユーザー、グループ)
を変更することは可能ですが、ひとまず「ドキュメントルート以下の所有者 (またはグループ) は `www-data` に揃える」とした方が分かりやすいです。

また、ドキュメントルートに一般ユーザーからファイルの読み書きをできるようにするなら、 **`www-data` グループに対して**
ユーザーを追加しましょう。


CC BY-SA 4.0
2022-05-14T16:32:03.670
88818
2022-05-14T16:32:03.670
3060
88816
answer


> ① うまくいかない理由を知りたいです

775 にすべきところが 765 になっているからだと思います。  
ディレクトリ配下にアクセスするためには "x" (検索許可)が必要です。

> ② 正常動作させるにはどうすれば良いでしょうか？

admin:web 775 または admin:web 2775 (ディレクトリSETGIDビット追加) にするといいと思います。  
ディレクトリ配下に新規作成したファイルのグループが、775 では www-data (作成者のプライマリグループ)になり、2775 では web
(ディレクトリのグループ)になります。


CC BY-SA 4.0
2022-05-15T07:50:13.020
88825
2022-05-15T07:50:13.020
4603
88816
answer