Linuxのグループの使い方


## 環境

  * 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]

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




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

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

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

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

