パーミッション(アクセス許可)

セキュリティの問題は、マルチユーザ・システムにはつきものです。 真のマルチユーザ/マルチタスク対応のオペレーティング・システム(OS)である UNIXには、洗練されたファイルとディレクトリのパーミッション(アクセス許可) を設定できる機能が実装されています。

chmod コマンド
ユーザとグループ
ファイル属性のビットとモード ファイル属性ビット モード・ビット


chmod コマンド

chmod は、基本を把握すれば簡単です。 このコマンドを理解するために、 ls -l コマンドで作成された小さなディレクトリ・リストを調べてみましょう。

 $ ls -l
  drwxrwxr-x    1 mob      wp    2018 Aug 30 23:45 adir
  -rw-rw-r--    1 mob      wp    8755 Aug 30 23:37 picture.gif
  -rwxrwxr-x    1 mob      wp    8525 Sep  4 02:48 command.sh 

パーミッションは、リストの左側にある一連の文字で表示されます。
最初の文字は、リスト項目の形式を示します。
上記の例では、[-]か[d]の2種類が表示されています。
[-]ファイル[d]ディレクトリを表わします。

リストの左の最初の文字の後の[rwx]の文字列(または[-])は、 そのファイル/ディレクトリへのアクセス許可を示します。

後の 9文字は、3文字ずつからなる3つのグループに分かれます。
各グループは、左から右へそれぞれ

  1. ファイルの所有者
  2. 同じグループのメンバ
  3. その他のユーザ
が持っているパーミッションを示します。

[r]は左から順に、所有者であるユーザ、ファイル所有者が所属するグループ、 その他大勢が、読み取り許可を持つことを示します。 [r]が表示されていれば、そのファイルを読むことができます。 ディレクトリの場合は、ls(または同じ機能を持つ) コマンドでそのディレクトリ内にあるファイルのリストを表示できます。

[w]は、ファイルの書き込み許可を表わします。 ディレクトリの場合、w はそのディレクトリの中に新しいファイルを作成できます。

以下の例では、所有者「mob」がファイル「picture.gif」 の読み取り許可と書き込み許可を持っています。
グループ「wp」に所属するユーザは読み取り許可だけを持ち、 それ以外の許可を持っていません。

 $ ls -l
  -rw-r-----    1 mob      wp    8755 Aug 30 23:37 picture.gif

[x]は、実行形式ファイルの場合は実行許可を、 ディレクトリの場合は検索許可を示します。

以下の例では、所有者「mob」とグループ「wp」のメンバ、 その他の全員が「adir」ディレクトリの検索許可を持っています。

 $ ls -l
  drwxrwxr-x    1 mob      wp    2018 Aug 30 23:45 adir
  -rw-rw-r--    1 mob      wp    8755 Aug 30 23:37 picture.gif
  -rwxrwxr-x    1 mob      wp    8525 Sep  4 02:48 command.sh

標準的なデータ・ファイルの場合、[x]は無効です。

ファイルに関する許可を変更するには chmod を使い、 変更したい許可とファイル名を指定します。
許可は、1文字の識別子で表現されます。

それぞれの識別子は、次の意味があります。

その後に続く[+][-][=]は、 それぞれ「追加」「削除」「設定」を示します。 これらの文字の後に、[r][w][x]の許可を付けます。 許可文字列は、以下の例のようになります。

u+rw        ユーザに読み取り、書き込み許可を追加します
a-w         全員から書き込み許可を削除します
o+x         その他に実行許可を追加します
a=rwx       全員に読み取り書き込み実行許可を設定します

さらにいくつかの例を以下に示します。

