今回はEC2+nginxを例にとり、安全で効率的なデプロイユーザーの運用についてご紹介します。

  • nginx(サーバー実行ユーザー)
  • ec2-user(デプロイユーザー)

と仮定します。

共有グループを設定してファイル権限を管理する

ec2-usernginx を同じグループに追加し、グループ権限を設定することでファイルアクセスを共有します。

ec2-userとnginxを共通のグループ(例: www-data)に追加

もし共有グループがなければ作成しておきましょう。今回の例ではwww-dataですが、適当な名前をつけましょう。

sudo groupadd www-data
sudo usermod -aG www-data ec2-user
sudo usermod -aG www-data nginx

プロジェクトのディレクトリ権限グループを変更し、グループに書き込み権限を与える

sudo chown -R ec2-user:www-data /path/to/project
sudo chmod -R 775 /path/to/project

プロジェクトのディレクトリにsetgidビットを設定する

今後プロジェクトディレクトリの中にファイルやディレクトリが新しく作成された際に、自動的にwww-dataグループに所属するようにしましょう。

sudo chmod -R g+s /path/to/project

これをしておけばec2-usergit pull しても、自動的に nginx ユーザーでもアクセス可能な権限でファイルが作成されます。

もしアプリケーション側でディレクトリ操作やコンテンツのアップロードが必要な場合は、nginx ユーザーに特定のディレクトリの所有権を与えましょう。

デプロイ専用のユーザーを作成してSSHキーを管理する

ec2-user に直接 git pull のためのSSHキーを設定するのではなく、デプロイ専用ユーザーを作成してそのユーザーにSSHキーを登録し、sudo権限を制限して管理します。

  1. デプロイユーザーを作成し、プロジェクトディレクトリにアクセスできるように設定しましょう。
    今回はデプロイユーザーを deployer とします。
  2. deployerにSSHキーを登録してGitHubにアクセスできるようにします。
  3. deployerユーザーを使ってgit pullを実行するGitHub Actionsなどの設定を行います。
sudo adduser deployer
sudo usermod -aG www-data deployer

推奨

Nginxの実行ユーザーをec2-userにする

Nginxの実行ユーザーを変更することはセキュリティリスクが高く、推奨しません。NginxはあくまでWebサーバー用のユーザーであり、ec2-userec2-user とは分離しておきましょう。

NginxユーザーでGitHubのSSHキーを設定する

Nginxユーザーは通常インターネットへのアクセス権限を持たないように設定されているため、GitHubへの接続に利用するのもやめときましょう。

まとめ

デプロイユーザーとWebサーバー実行ユーザーを同じグループに設定し、グループ権限でアクセスを管理する方法が最も一般的で、安全かつ簡単に管理できる方法です。