10.2 ファイル、ディレクトリのモード
Linux Essentials Online Text | 2021/07/28

ファイルやディレクトリには「所有するユーザ」、「所有グループに所属するユーザ」、「その他のユーザ」の3つのレベルでアクセス権限を設定することができます。アクセス権限とは「読み取り」、「書き込み」、「実行」の3つの権限を指します。利用者がそのファイルやディレクトリにアクセスした時、このアクセス権限にマッチしないと操作することができません。

ファイルのモードを確認する

対象のファイルが、どのような権限を持っているかは、lsコマンドに「-l」オプションを付けて表示される1つ目のカラムで確認することができます。

まとめると、以下のようになります。

 説明
1文字目ファイルの形式を表します。
-:ファイル
d:ディレクトリ
l:シンボリックリンク
2~4文字目所有ユーザの読み書き実行(rwx)
5~7文字目所有グループで所有者を除くユーザの読み書き実行(rwx)
8~10文字目所有グループ以外のユーザの読み書き実行(rwx)

2文字目以降は、「r:読み込み(Read)」、「w:書き込み(Write)」、「x:実行(eXecute)またはディレクトリへの移動」の3種類の所有者権限のアクセス権限を表します。つまり、「r」がついていれば読み込みが可能、「w」がついていれば書き込みが可能、「x」がついていれば対象ファイルの実行が可能になります。

試しに、testファイルのアクセス権を見てみましょう。

# ls -l /home/lpic-user2/test
-rw-r--r--. 1 lpic-user2 LPI 11  7月 28 03:20 /home/lpic-user2/test

上記の例では、
・「test」という名前のファイルである。
・「root」というユーザは「読み込み」「書き込み」が可能。
・「LPI」というグループが「読み込み」のみ可能。
・「その他のユーザ」は「読み込み」のみ可能。
という意味になります。

ファイルのモード変更(chmod)

ファイルのモードを変更するにはchmodコマンドを使います。

書式:

chmod モード[,モード]… 変更対象
chmod 8進数表記のモード 変更対象

主なオプション:

-Rディレクトリを対象にします。ディレクトリの中のディレクトリやファイルを再帰的にたどって変更します

このコマンドを用いて、ファイルのモードを所有ユーザと所有グループとそれ以外のユーザについて設定を行うのですが、モード指定の書き方で次の2通りの記述方法があります。

● モードの書式を複数書いてカンマで区切って並べます
● 8進数3桁で各ユーザのレベルを列挙します

モードの書式を用いた設定方法

モードには、「u(所有ユーザ)」「g(所有グループ)」「o(その他のユーザ)」に対して「r(読み込み)」「w(書き込み)」「x(実行またはディレクトリの変更)」があり、これらを設定したり(=)加えたり(+)取り消したり(-)します。「u」「g」「o」の全てに同じ権限を指定するときは「a」を指定します。

例えば、「-rw-r–r–」を「rw-rw-r–」としたい場合は、「g(所有グループ)」に「w(書き込み)」権限を加えるということなので「g+w」というモードになります。また、「-rw-rw-r–」を「–w-rw-rwx」としたい場合は、「u(所有ユーザ)」の「r(読み込み)」権限を取り除き、「o(その他のユーザ)」に「w(書き込み)」権限と「x(実行またはディレクトリの変更)」を加えるということなので、「u-r,o+wx」というモードになります。

<実習: ファイルのアクセス権を変更>

# touch chownfile	
# ls -l chownfile
-rw-r--r--. 1 root root 0  6月  5 06:51 chownfile
# chmod a+x chownfile
# ls -l chownfile
-rwxr-xr-x. 1 root root 0  6月  5 06:51 chownfile
# chmod g+w chownfile
# ls -l chownfile
-rwxrwxr-x. 1 root root 0  6月  5 06:51 chownfile
# chmod u-x,g-wx,o-x chownfile
# ls -l chownfile
-rw-r--r--. 1 root root 0  6月  5 06:51 chownfile

1行目:演習用ファイル「chownfile」を作成します。
2行目:現在のパーミッションを確認します
4行目:すべてのユーザに実行権を付与します。
7行目:所有グループに書き込み権を付与します。
10行目:元に戻します。

8進数を用いた設定方法

モードは8進数の数字3桁で表すことができます。「r」「w」「x」にはそれぞれ数字が割り当てられていて、「r=4」、「w=2」、「x=1」となっています。