1  $ ls -l
2    -rw-r-----    1 mob      wp    8755 Aug 30 23:37 picture.gif
3  $ chmod g+w picture.gif         #   グループに書き込み許可を追加
4  $ ls -l
5    -rw-rw----    1 mob      wp    8755 Aug 30 23:37 picture.gif
6  $ chmod u-w picture.gif         #   ユーザから書き込み許可を削除
7  $ ls -l
8    -r--rw----    1 mob      wp    8755 Aug 30 23:37 picture.gif
9  $ chmod o+r picture.gif         #   その他に読み取り許可を追加
10 $ ls -l
11   -r--rw-r--    1 mob      wp    8755 Aug 30 23:37 picture.gif
12 $ chmod o=w picture.gif         #   その他に書き込み許可のみを設定
13 $ ls -l
14   -r--rw--w-    1 mob      wp    8755 Aug 30 23:37 picture.gif
15 $ chmod a-rw picture.gif        #   全員から読み取り/書き込み許可を削除
16 $ ls -l
17   ----------    1 mob      wp    8755 Aug 30 23:37 picture.gif
18 $ chmod ug+rw picture.gif       #   ユーザとグループ読み取り/書き込み許可を追加
19 $ ls -l
20   -rw-rw----    1 mob      wp    8755 Aug 30 23:37 picture.gif




ユーザとグループ

UNIXシステムでは、ユーザは、単純に「グループ」と呼ばれる階層で分類されます。
UNIXシステムの一般的な「グループ」には、root、admin、users、mailがあります。

superuserとrootは、rootグループのメンバです。 バックアップ、復元、マウントなど、管理者権限での操作を行なうユーザは adminグループに所属します。 メール・システムを扱うユーザはmailグループに所属します。 残りはusersグループです。

UNIX のユーザは /etc/passwd に登録されています。
また UNIX のグループは /etc/group に登録されています。

ユーザを作成するときにはグループを指定します。 自分のグループを知るには、ログインして以下のコマンドを入力します。 以下の例では、mob がユーザ名です。

 $ cat /etc/passwd|grep mob
mob:x:537:500::/home/mob/:/bin/ksh

1番目の項目のmobは、ログインIDを示します。
2番目の項目のxは、暗号化されたパスワードを表しています。 ここにはxまたは読み取り不能文字が表示されます。
3番目の項目の 537 は、自身のユーザID です。
4番目の項目の500は、グループID です。
この数字を書き留めておき、 グループ・ファイルを検索して、どのグループが500か、 誰がそのグループのメンバかを検索してみましょう。

以下の例では、wpはグループ500でパスワード保護されています。 wpグループのメンバはmobとjjk です。

$ cat /etc/group|grep 500
wp:x:500:mob,jjk

自分が所属している全グループを見たい場合は、自分のユーザIDでgrep します。 以下の例では、ユーザ「mob」がグループ「wp」「accounting」「admin」 に所属しています。

$ cat /etc/group|grep mob
wp:x:500:mob,jjk
accounting:x:512:mob,jan,ded
admin:x:mob,root

ユーザがログインすると、そのユーザの/etc/passwd ファイルに指定されたデフォルトのグループにセットされます。

新しいファイルを作成してから ls -l してみると、そのファイルには、 ユーザが所有者に割り当てられているのと同時に、 ユーザのデフォルトのグループが割り当てられます。

以下の例は、touchコマンドで空のファイルを作成し、 ls でそのファイルのパーミッションを表示しました。

$ touch newfile
$ ls -l
  -rw-rw-r--    1 mob      wp    0 Sep 22 23:37 newfile

newgrpを使うと、グループを自分がメンバになっている新しいグループに変更できます。 そのグループがパスワード保護されている場合は、パスワードを要求されます。 新しいグループに変更した後に新しいファイルを作ると、 そのファイルは新しいグループの所有になります。

$ newgrp accounting
$ touch nextfile
$ ls -l
  -rw-rw-r--    1 mob    wp           0 Sep 22 23:37 newfile
  -rw-rw-r--    1 mob    accounting   0 Sep 22 23:37 nextfile

練習として、viエディタで新しいファイルを作成し、 それに適当な文字列を書き込んでみましょう。

次にファイルを閉じ、「ユーザ」「グループ」「その他」 から読み取り/書き込み許可を追加、削除してパーミッションを変更します。 そして、そのファイルを編集してみましょう。 自分のグループの一員ではない別のユーザとしてログインできるのなら、 別のユーザとしてファイル編集を試みてみよう。

