sudo apt-get install nginxでインストールしたnginxのディレクトリ及びファイルのディレクトリは、
ディレクトリのファイルと所有者、グループがrootアカウント及びrootグループに設定されます。
これを一部ディレクトリとファイルを除き、所有者をnginxアカウントにグループをnginxグループに変更します。
所有者やグループをシステムアカウントに変更するのは、パーミッションの設定とあわせてセキュリティを高めることが目的です。
nginxのディレクトリとファイルは、以下に要約されます。
詳細については、nginx 初期構成をご確認下さい。
ファイルまたはディレクトリ | 概要 |
---|---|
/usr/sbin/nginx | nginxコマンド本体 |
/etc/nginx | nginxの設定ファイル格納先ディレクトリ |
/usr/shere/nginx/html | nginxのデフォルトのドキュメントルート |
/var/log/nginx | nginxのアクセスログ、実行ログ格納先ディレクトリ |
/etc/logrotate.d/nginx | ログローテション機能におけるnginxの設定ファイル |
/usr/lib/nginx | nginxの動的モジュールの格納先ディレクトリ |
/var/lib/nginx | nginxのモジュール別(proxy,fastcgiなど)の作業用ディレクトリ |
/etc/init.d/nginx | nginxのデモーン(サービス)用スクリプトファイル |
/etc/ufw/applications.d/nginx | ubuntuのファイヤーウォール機能であるUFW(uncomplicated firewall)のnginx用設定ファイル |
/usr/share/doc/nginx | nginxのライセンスドキュメントやREADMEドキュメント格納先 |
/usr/share/lintian/overrides/nginx | debianの説明の 5.14. {package.,source/}lintian-overridesをご確認下さい。 |
/var/cache/nginx | nginxのproxy機能などを有効にした場合のキャッシュファイルなどを格納するディレクトリ |
1つ1つ丁寧にチェックして、所有者・グループ・パーミションを変更した後に動作確認をしていきます。
nginxアカウント(Ubuntu)の概要図にあるように nginxのmasterプロセスはrootアカウントで実行され、workerプロセスは設定ファイル/etc/nginx/nginx.confの「user nginx;」指定されたnginxアカウント(システムアカウント)で実行されます。
rootアカウントは、ディレクトリ及びファイルの所有者、グループ、パーミッションの権限に関係なく全てのディレクトリ、ファイルを操作できます。 逆にnginxアカウントは、nginxアカウントまたはnginxグループに適切なパーミッションを付与しなければ、ファイルの実行、開閉やディレクトリアクセスで権限エラーになります。 同様にユーザアカウントinfra01(nginxグループ)でwebコンテンツの配備やnginxの設定変更などもnginxグループに対する適度なパーミッションを付与する必要があります。
これだけは避けて下さい。アカウント、グループ、パーミッション、ミドルウェアが必要な最低な権限を抑えていれば、
777以外の適切なパーミッションを付与できます。
所有者以外グループ、その他に対するパーミッションに「7(全権限)」が付与された時点で、「この権限必要?」と疑問を感じて下さい。
まずは、nginxのドキュメントルートに関して変更してみましょう。
nginxのデフォルトのドキュメントルートは、設定ファイル(/etc/nginx/conf.d/default.conf)にroot /usr/share/nginx/htmlと定義されています。
前提条件としては、phpなどの動的なスクリプト(動的にhtmlを出力する機能)を利用していないこととします。
Teratermなどのsshクライアントからユーザーアカウントinfra01(nginxグループ)からwebサーバにログインします。
/usr/share/nginx/のデフォルト値を確認する
$ cd /usr/share
$ ls -la | grep nginx
$ drwxr-xr-x 3 root root 4096 4月 26 10:53 nginx
sudo apt-getコマンドでインストールされたnginxのドキュメントルートの所有者はroot,グループもrootです。
パーミッションは、umaskで設定されている0022が減算値となり、755になっています。
nginxのworkerプロセスがドキュメントルートの各ディレクトリのwebリソースを読み込みhttpのレスポンスとして出力するには、
実際に所有者、グループ、パーミッションを変えて検証します。
ドキュメントルートのhtmlを確認
$ cd /usr/share/nginx/html
$ ls -la
$ -rwxr-xr-x 1 root root 612 5月 8 20:06 index.html
ドキュメントルートのhtmlの所有者、グループを変更
$ chown -R nginx:nginx index.html
$ ls -la
$ -rwxr-xr-x 1 nginx nginx 612 5月 8 20:06 index.html
ファイルの実行権限のみ付与します。
$ sudo chmod 100 index.html
$ ls -la
$ ---x------ 1 nginx nginx 612 5月 8 20:06 index.html
ログファイルの確認
$ cd /var/log/nginx
$ cat access.log
$ 192.168.109.2 - - [22/May/2017:10:04:24 +0900] "
GET / HTTP/1.1" 403 571 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" "-"
$ cat error.log
2017/05/22 10:04:24 [error] 933#933: *31 open() "/usr/share/nginx/html/index.html"
failed (13: Permission denied), client: 192.168.109.2, server: localhost, request: "GET / HTTP/1.1", host: "192.168.109.4"
ファイルの実行権限のみ付与します。
$ cd /usr/share/nginx/html
$ sudo chmod 200 index.html
$ ls -la
$ --w------- 1 nginx nginx 612 5月 8 20:06 index.html
ファイルの実行権限のみ付与します。
$ cd /usr/share/nginx/html
$ sudo chmod 400 index.html
$ ls -la
$ -r-------- 1 nginx nginx 612 5月 8 20:06 index.html
次にドキュメントルートのディレクトリ(/usr/share/nginx/html)の権限を変更してきます。
ドキュメントルートディレクトリを確認
$ cd /usr/share
$ ls -la | grep nginx
$ drwxr-xr-x 3 root root 4096 4月 26 10:53 nginx
ディレクトリの所有者、グループを変更
$ sudo chmod -R nginx:nginx nginx
$ ls -la | grep nginx
$ drwxr-xr-x 3 nginx nginx 4096 4月 26 10:53 nginx
$ cd nginx
$ ls -la
$ drwxr-xr-x 3 nginx nginx 4096 5月 22 09:47 html
ディレクトリのパーミッションを変更
$ cd /usr/share/nginx
$ sudo chmod 100 html
$ ls -la
$ d--x------ 3 nginx nginx 4096 5月 22 09:47 html
ディレクトリのパーミッションを書込み権限に変更
$ cd /usr/share/nginx
$ sudo chmod 200 html
$ ls -la
$ d-w------- 3 nginx nginx 4096 5月 22 09:47 html
ディレクトリのパーミッションを読込み権限に変更
$ cd /usr/share/nginx
$ sudo chmod 400 html
$ ls -la
$ dr-------- 3 nginx nginx 4096 5月 22 09:47 html
ディレクトリのパーミッションを実行権限に変更
$ cd /usr/share/nginx
$ sudo chmod 100 html
$ ls -la
$ d--x------ 3 nginx nginx 4096 5月 22 09:47 html
/usr/share/nginx/htmlディレクトリにwebコンテンツを配備します。
ディレクトリのパーミッションを読込み権限に変更
$ cd ※./home/infra01にカレントデイレクリを移動
$ mkdir work
$ cd work
$ mkdir 20170522
zipファイルの解凍
$ cd ※./home/infra01にカレントデイレクリを移動
$ cd work/20170522
$ ls -la
$ rw-r--r-- 1 infra01 infrateam 3374127 5月 22 11:08 education.zip
$ unzip education.zip
$ ls -la
$ drwxr-xr-x 6 infra01 infrateam 4096 5月 22 11:29 education
$ -rw-r--r-- 1 infra01 infrateam 3374127 5月 22 11:08 education.zip
コンテンツの権限変更
$ cd ~/work/20170522
$ chown -R nginx:nginx education
# ※.education以下のディレクトリ権限を775に変更
$ find education -type d -print | xargs sudo chmod 775
# ※.nginx以下のファイル権限を664に変更
$ find education -type f -print | xargs sudo chmod 664
コンテンツを上げる
$ pwd
$ /home/infra01/work/20170522
$ cp -r education/* /usr/share/nginx/html/
ドキュメントルートの権限変更
$ cd /usr/share
$ chown -R nginx:nginx nginx
# ※.nginx以下のディレクトリ権限を775に変更
$ find nginx -type d -print | xargs sudo chmod 775
# ※.nginx以下のファイル権限を664に変更
$ find nginx -type f -print | xargs sudo chmod 664
コンテンツを上げる
$ cd ~/work/20170522
$ pwd
$ /home/infra01/work/20170522
$ cp -rf education/* /usr/share/nginx/html/
所有者、グループ、パーミッションの確認
$ cd /usr/share/nginx/html
$ ls -la
$ drwxrwxr-x 4 nginx nginx 4096 5月 22 12:28 css
$ -rw-rw-r-- 1 nginx nginx 4286 1月 18 01:56 favicon.ico
$ drwxrwxr-x 2 nginx nginx 4096 5月 22 11:59 fonts
$ drwxrwxr-x 2 nginx nginx 4096 5月 22 12:10 images
$ -rw-rw-r-- 1 nginx nginx 11959 5月 17 20:50 index.html
$ drwxrwxr-x 4 nginx nginx 4096 5月 22 11:59 js
私は、ディレクトリのパーミッションに対して、nginxアカウントとnginxグループに7(全権限)を付与しました。
これは、nginxグループに所属するアカウントinfra01ユーザアカウントがコンテンツをアップロードするために付与しました。
同様にファイルに関しても、nginxアカウントとnginxグループに6(読取り+書込み[削除含む])を付与しました。
この結果ディレクトリに775を付与して、ファイルには664を設定しました。
多くの書籍、webで情報が不足しているのが、作業者のユーザアカウントとそのグループ、ホームディレクトリを明示せずに
755,644とnginxアカウントのみに権限を付与しています。
これでコンテンツをアップロードできるアカウントは、nginxアカウントかrootアカウント(sudo)となります。
本書の例では、775を755に664を644に変更した場合には、 cp -rf education/* /usr/share/nginx/html/を
sudo cp -rf education/* /usr/share/nginx/html/ に変更すれば実行可能です。
よく見かける755と644ですが、sudoコマンドをどうせ使うのであれば何故、550,440や100と400にしないのでしょうか?
これは、あくまでも推測でしかないのですが、755,644を付与してsudo cpコマンドが明記されていない
情報の製作者が利用しているアカウントは、root又はnginxをログイン(nologinを解除)して、実行されているからでしょう。
また、Linuxの慣習から755と644に従っているだけで、そのようにすべきと定義された情報を知っている人は数少ないと思います。
以下にアカウント設計、ディレクトリのパーミッション設計時に留意して欲しい内容を明記します。
以上から、nginxのドキュメントルートのパーミッションに関しては、ディレクトリが775~100、ファイルが664~400を ベースに会社のセキュリティポリシーを鑑みて、インフラチーム、運用チーム、共通チームと相談して具体的な設定値を確定します。