104.5 レッスン 1
Certificate: |
LPIC-1 |
---|---|
Version: |
5.0 |
Topic: |
104 デバイス、Linuxファイルシステム、ファイルシステム階層標準 |
Objective: |
104.5 ファイルのアクセス許可と所有権を管理する |
Lesson: |
1 of 1 |
はじめに
Linuxはマルチユーザーシステムですから、ファイルの所有者とアクセス権限を管理する仕組みが必要です。共同作業ができるように一部のファイルについては複数のユーザーがアクセスできるようにしつつ、別のファイルについては機密扱いにしてユーザーのプライバシーを確保する仕組みです。
Linuxでは、3種類のパーミッションシステムでその仕組みを実現しています。各ファイルには所有者と所有グループがあり、所有者・所有グループ・その他の3種類のパーミッションがあります。このレッスンでは、ファイルのパーミッションを確認し、その意味を把握し、パーミッションの設定や変更を行います。
ファイルとディレクトリの情報を確認する
ls
コマンドはディレクトリの内容を一覧表示します。オプションをつけずに ls
を実行すると、ファイル名を表示します(訳注:Linuxではディレクトリなども一種のファイルとして扱いますので、このレッスンではディレクトリなども含めて「ファイル」と表記することがあります)。
$ ls Another_Directory picture.jpg text.txt
各ファイルには、タイプ、サイズ、所有者・所有グループなど、もっと多くの情報があります。ls
に -l
(long form)オプションをつけて実行すると、それらの情報を確認できます。
$ ls -l total 536 drwxrwxr-x 2 carol carol 4096 Dec 10 15:57 Another_Directory -rw------- 1 carol carol 539663 Dec 10 10:43 picture.jpg -rw-rw-r-- 1 carol carol 1881 Dec 10 15:57 text.txt
このレッスンに関連するものを中心に、出力の各列の意味を説明します。
-
1列目 はファイルタイプとパーミッションです。
drwxrwxr-x
を例にとって説明します。-
最初の文字の
d
は、ファイルタイプを示しています。 -
次の3文字の
rwx
は、ファイルの所有者(u
)のパーミッションを示しています。 -
次の3文字の
rwx
は、ファイルの所有グループ(g
)のパーミッションを示しています。 -
最後の3文字の
r-x
は、その他(o
)のパーミッションを示しています。
-
Tip
|
その他のパーミッションはワールドパーミッションと呼ばれることもあります。 |
-
3列目 と 4列目 は、所有者と所有グループです。
-
最後の 7列目 はファイル名です。
2列目 はそのファイルを指すハードリンクの数です。5列目 はファイルサイズです。 6列目 は最終更新日時です。これらはこのレッスンの内容とは直接関係しません。
ディレクトリ
ls -l
の引数にディレクトリを指定すると、そのディレクトリの内容を表示します。
$ ls -l Another_Directory/ total 0 -rw-r--r-- 1 carol carol 0 Dec 10 17:59 another_file.txt
ls
に -d
オプションを指定すると、そのディレクトリ自体の情報を表示します。
$ ls -l -d Another_Directory/ drwxrwxr-x 2 carol carol 4096 Dec 10 17:59 Another_Directory/
隠しファイル
先ほど ls -l
を実行して取得したディレクトリの内容一覧は不完全でした。
$ ls -l total 544 drwxrwxr-x 2 carol carol 4096 Dec 10 17:59 Another_Directory -rw------- 1 carol carol 539663 Dec 10 10:43 picture.jpg -rw-rw-r-- 1 carol carol 1881 Dec 10 15:57 text.txt
このディレクトリにはあと3つのファイルがあるのですが、それらは隠されています。Linuxでは、.
(ドット)で始まる名前のファイルは自動的に隠されます。ls
に -a
オプションを指定して実行すると、隠しファイルを表示します。
$ ls -l -a total 544 drwxrwxr-x 3 carol carol 4096 Dec 10 16:01 . drwxrwxr-x 4 carol carol 4096 Dec 10 15:56 .. drwxrwxr-x 2 carol carol 4096 Dec 10 17:59 Another_Directory -rw------- 1 carol carol 539663 Dec 10 10:43 picture.jpg -rw-rw-r-- 1 carol carol 1881 Dec 10 15:57 text.txt -rw-r--r-- 1 carol carol 0 Dec 10 16:01 .thisIsHidden
.thisIsHidden
ファイルは .
で名前が始まっているので隠しファイルです。
.
と ..
は特別なファイルです。.
はカレントディレクトリを、..
は親ディレクトリを指します。Linuxでは、どのディレクトリにも .
と ..
があります。
Tip
|
他のコマンドと同様に、 |
ファイルタイプを理解する
先ほど説明したように、ls -l
の出力の最初の文字はファイルタイプを示しています。一般的なファイルタイプは以下の3種類です。
-
(通常ファイル)-
どのようなデータも保持でき、変更、移動、コピー、削除できます。
d
(ディレクトリ)-
他のファイルやディレクトリをまとめて整理できます。技術的には、ディレクトリは特別なファイルの一種です。
l
(シンボリックリンク)-
あるファイルに対する別の名前を示す、エイリアスです。
これらの3種類のファイルタイプに加えて、さらに3種類の特殊なファイルタイプがあります。このレッスンでは詳しく説明しませんが、こうしたファイルタイプがあるのだということは知っておいたほうがよいです。
b
(ブロックデバイス)-
1台目のハードディスク
/dev/sda
などのように、ブロック単位でデータをやり取りする物理デバイスや仮想デバイスを表します。技術的にはカーネル内のデバイスドライバとのインターフェイスです。 c
(キャラクタデバイス)-
メインのターミナル
/dev/ttyS0
などのように、文字単位でデータをやり取りする物理デバイスや仮想デバイスを表します。技術的にはカーネル内のデバイスドライバとのインターフェイスです。 s
(ソケット)-
2つのプログラムの間でデータをやりとりするための通信路を表します。
Warning
|
自分が何をやろうとしているのかを正確に理解していない限り、ブロックデバイス、キャラクタデバイス、ソケットのパーミッションを変更しないでください。システムが動かなくなる恐れがあります。 |
パーミッションを理解する
ls -l
の出力では、ファイルタイプの直後に、r
、w
、x
という順番の3文字でパーミッションが示されます。ここではその意味を説明します。-
はパーミッションがないことを示します。
ファイルのパーミッション
r
-
読み取り可能(read) を表します。8進数の
4
です(詳しくは後述)。ファイルを開いてその内容を読み取れることを示すパーミッションです。 w
-
書き込み可能(write) を表します。8進数の
2
です。ファイルを編集し削除できることを示すパーミッションです。 x
-
実行可能(execute) を表します。8進数の
1
です。プログラムやスクリプトとして実行できることを示すパーミッションです。
例えば、rw-
というパーミッションのファイルは、読み書きができてますが、実行することはできません。
ディレクトリのパーミッション
r
-
読み取り可能(read) を表します。8進数の
4
です。内部に存在するファイルの名前など、ディレクトリの内容を読み取れることを示すパーミッションです。そのディレクトリ内のファイルを読み取れることを示すパーミッションではありません。 w
-
書き込み可能(write) を表します。8進数の
2
です。そのディレクトリ内にファイルを作成したり削除したりできることを示すパーミッションです。書き込み可能(write) のパーミッションだけではそのディレクトリ内にファイルを作成したり削除したりすることはできません。ファイルを作成したり削除したりしてそのディレクトリに変更を加えるには検索可能(
x
)のパーミッションも必要になります。 x
-
ファイルでは 実行可能(execute) を表しますが、ディレクトリでは 検索可能(search) を表します。8進数の
1
です。そのディレクトリの中に入れることを示すパーミッションです。そのディレクトリ内のファイル名を一覧表示するためには読み取り可能(r
)のパーミッションが必要になります。
ディレクトリの 検索可能(x
)は少しわかりづらいです。例えば、以下のパーミッションである Another_Directory
という名前のディレクトリがあるとします。
$ ls -ld Another_Directory/ d--x--x--x 2 carol carol 4,0K Dec 20 18:46 Another_Directory
そして、そのディレクトリ内に、以下のパーミッションである hello.sh
という名前のシェルスクリプトがあるとします。
-rwxr-xr-x 1 carol carol 33 Dec 20 18:46 hello.sh
ユーザー carol
が Another_Directory
の内容を一覧表示しようとするとエラーになります。そのディレクトリの読み取り可能(r
)パーミッションがないからです。
$ ls -l Another_Directory/ ls: cannot open directory 'Another_Directory/': Permission denied
しかし、ユーザー carol
には、Another_Directory
ディレクトリの検索可能(x
)パーミッションがあるので、そのディレクトリに入ることはできます。よって、ユーザー carol
は、ディレクトリ内のファイルに対するパーミッションがあれば、そのファイルにアクセスできます。ユーザー carol
にはスクリプト hello.sh
に対する完全なパーミッション(rwx
)があるので、このスクリプトを実行できます。Another_Directory
ディレクトリの内容を読み取ることはできないのですが、ファイル名を知っていればそのディレクトリ内のファイルを実行できるのです。(訳注:ディレクトリの中に入ってファイルに「アクセスできる」パーミッションだと考えてください)。
$ sh Another_Directory/hello.sh Hello LPI World!
先にも述べたように、パーミッションには、所有者・所有グループ・その他という順序があります。この順序でパーミッションがチェックされます。
ファイルを操作しようとしているユーザーが所有者であれば、所有者のパーミッションが適用されます。所有者でなく所有グループに属していれば、所有グループのパーミッションが適用されます。所有者にも所有グループにも該当しなければ、その他のパーミッションが適用されます。
そのユーザーがファイルの所有者であれば、所有者のパーミッションだけが適用されます。所有グループやその他のパーミッションのほうが緩かった(できることが多かった)としても、所有者のパーミッションが適用されるのです。
パーミッションを変更する
chmod
コマンドでパーミッションを変更できます。第一引数には変更後のパーミッションを、第二引数には変更対象のファイルないしディレクトリを指定します。パーミッションを変更できるのは、所有者とシステム管理者(root)だけです。
変更後のパーミッションの記述には、2種類の表記方法(モード)があります。
1つ目は 記号表記 で、所有者・所有グループ・その他のそれぞれについて、個別にパーミッションを付与したり剥奪したりできます。2つ目は 数値表記 で、所有者・所有グループ・その他のパーミッションをまとめて設定します。
どちらの表記でも同じ結果になります。例えば、
$ chmod ug+rw-x,o-rwx text.txt
と
$ chmod 660 text.txt
は、どちらのコマンドを実行しても以下の同じ結果になります。
-rw-rw---- 1 carol carol 765 Dec 20 21:25 text.txt
それぞれの表記について詳しく見ていきましょう。
記号表記
記号表記 の最初の文字は、誰のパーミッションを変更するかを表します。所有者は u
、所有グループは g
、その他は o
、全員は a
です。
次の記号は動作を表します。付与は +
、剥奪は -
、設定(セット)は =
です。
最後の記号はパーミッションを表します。読み取り可能は r
、書き込み可能は w
、実行(検索)可能は x
です。
例えば、以下のパーミッションの text.txt
というファイルがあるとします。
$ ls -l text.txt -rw-r--r-- 1 carol carol 765 Dec 20 21:25 text.txt
所有グループに属するメンバーに書き込み可能のパーミッションを与えるなら、第一引数は g+w
になります。グループ(group)の g
、付与の +
、書き込み可能(write)の w
と考えます。実行するコマンドは次のとおりです。
$ chmod g+w text.txt
ls
を実行して結果を確認してみましょう。
$ ls -l text.txt -rw-rw-r-- 1 carol carol 765 Dec 20 21:25 text.txt
次に、所有者の読み取り可能パーミッションを剥奪してみます。ユーザー(user)の u
、剥奪の -
、読み取り可能(read)の r
と考えます。第一引数は u-r
になるので、実行するコマンドは次のとおりです。
$ chmod u-r text.txt $ ls -l text.txt --w-rw-r-- 1 carol carol 765 Dec 20 21:25 text.txt
全員のパーミッションを rw-
に設定してみましょう。全員(all)の a
、設定の =
、読み取り可能(r
)、書き込み可能(w
)、実行不可(-
)で、実行するコマンドは次のとおりです。
$ chmod a=rw- text.txt $ ls -l text.txt -rw-rw-rw- 1 carol carol 765 Dec 20 21:25 text.txt
,
(カンマ)で区切ることにより、複数のパーミッションを一度に変更することもできます。
$ chmod u+rwx,g-x text.txt $ ls -lh text.txt -rwxrw-rw- 1 carol carol 765 Dec 20 21:25 text.txt
上の例は、所有者に読み書き実行のパーミッションを与えて(u+rwx
)、所有グループから実行のパーミッションを剥奪する(g-x
)と読みます。
chmod
コマンドの第二引数にディレクトリを指定すると、そのディレクトリのパーミッションを変更します。そのディレクトリ以下のすべてのファイルとサブディレクトリのパーミッションを変更したければ、再帰オプションを指定して chmod
を実行します。再帰オプションは -R
で、第一引数の前に指定します。
$ chmod -R u+rwx Another_Directory/
このコマンドは、再帰的に(-R
)、所有者に読み書き実行のパーミッションを与える(u+rwx
)と読みます。
Warning
|
|
数値表記
数値表記 では、3桁の8進数でパーミッションを指定します。(訳注:読み書き実行のパーミッションの有無の組み合わせは全部で8通りなので、8進数で過不足なく表せます。)
各パーミッションには値が割り当てられています。読み取り可能(r
)は4、書き込み可能(w
)は2、実行(検索)可能(x
)は1です。どのパーミッションもなければ0です。rwx
は 7
(4+2+1
)ですし、r-x
は 5
(4+0+1
)です。(訳注:rwx
は2進数の 111
で8進数の 7
、r-x
は2進数の 101
で8進数の 5
と、2進数から考えることもできます。)
3桁の数字の最初の桁は所有者(u
)、2桁目は所有グループ(g
)、最後の桁はその他(o
)のパーミッションを表します。rw-rw----
というパーミッションに設定するなら、その数値表記は 660
です。
$ chmod 660 text.txt $ ls -l text.txt -rw-rw---- 1 carol carol 765 Dec 20 21:25 text.txt
記号表記 と同様に、数値表記 での第一引数は変更後のパーミッションで、第二引数はパーミッションを変更するファイルないしディレクトリです。
Tip
|
パーミッションの数値が 奇数 なら実行可能です。 |
パーミッションを特定の状態に設定したいときには 数値表記 が便利です。例えば rw-r-----
に設定するなら 640
です。
現在のパーミッションに関わらず何らかの変更をしたいときには 記号表記 が便利です。例えば、所有グループとその他の現在のパーミッションは変更せず、所有者にのみ実行可能パーミッションを与えるなら、chmod u+x script.sh
を実行します。
ファイルの所有者と所有グループを変更する
ファイルないしディレクトリの所有者と所有グループを変更するコマンドは chown
です。次のように記述して実行します。
chown USERNAME:GROUPNAME FILENAME
text.txt
ファイルで試してみます。
$ ls -l text.txt -rw-rw---- 1 carol carol 1881 Dec 10 15:57 text.txt
所有者は carol
で、所有グループも carol
です。所有グループを students
に変更します。
$ chown carol:students text.txt $ ls -l text.txt -rw-rw---- 1 carol students 1881 Dec 10 15:57 text.txt
ファイルの所有者が所有グループに属していなくても何ら問題はありません。上の例では、ユーザー carol
がグループ students
に属していなくても大丈夫です。
所有者または所有グループを変更しない場合は、その部分の記述を省略できます。先ほどの例のように、所有者を変更せず所有グループを students
に変更するなら、chown :students text.txt
のように省略しても構いません。所有グループを変更せず所有者を carol
に変更するなら、chown carol: text.txt
や chown carol text.txt
のように省略できます。所有グループを変更する専用のコマンド chgrp
で、chgrp students text.txt
のように実行することもできます。
ファイルの所有者や所有グループを変更できるのは、その所有者や所有グループのメンバーとシステム管理者(root)だけです。それ以外のユーザーが所有者や所有グループを変更しようとすると、Operation not permitted(許可がありません)
というエラーメッセージが表示されます。
グループを確認する
ファイルの所有者と所有グループを変更する前に、システムにどのようなグループが存在していて、それぞれのグループにどのユーザーが属しているか、あるいは、あるユーザーがどのグループに属しているかを把握しておきたいことがあります。
システムに存在するグループは、getent group
を実行して確認できます。出力は以下のようになります(出力の最初の部分だけを載せています)。
$ getent group root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4:syslog,rigues tty:x:5:rigues disk:x:6: lp:x:7: mail:x:8: news:x:9: uucp:x:10:rigues
あるユーザーがどのグループに属しているかを知りたければ、groups
コマンドの引数にユーザー名を指定して実行します。
$ groups carol carol : carol students cdrom sudo dip plugdev lpadmin sambashare
あるグループに属しているユーザーを知りたければ、groupmems
コマンドに -g
オプションとグループ名を指定し、-l
オプションをつけて実行します。
# groupmems -g cdrom -l carol
Tip
|
|
デフォルトのパーミッション
ディレクトリやファイルを作成したときのデフォルトのパーミッションがどうなっているかを、実験で確かめてみましょう。ターミナルで次のコマンドを実行して空のファイルを作成します。
$ touch testfile
このファイルのパーミッションを確認してみます。システムによって異なりますが、筆者の環境では次のようなパーミッションでした。
$ ls -lh testfile -rw-r--r-- 1 carol carol 0 jul 13 21:55 testfile
rw-r--r--
です。所有者は 読み書き可能 で、所有グループとその他は 読み取り可能 です。数値表記では 644
です。
次にディレクトリを作成します。
$ mkdir testdir $ ls -lhd testdir drwxr-xr-x 2 carol carol 4,0K jul 13 22:01 testdir
このディレクトリのパーミッションは rwxr-xr-x
です。所有者は 読み書き実行(検索)が可能 で、所有グループとその他は 読み取りと実行(検索)が可能 です。数値表記では 755
です。
ファイルシステムのどこでファイルやディレクトリを作成しても、同じパーミッションになります。このパーミッションはどこから来ているのでしょうか。
umask
(user mask)というパラメーターから来ています(訳注:環境変数と同様に親プロセスから引き継がれる「環境」の一部です)。これがデフォルトのパーミッションを決めています。umask
コマンドを実行すると、その値を確認できます。
$ umask 0022
この 0022
という値は、rw-r--r--
はおろか、644
とも異なります。-S
オプションを指定して umask
コマンドを実行すると、出力が記号表記になります。
$ umask -S u=rwx,g=rx,o=rx
これはディレクトリのデフォルトのパーミッションと一致します。しかしファイルのデフォルトのパーミッションとは食い違っています。
デフォルトでファイルの実行可能パーミッションを与えるのは危険です。ディレクトリには実行(検索)可能パーミッションが必要ですが(そうでなければそのディレクトリの中に入れません)、ファイルに実行可能パーミッションは不要です。だから、ファイルにはデフォルトで実行可能パーミッションがなく、rw-r--r--
になるのです。
umask
コマンドは、デフォルトのパーミッションを表示するだけでなく、現在のシェルセッションでのデフォルトのパーミッションを変更することもできます。例えば、次のように実行します。
$ umask u=rwx,g=rwx,o=
これ以降、ディレクトリを作成した場合のパーミッションは rwxrwx---
になり、ファイルを作成した場合のパーミッションは rw-rw----
になります。testfile
と testdir
を作成する実験をもう一度繰り返してパーミッションを確認してみます。
$ ls -lhd test* drwxrwx--- 2 carol carol 4,0K jul 13 22:25 testdir -rw-rw---- 1 carol carol 0 jul 13 22:25 testfile
-S
オプションなしで umask
を実行すると、以下の結果になります。
$ umask 0007
-S
オプションなしで umask
を実行したときに出力される数値は、マスク値であり、パーミッション自体の数値表記とは異なります。以下に対応表を載せておきます。(訳注:マスク値はその名前の通り、パーミッションを 与えない ビットを示すものですから、2進数で表してビットを反転させるとデフォルトのディレクトリのパーミッションがわかります。例えば、マスク値が2なら 010
を反転させた 101
、つまり r-x
がデフォルトのディレクトリのパーミッションだとわかります。)
値 | ファイルのパーミッション | ディレクトリのパーミッション |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
007
は rwxrwx---
に対応し、先ほど設定したデフォルトのパーミッションと一致しています。4つの数字のうちの最初の数字はとりあえず無視してください(後で説明します)。
特別なパーミッション
所有者・所有グループ・その他について、読み取り可能(r
)、書き込み可能(w
)、実行(検索)可能(x
)に加えて、3つの 特別なパーミッション があります。以下で1つずつ説明します。
スティッキービット
スティッキービットは、削除制限フラグ であり、数値表記では4桁の8進数の最初の桁の 1
、記号表記ではその他パーミッションの3文字目の t
です。これは、ディレクトリに対してだけ意味を持ち、ファイルに設定しても意味がありません。スティッキービットが設定されたディレクトリ内のファイルは、そのファイルの所有者かそのスティッキービットが設定されたディレクトリの所有者しか削除できません。(訳注:mv
コマンドによる移動や名前の変更は、実質的に削除と等しいので、これもできません。また、rootユーザーは削除できます。)
スティッキービットが設定されたディレクトリは、ls -l
の出力で、その他パーミッションの x
が表示される場所に t
が表示されます。(訳注:/tmp
や /var/tmp
など、さまざまなプログラムが一時ファイルを置くディレクトリに設定されています。)
$ ls -ld Sample_Directory/ drwxr-xr-t 2 carol carol 4096 Dec 20 18:46 Sample_Directory/
数値表記では、特別なパーミッションが4桁の8進数の数字の最初の桁で示されます。例えば、パーミッションが 755
である Another_Directory
にスティッキービット(数値は 1
)を設定するなら、次のコマンドを実行します。
$ chmod 1755 Another_Directory $ ls -ld Another_Directory drwxr-xr-t 2 carol carol 4096 Dec 20 18:46 Another_Directory
SGID
SGID(Set Group ID)は、数値表記では4桁の8進数の最初の桁の 2
、記号表記では所有グループパーミッションの3文字目の s
です。実行可能なファイルないしディレクトリに設定します。ファイルに設定すると、そのファイルを実行したときにその所有グループの権限で実行されます。ディレクトリに設定すると、そのディレクトリ内で作成したファイルやディレクトリの所有グループが、SGIDを設定したディレクトリの所有グループと同じになります。
SGIDが設定されたファイルやディレクトリは、ls -l
の出力で、所有グループパーミッションの x
が表示される場所に s
が表示されます。
$ ls -l test.sh -rwxr-sr-x 1 carol root 33 Dec 11 10:36 test.sh
記号表記でSGIDを設定するなら、次のコマンドを実行します。
$ chmod g+s test.sh $ ls -l test.sh -rwxr-sr-x 1 carol root 33 Dec 11 10:36 test.sh
以下の例を通じて、ディレクトリにSGIDを設定したときの挙動を確かめます。所有者は carol
、所有グループは users
の、Sample_Directory
というディレクトリがあるとします。パーミッションは次のとおりです。
$ ls -ldh Sample_Directory/ drwxr-xr-x 2 carol users 4,0K Jan 18 17:06 Sample_Directory/
このディレクトリ内で touch
コマンドを実行して新しい空のファイルを作成します。
$ cd Sample_Directory/ $ touch newfile $ ls -lh newfile -rw-r--r-- 1 carol carol 0 Jan 18 17:11 newfile
新しく作成されたファイルの所有者は carol
で所有グループも carol
です。もしこのディレクトリにSGIDが設定されていたら、結果は異なります。Sample_Directory
にSGIDを設定します。
$ sudo chmod g+s Sample_Directory/ $ ls -ldh Sample_Directory/ drwxr-sr-x 2 carol users 4,0K Jan 18 17:17 Sample_Directory/
所有グループパーミッションの3文字目に s
と表示されていることから、SGIDが設定されているとわかります。もう一度 touch
コマンドで新しい空のファイルを作成します。
$ cd Sample_Directory/ $ touch emptyfile $ ls -lh emptyfile -rw-r--r-- 1 carol users 0 Jan 18 17:20 emptyfile
新しく作成されたファイルの所有グループが users
になっています。これがSGIDの働きです。SGIDを設定した親ディレクトリの所有グループを受け継ぐようになります。(訳注:グループでファイル共有に使用するディレクトリを作成する場合などによく使われます。)
SUID
SUID(Set User ID)は、数値表記では4桁の8進数の最初の桁の 4
、記号表記では所有者パーミッションの3文字目の s
です。これは、ファイルに対してだけ意味を持ち、ディレクトリに設定しても意味がありません。SGIDと似て、そのファイルの所有者の権限で実行するようになります。ls -l
の出力で、所有者パーミッションの x
が表示される場所に s
が表示されます。(訳注:/usr/bin/passwd
コマンドなど、rootしか書き込めない設定ファイルを変更するコマンドなどに設定されます。セキュリティの抜け道になりやすいので、利用には十分な注意が必要です。)
$ ls -ld test.sh -rwsr-xr-x 1 carol carol 33 Dec 11 10:36 test.sh
特別なパーミッションを複数同時に設定することもできます。パーミッションが 755
の test.sh
に、SGID(数値は 2
)とSUID(数値は 4
)を数値表記で同時に設定するなら、次のコマンドを実行します。
$ chmod 6755 test.sh
ls -l
の実行結果は次のとおりです。
$ ls -lh test.sh -rwsr-sr-x 1 carol carol 66 Jan 18 17:29 test.sh
Tip
|
ターミナルがカラー表示に対応していれば(最近のターミナルはたいてい対応しています)、 |
演習問題
-
まず、
mkdir emptydir
コマンドでemptydir
という名前のディレクトリを作成します。次に、ls
コマンドでemptydir
ディレクトリのパーミッションを表示してください。 -
まず、
touch emptyfile
コマンドでemptyfile
という名前の空のファイルを作成します。次に、chmod
コマンドを記号表記で1回だけ実行して、emptyfile
の所有者に実行可能のパーミッションを付与し、所有者以外の書き込み可能と実行可能のパーミッションを剥奪してください。 -
umask
の実行結果が027
であるときに、新しく作成したファイルのパーミッションはどうなりますか? -
所有者、所有グループ、パーミッションが次のとおりである
test.sh
という名前のシェルスクリプトがあります。-rwxr-sr-x 1 carol root 33 Dec 11 10:36 test.sh
-
ファイルの所有者のパーミッションはどうなっていますか?
-
chmod
を数値表記で実行して、このファイルに設定されている特別なパーミッションを取り除いてください。
-
-
ls -l
を実行すると、次のように表示されました。$ ls -l /dev/sdb1 brw-rw---- 1 root disk 8, 17 Dec 21 18:51 /dev/sdb1
sdb1
のファイルタイプは何ですか? 誰がこのファイルに書き込みできますか? -
以下の4つのファイル(ディレクトリ)があります。
drwxr-xr-t 2 carol carol 4,0K Dec 20 18:46 Another_Directory ----r--r-- 1 carol carol 0 Dec 11 10:55 foo.bar -rw-rw-r-- 1 carol carol 1,2G Dec 20 18:22 HugeFile.zip drwxr-sr-x 2 carol users 4,0K Jan 18 17:26 Sample_Directory
各ファイル(ディレクトリ)のパーミッションを4桁の数値表記で書いてください。
Another_Directory
foo.bar
HugeFile.zip
Sample_Directory
発展演習
-
まず、
touch emptyfile
コマンドでemptyfile
という名前の空のファイルを作成します。次に、chmod 000 emptyfile
コマンドで、そのファイルのパーミッションをゼロにします。chmod 4 emptyfile
のようにchmod
の数値表記で第一引数に 1桁の数字 を渡すとどうなりますか?chmod 44 emptyfile
のように 2桁の数字 を渡すとどうなりますか? これらの結果から、chmod
が数値をどのように解釈するかを推測してください。 -
Linuxのシステムで一時ファイルを格納する
/tmp
ディレクトリのパーミッションは以下のとおりです。$ ls -ld /tmp drwxrwxrwt 19 root root 16K Dec 21 18:58 tmp
所有者・所有グループ・その他はすべて読み書き実行のパーミッションがあります。一般ユーザーはこのディレクトリ内の どの ファイルでも削除できるのでしょうか? 理由とともに答えてください。
-
test.sh
という名前のファイルのパーミッションは-rwsr-xr-x
で、SUIDが設定されています。以下のコマンドを実行しました。$ chmod u-x test.sh $ ls -l test.sh -rwSr-xr-x 1 carol carol 33 Dec 11 10:36 test.sh
これはどういうことでしょうか? 大文字の
S
は何を表していますか? -
まず、
Box
という名前のディレクトリを作成してください。次に、Box
内に作成されたファイルの所有グループが自動的にusers
になるように設定してください。最後に、Box
内に作成されたファイルは、その所有者しか削除できないように設定してください。
まとめ
このレッスンでは、パーミッションと所有者を管理する以下の方法を説明しました。
-
ls
コマンドでパーミッションと所有者の情報を読み取る方法。 -
chmod
コマンドで誰がファイルを読み書き実行できるかを制御する方法(数値表記 と 記号表記 の2通り)。 -
chown
コマンドでファイルの所有者と所有グループを変更する方法。 -
chgrp
コマンドでファイルの所有グループを変更する方法。 -
umask
コマンドでデフォルトのパーミッションを確認し変更する方法。
このレッスンでは、次のコマンドを説明しました:
ls
-
ファイルを一覧表示します。
-l
オプションを指定するとパーミッションなどの詳細を表示します。 chmod
-
ファイルやディレクトリのパーミッションを変更します。
chown
-
ファイルやディレクトリの所有者と所有グループを変更します。
chgrp
-
ファイルやディレクトリの所有グループを変更します。
umask
-
ファイルやディレクトリのデフォルトのパーミッションを確認、設定します。
演習の解答
-
まず、
mkdir emptydir
コマンドでemptydir
という名前のディレクトリを作成します。次に、ls
コマンドでemptydir
ディレクトリのパーミッションを表示してください。ディレクトリの中身ではなくディレクトリ自体の情報を表示するために、
ls
コマンドに-d
オプションを指定して実行します。つまり、次のコマンドを実行します。ls -l -d emptydir
ls -ld emptydir
のように2つのオプションを一括指定してもよいです。 -
まず、
touch emptyfile
コマンドでemptyfile
という名前の空のファイルを作成します。次に、chmod
コマンドを記号表記で1回だけ実行して、emptyfile
の所有者に実行可能のパーミッションを付与し、所有者以外の書き込み可能と実行可能のパーミッションを剥奪してください。次のように順番に考えていきます。
-
ファイルの所有者に実行可能パーミッションを付与するので、
u+x
です。 -
所有グループとその他の書き込み可能と実行可能のパーミッションを剥奪するので、
go-wx
です。これらをカンマで並べて、次のコマンドを実行します。
chmod u+x,go-wx emptyfile
-
-
umask
の実行結果が027
であるときに、新しく作成したファイルのパーミッションはどうなりますか?rw-r-----
になります。 -
所有者、所有グループ、パーミッションが次のとおりである
test.sh
という名前のシェルスクリプトがあります。-rwxr-sr-x 1 carol root 33 Dec 11 10:36 test.sh
-
ファイルの所有者のパーミッションはどうなっていますか?
所有者のパーミッション(
ls -l
の出力の2文字目から4文字目)はrwx
です。つまり、所有者は、そのファイルの読み書き実行ができます。 -
chmod
を数値表記で実行して、このファイルに設定されている特別なパーミッションを取り除いてください。chmod
の第一引数に最初の数字が0
の4桁の数字を指定すると、特別なパーミッションを取り除けます。このファイルの現在のパーミッションは755
ですから、chmod 0755
を実行します。
-
-
ls -l
を実行すると、次のように表示されました。$ ls -l /dev/sdb1 brw-rw---- 1 root disk 8, 17 Dec 21 18:51 /dev/sdb1
sdb1
のファイルタイプは何ですか? 誰がこのファイルに書き込みできますか?ls -l
の出力の最初の文字がファイルタイプを示しています。b
は ブロックデバイス です。マシンに接続されているディスクはブロックデバイスです。パーミッションを見ると、所有者(root
)と、所有グループ(disk
)に属しているユーザーが、このファイル(デバイス)に書き込みできます。 -
以下の4つのファイル(ディレクトリ)があります。
drwxr-xr-t 2 carol carol 4,0K Dec 20 18:46 Another_Directory ----r--r-- 1 carol carol 0 Dec 11 10:55 foo.bar -rw-rw-r-- 1 carol carol 1,2G Dec 20 18:22 HugeFile.zip drwxr-sr-x 2 carol users 4,0K Jan 18 17:26 Sample_Directory
各ファイル(ディレクトリ)のパーミッションを4桁の数値表記で書いてください。
4桁の数値表記のパーミッションは次のとおりです。
Another_Directory
1755
です。1
はスティッキービットで、755
は通常のパーミッションです(所有者はrwx
、所有グループとその他はr-x
)。foo.bar
0044
です。特別なパーミッションはないので最初の数字は0
です。所有者のパーミッションは何もなく(---
)、所有グループとその他には読み取り可能のパーミッションだけがあります(r--
)。HugeFile.zip
0664
です。特別なパーミッションはないので最初の数字は0
です。所有者と所有グループのパーミッションは読み書き可能で(rw-
)、その他のパーミッションは読み取り可能です(r--
)。Sample_Directory
2755
です。SGIDの2
、所有者は7
(rwx
)、所有グループとその他は5
(r-x
)です。
発展演習の解答
-
まず、
touch emptyfile
コマンドでemptyfile
という名前の空のファイルを作成します。次に、chmod 000 emptyfile
コマンドで、そのファイルのパーミッションをゼロにします。chmod 4 emptyfile
のようにchmod
の数値表記で第一引数に 1桁の数字 を渡すとどうなりますか?chmod 44 emptyfile
のように 2桁の数字 を渡すとどうなりますか? これらの結果から、chmod
が数値をどのように解釈するかを推測してください。emptyfile
のパーミッションをゼロにしているので、初期状態は次のとおりです。---------- 1 carol carol 0 Dec 11 10:55 emptyfile
chmod 4 emptyfile
を実行した結果を確認します。$ chmod 4 emptyfile $ ls -l emptyfile -------r-- 1 carol carol 0 Dec 11 10:55 emptyfile
その他のパーミッションが変更されています。
chmod 44 emptyfile
のように2桁の数字を試してみましょう。$ chmod 44 emptyfile $ ls -l emptyfile ----r--r-- 1 carol carol 0 Dec 11 10:55 emptyfile
所有グループ と その他 のパーミッションが設定されています。このことから、
chmod
の数値表記では、その他 から 所有者 へと、値を後ろから読み取るのだとわかります。1桁の数字を渡すと その他 のパーミッションを変更し、2桁の数字を渡すと 所有グループ と その他 のパーミッションを変更し、3桁の数字を渡すと 所有者 と 所有グループ と その他 のパーミッションを変更し、4桁の数字を渡すと特別なパーミッションと 所有者 と 所有グループ と その他 のパーミッションを変更するということです。(訳注:パーミッションは3桁ないし4桁の8進数で指定するということです。) -
Linuxのシステムで一時ファイルを格納する
/tmp
ディレクトリのパーミッションは以下のとおりです。$ ls -ld /tmp drwxrwxrwt 19 root root 16K Dec 21 18:58 tmp
所有者・所有グループ・その他はすべて読み書き実行のパーミッションがあります。一般ユーザーはこのディレクトリ内の どの ファイルでも削除できるのでしょうか? 理由とともに答えてください。
/tmp
は誰でも書き込みができるディレクトリです。しかし、別のユーザーが作成したファイルを削除できるのは好ましくないので、スティッキービット が設定されています(その他 パーミッションの3文字目のt
がスティッキービットを示しています)。よって、一般ユーザーは、/tmp
内のファイルのうち、自分が作成したファイルしか削除できません。 -
test.sh
という名前のファイルのパーミッションは-rwsr-xr-x
で、SUIDが設定されています。以下のコマンドを実行しました。$ chmod u-x test.sh $ ls -l test.sh -rwSr-xr-x 1 carol carol 33 Dec 11 10:36 test.sh
これはどういうことでしょうか? 大文字の
S
は何を表していますか?ファイルの所有者の実行可能パーミッションを剥奪しました。
s
(やt
)はls -l
の出力のx
の位置に表示されるので、実行可能パーミッションの有無を示す何らかの方法が必要になります。特別なパーミッションを示す文字が小文字か大文字かで実行可能パーミッションの有無を示します。所有者パーミッションの小文字の
s
は、ファイルの所有者に実行可能パーミッションがあり、SUIDが設定されていることを示します。大文字のS
は、ファイルの所有者に実行可能パーミッションがなく(SUIDが設定されていなければ-
と表示される状態です)、SUIDが設定されていることを示します。SGIDでも同様です。所有グループパーミッションの小文字の
s
は、所有グループに実行可能パーミッションがあり、SGIDが設定されていることを示します。大文字のS
は、所有グループに実行可能パーミッションがなく(SGIDが設定されていなければ-
と表示される状態です)、SGIDが設定されていることを示します。スティッキービットでも同様です。その他パーミッションの小文字の
t
は、その他に実行可能パーミッションがあり、スティッキービットが設定されていることを示します。大文字のT
は、その他に実行可能パーミッションがなく、スティッキービットが設定されていることを示します。 -
まず、
Box
という名前のディレクトリを作成してください。次に、Box
内に作成されたファイルの所有グループが自動的にusers
になるように設定してください。最後に、Box
内に作成されたファイルは、その所有者しか削除できないように設定してください。順番に考えます。まず以下のコマンドを実行してディレクトリを作成します。
$ mkdir Box
このディレクトリ内に作成されたファイルの所有グループが自動的に
users
になるようにしたいです。そのためには、このディレクトリの所有グループをusers
にして、SGIDを設定します。所有グループがこのディレクトリ内にファイルを作成できるようにすることも忘れないでください。所有者とその他のパーミッションは関係ないので、記号表記を用います。以下のコマンドを実行します。
$ chown :users Box/ $ chmod g+wxs Box/
このコマンドを実行するユーザーが
users
グループに属していなければ、sudo
をつけてroot権限で上記のコマンドを実行しなければなりません。最後に、ファイルを作成したユーザーだけがそのファイルを削除できるようにします。このディレクトリに
t
で示されるスティッキービットを設定します。スティッキービットはその他(o
)のパーミッションに設定するので、次のコマンドを実行します。$ chmod o+t Box/
Box
ディレクトリのパーミッションは、以下のようになるはずです。drwxrwsr-t 2 carol users 4,0K Jan 18 19:09 Box
次のコマンドのように、一度の
chmod
の実行でSGIDとスティッキービットを設定してもよいです。$ chmod g+wxs,o+t Box/