ここで、いくつかの一般的なルールを説明します。 まず、全ユーザについて読み取り/書き込み許可を持つファイル、 つまり[-rw-rw-rw-]のものです。誰もが、このファイルを編集できるはずです。
しかし[chmod o-rw]で[-rw-rw----]とすると、 編集できるのは自分と自分のグループのメンバだけになります。
[chmod g-rw]で[-rw-------]とすれば、ファイルを編集できるのは自分だけです。
[chmod u-w]で[-r--------]とした場合は、 自分でも文書を見ることはできるが変更や削除はできなくなります。

ディレクトリでも同じ実験をしてみましょう。
パーミッション文字列が[drwxrwxrwx]のディレクトリについては、 誰でも読み取り/書き込み(新しいファイルの作成)/検索が可能です。

ディレクトリのパーミッションで、より一般的なのは[drwxrwxr-x]です。
これは、自分と自分のグループはフル・アクセスを許可されていますが、 他のユーザは読み取りと検索しかできません。 極めてセキュリティの高いディレクトリならば、 [dr--------]に設定すべきです。 つまり、ディレクトリの所有者しか読むことができません。




ファイル属性のビットとモード

ファイル属性ビット

ls -l でモード・ビットが(左から右へ)それぞれ

として表示されることを説明しました。

-rwxrwxr-x    1 mob      wp    2018 Aug 30 23:45 afile

この9個のフラグは、実際には9個のモード・ビット (1バイト+別のバイトの一部)として保存されます。 モード・ビットのビット・パターンは8進法表記で表されます。

上記のフラグは、[111111101]または[111 111 101] というビット・パターンに相当し、[775]で表すことができます。 ファイルに関してこのような正確な許可をセットしたい場合は、 以下のコマンドを使用します。

$ chmod 775 afile
$ ls -l
-rwxrwxr-x    1 mob      wp    2018 Aug 30 23:45 afile

図1は、8進法表記を使ってモード・ビットを直接セットする方法を示しています。 最後の例では、ファイルを読み取り専用にしています。

$ chmod 775 afile
$ ls -l
-rwxrwxr-x    1 mob      wp    2018 Aug 30 23:45 afile
$ chmod 770 afile
$ ls -l
-rwxrwx---    1 mob      wp    2018 Aug 30 23:45 afile
$ chmod 750 afile
$ ls -l
-rwxr-x---    1 mob      wp    2018 Aug 30 23:45 afile
$ chmod 740 afile
$ ls -l
-rwxr-----    1 mob      wp    2018 Aug 30 23:45 afile
$ chmod 444 afile
$ ls -l
-r--r--r--    1 mob      wp    2018 Aug 30 23:45 afile

図1:8進法表記を使ったモード・ビットの設定

モード・ビット

実際には、ファイルとディレクトリのモードを制御するビットがさらに3個あります。 しかしそれらはまた別の形式で表示されります。 その内、2ビットはファイルに適用され、 残り 1ビットはディレクトリに適用されます。

  1. 第1のビットは、実行可能なプログラムまたはシェル・スクリプトの set user ID のプロパティを制御します。

    プログラムやスクリプトにこのビットがセットされている場合、 そのスクリプトにはスクリプト所有者の特権が備わっています。 このモードの目的は、バックアップ・スクリプトに似たものを提供することにあります。 スクリプト所有者がrootならば、 rootは全ファイルのバックアップに必要な特権を持っています。 しかしこのスクリプトは、 バックアップ作業を行うオペレータならば誰でも実行可能です。 バックアップを実行するためには、かならずしもroot特権を持つ必要はありません。

  2. 第2のビットは、グループに関して上記と同じ機能を制御できます。

    このビットがセットしてあるプログラムまたはスクリプトは、 ファイルを所有するグループの特権を備えています。

  3. 第3のビットは、ディレクトリの振る舞いを制御できます。

    このビットは、一般にスティッキー・ビットと呼ばれています。 このビットがセットしてあるディレクトリの場合、 ディレクトリに含まれるファイルの削除やファイル名を変更できるのは、 他にどのような許可がユーザに与えられているかに関係なく、 rootとそのディレクトリの所有者だけです。

    これは一時ディレクトリや作業ディレクトリで多く使われます。 これらのディレクトリについては多くのユーザが書き込み可能でなければいけませんが、 他人のファイルについてファイル名の変更や削除することは許されません。

