パーミッション

Linuxにインストールしたnginxのファイル及びディレクトリに関するパーミッションに関する内容について記載します。

パーミッション(permission)は、直訳すると日本語で「許可」を意味します。
その意味のとおり、ファイル及びディレクトリに対してアクセス権限(読取り、書込み、実行)を許可することです。

Linuxにインストールしたnginxなどのミドルウェアに関する権限周りの情報が安定しないのは、
日本のICTにおけるインフラのノウハウは、会社のセキュリティ事項や機密事項に該当し、
ICTのインフラ担当者やその会社にノウハウが閉じられやすい情報だからです。

777,775,644,・・,200,・・・とLinuxのコマンドであるchmodで付与できる権限ですが、
いざ任せられると何番を付与したら良いのかと毎回悩まされます。

まずは、chmodコマンドの付与できる権限の値とその内容の意味を抑えた上で、
nginxのドキュメントルート、設定ファイル、ログファイルなどの権限を決めていきます。

ls-la 先頭文字

パーミッション

ディレクトリとファイルのパーミッションは、「ls -la」コマンドを実行することで、確認できます。

Teratermから作業者アカウント(本書ではinfra01)でnginxをインストールしたwebサーバにリモートログインします。

「ls -la」コマンドでファイル及びディレクトリの一覧及び詳細を標準出力に出力し、
パイプ(|)の次のコマンド「grep nginx」で標準出力の結果から「nginx」が出力されている行を抽出します。

Linuxのパーミッションの確認
$ cd /usr/share
$ ls - la | grep nginx
$ drwxr-xr-x    3 root root  4096  4月 26 10:53 nginx
						

「ls -la」の出力結果1文字目の「d」は「directory」を意味します。
先頭1文字目の頭文字は以下のようになっています。

頭文字 説明
- ファイルを意味します。
d ディレクトリ(directory)を意味します。
l シンボリックリンク(symlink)を意味します。
p 名前付きパイプ(named pipe)を意味します。
名前付きパイプに関しては、mkfifoコマンドを確認下さい。
s ソケット(socket)ファイルを意味します。
名前付きパイプのようにプロセス間通信をする手段のファイルです。 ソフトウェアがTCP/IPプロトコルを利用する時に利用します。
c キャラクタ・デバイス(character device)を意味します。
入出力をバイト単位で取り扱うデバイスを意味します。
/devディレクトリに対してls-laを実行して確認できます。
b ブロック・デバイス(block device)を意味します。
入出力を一定のサイズ(ブロック)単位で取り扱うデバイスを意味します。
/devディレクトリに対してls-laを実行して確認できます。

パーミッションの見方-9桁

drwxr-xr-xと出力されたパーミッションの残り9桁は、3桁ずつに「所有者」「グループ」「その他」に対する権限を示しています。

先の図では、所有者の「root」アカウントに対して、「rwx」の読取り、書込み、実行の全権限を付与しています。
グループが「root」に対して、「r-x」の読取り、実行権限を付与しています。
同様にその他グループに対して「r-x」の読取り、実行権限を付与しています。

chmodコマンド

Linuxでファイル及びディレクトリの権限を変更するコマンドは、「chmod」コマンドです。

chmodコマンド
chmod モード Optionsファイル名

モードは、正規表現で記載されているように2つの方法があります。

  • 英字による指定 (対象=権限)形式
  • 8進数による指定 (000~777)形式

オールドタイプの私の経験では、開発現場で権限を決める場合には8進数表記がほとんどでした。

ただし、個人環境は忘れにくい英字による指定を利用しています。

chmod モードの英字指定

chmodのモードの英字指定方法について説明します。

chmod 対象=権限における対象は以下のとおりです。

頭文字 説明
u 所有者(owner)
g グループ(group)
o その他(other)
a 全て(all) ugoを指定するのと同値

例1)所有者、グループに読取りと実行権限を、その他に読取り権限を付与します。

chmod 英字指定の例
$ cd      ※.ログインしたユーザのホームディレクトリに移動(/home/infra01)
$ mkdir temp
$ ls -la  ※.作成直後の権限確認
$ drwxr-xr-x  2 infra01 infrateam  4096  5月 17 19:10 temp
$ chmod ug=rx
$ ls -la  
$ dr-xr-xr-x  2 infra01 infrateam  4096  5月 17 19:10 temp
$ chmod o=r
$ ls -la  
$ dr-xr-xr--  2 infra01 infrateam  4096  5月 17 19:10 temp
						

英字の場合には、所有者、グループ、その他の合計3種類を権限によっては、3回指定する必要があります。
英字で指定する方法は、コマンドの英字が英単語から推測しやすいので覚えやすいメリットはあります。

ここで、何故mkdirコマンドでtempディレクトリを作成した直後の権限が「rwxr-xr-x」となったのでしょうか?
こういうちょっとした事に「なんで(why so)」と考える事がとても大切です。
理由は、umaskでアカウント別にデフォルトのファイル、デイレクトリの権限の減算値を設定しているからです。

umaskコマンドによるumask値の確認
$ umask
$ 0022
						

この0022がグループとその他に対して、8進数表記の全権限777から「書込み(2)」を減算する事で
デフォルトの権限「rwxr-xr-x」(755)が作成されました。

chmod モードの8進数指定

パーミッション桁数

8進数表記は覚えればとても簡単な表記方法です。英字と比較すると数字の意味する権限を忘れやすい事が唯一のデメリットでしょうか。

000(全対象に権限なし)~777(全対象に全権限)までの数値が指定できます。各桁数の意味は以下となります。

桁数 説明
3桁目 所有者の権限を表します。
例1) 700・・所有者のみ全権限
例2) 644・・所有者は読取りと書込み、グループとその他は読取り権限
2桁目 グループの権限を表します。
1桁目 その他の権限を表します。

それぞれの桁数の数値の意味は以下となります。

数値 英字 権限
4 r 読取り(read)権限
2 w 書込み(write)権限
1 x 実行(execute)権限
0 - 全権限なし

上記表0,1,2,4の組み合わせで3,5,6,7の権限を意味しています。

数値 数式 権限
7 4+2+1 全権限
6 4+2 読取り(4)+書込み(2)
5 4+1 読取り(4)+実行(1)
3 2+1 書込み(2)+実行(1)

8進数表記の権限も覚えれば簡単ですね。忘れにくいように次のように覚えると良いでしょう。

chmodの8進数表記における4(よん)みとり(読取り)を意味する。

残りの2,1は読取り、書込みのような対になるような単語が離れて定義されるのは不自然と考えると2は「書込み」と理解できます。

次頁以降に具体的なnginxの権限に関して説明します。