その他ディレクトリ・ファイルのパーミッション

sudo apt-get install nginxでインストールしたnginxのディレクトリ及びファイルのディレクトリは、
ディレクトリのファイルと所有者、グループがrootアカウント及びrootグループに設定されます。

前頁で説明したドキュメントルートのように他のディレクトリ・ファイルの所有者・グループ・パーミッションを変更します。

/etc/nginx

nginxの設定ファイル格納先ディレクトリの所有者・権限・パーミッションを変更します。
nginxの設定を許可する対象は、nginxグループとします。本書では、ユーザアカウントinfra01にnginxグループを付与しています。

  1. Teratermなどのsshクライアントからユーザーアカウントinfra01(nginxグループ)からwebサーバにログインします。
  2. /etc/nginxのパーミッションを確認する
    $ cd /etc
    $ ls -la | grep nginx
    drwxr-xr-x   6 root root     4096  5月 19 19:10 nginx
    							
  3. nginxサービスを停止して所有者・グループ・パーミッションを変更します。
  4. /etc/nginxのパーミッションを確認する
    $ cd /etc
    $ sudo systemctl stop nginx
    $ chown -R nginx:nginx nginx
    $ find nginx -type d -print | xargs sudo chmod 770
    $ find nginx -type f -print | xargs sudo chmod 660
    $ sudo systemctl start nginx
    							
    設定ファイルは、nginxのmasterプロセス即ちrootアカウントからアクセスするので権限なし(000)でも実行できる。
    /etc/nginx以下のデイレクトリは、nginxのmasterプロセス即ちrootアカウントからアクセスするので権限なし(000)でも実行できる。

    ただし、上記000だと色々実害がでてきます。cd,grep,findにもsudoが必要になります。
    重要なのは、nginxグループに何処まで許可をするかです。770は、nginxグループに全ての操作を許可しています。

    誤操作防止のために運用で変更できないようにするには、ディレクトリは550、ファイルは440で良いと思います。
    書込み処理ができなくなるため設定変更時には、sudoによる操作や作業前にsudo chmodで権限の変更を手順とする設計です。

    /var/log/nginx

    /var/log/nginxディレクトリは、nginxのアクセスログ(access.log)及び実行ログ(error.log)を保管するディレクトリです。

    ログファイルを操作するプロセスは以下となります。

    1. nginxのmasterプロセス(root)
    2. nginxのworkerプロセス(nginx)
    3. ログローテーション(logrotate)

    1.masterプロセスは、sudo systemctl strat nginxとサービスから起動していればrootアカウントプロセスで実行されるので、 ログファイルの権限は何を設定されても実行できます。 2.workerプロセスは、nginxアカウントのため、ファイルの書込み、読込みの権限が必要です。 3.ログローテションは、/var/logrotate.d/nginxファイルにローテーション時に作成するパーミッション、所有者、グループを定義しています。

    /var/logrotate.d/nginxファイル
    /var/log/nginx/*.log {
            daily
            missingok
            rotate 52
            compress
            delaycompress
            notifempty
            create 640 nginx adm
            sharedscripts
            postrotate
                    if [ -f /var/run/nginx.pid ]; then
                            kill -USR1 `cat /var/run/nginx.pid`
                    fi
            endscript
    }
    							

    8行目の「create 640 nginx adm」がログローテション後に新しく作成するログファイルの権限です。

    この所有者:nginx グループ:adm パーミッション:640は、理に適っているので/var/log/nginxに適用します。

    /etc/nginxのパーミッションを確認する
    $ cd /var/log
    $ sudo systemctl stop nginx
    $ sudo chown -R nginx:adm nginx
    $ find nginx -type d -print | xargs sudo chmod 750
    $ find nginx -type f -print | xargs sudo chmod 640
    $ sudo systemctl start nginx
    							

    ログファイルの閲覧は、admグループのみ(作業用ユーザinfra01には付与しています)が閲覧可能となります。
    ログファイルはwebサーバの証跡なので、前記3つのプロセス以外からは変更不可能とします。

    /usr/sbin/nginx

    /usr/sbin/nginxファイルは、nginxのバイナリー本体(コマンド)です。
    sudo apt-get install nginxでインストールしたデフォルトのパーミッションは以下の通りです。

    /usr/sbin/nginxのパーミッションを確認する
    $ cd /usr/sbin
    $ ls -la | grep nginx
    $ -rwxr-xr-x  1 root root 1255432  4月 12 22:05 nginx
    $ -rwxr-xr-x  1 root root 1390600  4月 12 22:05 nginx-debug
    							

    ここで2つのバイナリーファイルのパーミッションをみて一番問題な点は何でしょうか?
    正解は、パーミッションがその他にも実行権限が付与されている点です。

    nginxのサービスの実行は、nginxグループのみ許可するポリシーを私は推奨します。

    /usr/sbin/nginxのパーミッションを変更する
    $ cd /usr/sbin
    $ sudo systemctl stop nginx
    $ sudo chown -R nginx:nginx nginx
    $ sudo chown -R nginx:nginx nginx-debug
    $ sudo chmod 750 nginx
    $ sudo chmod 750 nginx-debug
    $ sudo systemctl start nginx
    							

    /var/chche/nginx

    nginxのproxy機能などを有効にした場合のキャッシュファイルなどを格納するディレクトリです。

    他のディレクトリと同様にworkerプロセスのnginxアカウントに対して全権限を付与し、nginxグループに読取りと実行権限を付与します。

    /var/chche/nginxのパーミッションを変更する
    $ cd /var/chache
    $ sudo systemctl stop nginx
    $ sudo chown -R nginx:nginx nginx
    $ sudo find nginx -type d -print | xargs sudo chmod 750
    $ sudo find nginx -type f -print | xargs sudo chmod 640
    $ sudo systemctl start nginx
    							

    ※.「sudo find nginx -type f -print | xargs sudo chmod 640」コマンドは、proxy機能を有効にしていない場合には、
    ファイルが存在しないため、「chmod: `640' の後にオペランドがありません」が出力される可能性があります。

    /var/lib/nginx

    nginxのモジュール別(proxy,fastcgiなど)の作業用ディレクトリです。
    nginxのworkerプロセスnginxアカウントに対する権限を付与します。

    /var/lib/nginxのパーミッションを変更する
    $ cd /var/lib
    $ sudo systemctl stop nginx
    $ sudo chown -R nginx:nginx nginx
    $ sudo find nginx -type d -print | xargs sudo chmod 750
    $ sudo find nginx -type f -print | xargs sudo chmod 640
    $ sudo systemctl start nginx
    							

    ※.「sudo find nginx -type f -print | xargs sudo chmod 640」コマンドは、各種モジュールを有効にしていない場合には、
    ファイルが存在しないため、「chmod: `640' の後にオペランドがありません」が出力される可能性があります。

    /usr/lib/nginx

    nginxの動的モジュールの格納先ディレクトリです。
    コンパイルを利用して動的モジュールを利用した場合にモジュールを格納します。

    /usr/lib/nginxのパーミッションを変更する
    $ cd /usr/lib
    $ sudo systemctl stop nginx
    $ sudo chown -R nginx:nginx nginx
    $ sudo find nginx -type d -print | xargs sudo chmod 750
    $ sudo find nginx -type f -print | xargs sudo chmod 640
    $ sudo systemctl start nginx
    							

    ※.「sudo find nginx -type f -print | xargs sudo chmod 640」コマンドは、動的モジュールをインストールしていない場合には、
    ファイルが存在しないため、「chmod: `640' の後にオペランドがありません」が出力される可能性があります。