この3つの数字を組み合わせることでモードを指定します。例えば、「r–」なら「4」、「rw-」と設定したい場合は「r(4)+w(2)」なので「6」、「rwx」ならば「r(4)+w(2)+x(1)」なので「7」ということになります。このように算出された数字を「所有ユーザ」「所有グループ」「その他のユーザ」の順番で並べたものが、8進数を用いたモードです。つまり「-rw-rw-r–」であれば「664」、「-rwxrwxrwx」であれば、777を指定することになります。

<実習: ファイルのアクセス権を8進数で変更>

# ls -l chownfile
-rw-r--r--. 1 root root 0  6月  5 06:51 chownfile
# chmod 755 chownfile
# ls -l chownfile
-rwxr-xr-x. 1 root root 0  6月  5 06:51 chownfile
# chmod 644 chownfile		# 
# ls -l chownfile
-rw-r--r--. 1 root root 0  6月  5 06:51 chownfile

1行目:現在のパーミッションを確認します。
3行目:ファイルモードを「rwxr-xr-x」に変更します。
6行目:ファイルモードを「rw-r–r–」に変更します。

特殊なアクセス権限

Linuxには/tmpというディレクトリがあります。
/tmpは、一時的(temporary)なファイルを置くディレクトリです。プログラムが動作する際に一時的に利用するファイルを保存する際に使用します。
このディレクトリの利用者はシステムに登録されたユーザ全てです。全てのユーザがこのディレクトリに一時ファイルを格納したり削除したりするため、その他のユーザに対して「r(読み取り)」と「w(書き込み)」権限が付与されます。

しかし、これには1つ問題点があります。

それは、「ユーザが自分以外のファイルを削除できてしまう」という問題です。処理上、残しておく必要があるために一時的に保存しているファイルですから、これが第三者によって勝手に削除されては大変です。そのため、/tmpのようなディレクトリには、作成したファイルやディレクトリが他のユーザ(プロセス)から削除されることが無いように、「sticky(スティッキー)ビット」という特殊な権限が設定されています。

sticky(スティッキー)ビットは、ディレクトリに設定される特殊なアクセス権です。sticky(スティッキー)ビットが設定されたディレクトリでは、すべてのユーザがファイル・ディレクトリを書き込めますが、削除は所有者(rootは除く)しか削除できません。

<実習: stickyの設定と確認>

# mkdir test_tmp
# ls -ld test_tmp
drwxr-xr-x 2 root root 6  6月 19 05:54 test_tmp/
# chmod o+t test_tmp
# ls -ld test_tmp
drwxr-xr-x 2 root root 6  6月 19 05:54 test_tmp/
# chmod o-t test_tmp
# ls -ld test_tmp
drwxr-xr-x 2 root root 6  6月 19 05:54 test_tmp/
# chmod 1755 test_tmp
# ls -ld test_tmp
drwxr-xr-x 2 root root 6  6月 19 05:54 test_tmp/

sticky(スティッキー)ビットの設定方法は2種類です。

その他ユーザ(o)にsticky(スティッキー)ビット「t」を付与するのが最も簡単です。また、8進数モードで設定することも可能です。ただし、3桁では表現しきれないため、1000の位を使い、4桁で表現します。
sticky(スティッキー)ビットは1000ですので、現在のパーミッションが「755」であるなら「1755」と設定します。

なお、特殊なアクセス権限として、sticky(スティッキー)ビットのほかに、SUID(Set User ID)とSGID(Set Group ID)があります。

通常、プログラムを実行すると実行者は実行したユーザになりますが、SUIDが付いたプログラムは実行すると所有者が実行した事と同意となる権限です。例えば、rootユーザ所有のプログラムであれば、一般ユーザで実行したとしても、rootユーザが実行した場合と同じ動作をします。SGIDは実行者を所有グループにする権限です。

このアクセス権のモードは「s」です。SUIDは所有者に、SGIDは所有グループに「s」を付与します。また、8進数モードの場合も存在し、SUIDは4000、SGIDは2000です。

SUIDとSGIDは試験範囲に含まれていませんので、試験学習としては不要ですが、そのような機能があるという点は頭の片隅に入れておいてください。通常はSUID、SGID、sticky(スティッキー)ビットの3つをセットで覚えます。

PAGE TOP