上記の3個のビットは、アクセス許可を表す9ビットのビット・パターンの先頭に追加され、 合計12ビットのビット・パターンを構成します。

図2では、最初のコマンドによってrootまたはmob(ディレクトリの所有者) 以外のユーザによるadir中のファイルの削除やファイル名の変更が阻止されます。 許可文字列の最後の位置にある[t]に注意してください。

第2のコマンドは、バックアップ・スクリプトの実行をすべてのユーザに許可しています。 しかしスクリプトを実行するときは、そのスクリプトはroot特権を持っています。 [s]に注意。

$ chmod 1777 adir
$ ls -l
drwxrwxrwt    1 mob      wp    2018 Aug 30 23:45 adir
$ chmod 4111 backup
$ ls -l
---s--x--x    1 root     wp    2018 Aug 30 23:45 backup

図2:フル12ビット・パターンを使った許可

set user ID bitset group ID bit には、 セキュリティ機能が組み込まれています。 システム管理者以外のユーザがファイルの書き込みやファイル名の変更を行うと、 これらのビットがリセットされます。 そのため、さらに他の特権を持つスクリプトを他のユーザが編集することはできません。 rootまたはさらに他の特権を持つユーザがこのスクリプトを所有しており、 set user ID bitがセットされているからです。

許可/振る舞いに相当する上記の3個のビットを文字で表現するには、 それらの値を別の英字で既存の許可文字列に詰め込みます。

所有者実行フラグの正常な状態は、[x]または[-]のどちらかです。 「所有者」が実行許可を持っていて set user ID bit がセットされている場合、 [x]は[s]になります。

図3が示すように、「所有者」は実行許可を持っていませんが set user ID bitがセットされている場合は[-]が[S]になります。

$ chmod 100 backup
$ ls -l
---x------    1 root     wp    2018 Aug 30 23:45 backup
$ chmod 4100 backup
$ ls -l
---s------    1 root     wp    2018 Aug 30 23:45 backup
$ chmod 4000 backup
$ ls -l
---S------    1 root     wp    2018 Aug 30 23:45 backup

図3:ファイル所有者にとっての[s]と[S]の違い

グループ実行フラグの正常な状態は[x]か[-]のどちらかです。 「グループ」が実行許可を持っていて set group ID bit がセットされている場合、 [x]は[s]になります。

図4が示すように、「グループ」は実行許可を持っていませんが set group ID bit がセットされている場合は[-]が[S]になります。

$ chmod 010 backup
$ ls -l
------x---    1 root     wp    2018 Aug 30 23:45 backup
$ chmod 2010 backup
$ ls -l
------s---    1 root     wp    2018 Aug 30 23:45 backup

$ chmod 2000 backup
$ ls -l

------S---    1 root     wp    2018 Aug 30 23:45 backup

図4:ファイル所有者のグループにとっての[s]と[S]の違い

ディレクトリに関する「その他」の実行フラグの正常な状態は、 ディレクトリの検索が可能なことを示す[x]か、 検索が不可能であることを示す[-]のどちらかです。 「その他」が検索許可を持っていてスティッキー・ビットがセットされている場合、 [x]は[t]になります。 「その他」は検索許可を持っていないがスティッキー・ビットがセットされている場合は、[-]が[T]になります。

$ chmod 001 adir
$ ls -l
d--------x    1 root     wp    2018 Aug 30 23:45 adir

$ chmod 1001 adir
$ ls -l
d--------t    1 root     wp    2018 Aug 30 23:45 adir

$ chmod 1000 adir
$ ls -l
d--------T    1 root     wp    2018 Aug 30 23:45 adir

図5:[t]と[T]の違い

ファイルとディレクトリのモード設定と、3個の追加セキュリティ許可の設定を使えば、 実行可能プログラムのアクセス・レベルの制御とディレクトリ内のファイルの削除やファイル名変更から保護できます。