📝

Nginxのunprivilegedって?

に公開

unprividegedって?

unprivideged、あまり聞きなれない単語ですが「非特権」、「権利がない」などの意味があります。

Nginxのイメージにunprividegedというものがある

意味を聞けばNginxではどのような立場になるのかはなんとなくわかると思いますが、nginx-unprivilegedだとroot権限がないNginxになります。

dockerHubにnginx-unprivilegedというイメージがあります。

https://github.com/nginx/docker-nginx-unprivileged

普通のNginxのイメージと何が違うの?

では具体的にNginxのイメージと何が違うのでしょうか?

非特権ポートをlistenする

通常だとHTTPやHTTPSなどをlistenすることが多いと思います。HTTPは80、HTTPSだと443ですが、この二つを含めた0-1023までのポートは特権ポートと呼ばれていて、起動するにはroot権限が必要です。

まずroot権限でmasterプロセス(プロセスを管理したり、バインドしたりするプロセス)を起動してから、80にソケットを割り当ててリクエストを受け付けます。

ですがnginx-unprivilegedは8080をlistenします。
8080は非特権ポートであるため通常のユーザー権限で起動とバインドができます。root権限を使わなくてもプロセスを起動しバインドすることができるので非常にセキュアになるわけです。

userディレクティブがnginx.confから削除されている

userディレクティブとはnginx.confで定義され、低権限のユーザーがworkerプロセスをどのように動かすのか設定する記述のことです。

user nginx 

なぜnginx-unprivilegedで削除されているかというとworkerプロセスを動かすユーザーを指定する必要がないからです。

userディレクティブでworkerプロセスを別ユーザーで動かすのはroot権限を持った状態でプロセスを動かしてしまうことが非常に危険だからです。
そのため一般的にはmasterプロセスで起動した後にworkerプロセスを動かすための最低限の権限を持ったユーザーを指定するのです。

ところが前述したようにnginx-unprivilegedでは8080をlistenするためmasterプロセスがroot権限で実行されることはありません。つまり別のユーザーでプロセスを動かす必要がないので、workerプロセス用のuserディレクティブを定義がいらないというわけです。

デフォルトの NGINX PID は、/var/run/nginx.pid (NGINX 1.27.5 より前) および /run/nginx.pid (NGINX 1.27.5 以降) から /tmp/nginx.pid に移動された

PIDファイルとはプロセスのIDを記録してプロセスの管理や運用をするためのファイルです。

nginx.pidというのがnginxのマスタープロセスのIDを書き込むためのファイルなのですが元々はvar/run/に配置されていました。

しかしvar/は基本的にroot権限で使用されることが多く、一般ユーザーの権限だと書き込めない場合があります。
それに対してtmp/は一時的なファイル用のディレクトリですがこちらは一般ユーザーの書き込みが可能なディレクトリとなるのでnginx-unprivilegedではtmp/にPIDファイルが移されているというわけです。

Discussion