今回はEC2+nginxを例にとり、安全で効率的なデプロイユーザーの運用についてご紹介します。
- nginx(サーバー実行ユーザー)
- ec2-user(デプロイユーザー)
と仮定します。
共有グループを設定してファイル権限を管理する
ec2-user
と nginx
を同じグループに追加し、グループ権限を設定することでファイルアクセスを共有します。
ec2-userとnginxを共通のグループ(例: www-data)に追加
もし共有グループがなければ作成しておきましょう。今回の例では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-user
で git pull
しても、自動的に nginx
ユーザーでもアクセス可能な権限でファイルが作成されます。
もしアプリケーション側でディレクトリ操作やコンテンツのアップロードが必要な場合は、nginx
ユーザーに特定のディレクトリの所有権を与えましょう。
デプロイ専用のユーザーを作成してSSHキーを管理する
ec2-user
に直接 git pull
のためのSSHキーを設定するのではなく、デプロイ専用ユーザーを作成してそのユーザーにSSHキーを登録し、sudo権限を制限して管理します。
- デプロイユーザーを作成し、プロジェクトディレクトリにアクセスできるように設定しましょう。
今回はデプロイユーザーを deployer
とします。
- deployerにSSHキーを登録してGitHubにアクセスできるようにします。
- deployerユーザーを使ってgit pullを実行するGitHub Actionsなどの設定を行います。
sudo adduser deployer
sudo usermod -aG www-data deployer
非推奨
Nginxの実行ユーザーをec2-userにする
Nginxの実行ユーザーを変更することはセキュリティリスクが高く、推奨しません。NginxはあくまでWebサーバー用のユーザーであり、ec2-user
や ec2-user
とは分離しておきましょう。
NginxユーザーでGitHubのSSHキーを設定する
Nginxユーザーは通常インターネットへのアクセス権限を持たないように設定されているため、GitHubへの接続に利用するのもやめときましょう。
まとめ
デプロイユーザーとWebサーバー実行ユーザーを同じグループに設定し、グループ権限でアクセスを管理する方法が最も一般的で、安全かつ簡単に管理できる方法です。