5.3 レッスン 1
Certificate: |
Linux Essentials |
---|---|
Version: |
1.6 |
Topic: |
5 セキュリティとファイルパーミッション |
Objective: |
5.3 ファイルのパーミッションと所有権の管理 |
Lesson: |
1 of 1 |
はじめに
マルチユーザシステムである Linuxでは、各ファイルを誰が所有しているのか、またユーザがそのファイルに対する操作行うことを許可されているかどうかを追跡する方法が必要です。これは、ファイルを秘密にしておきたいユーザーのプライバシーと共に、複数ユーザーがファイルにアクセスすることによる共同作業を確保するためです。
これは3レベルのアクセス許可システムによって行われます。ディスク上のすべてのファイルはユーザーとグループによって所有され、それぞれ3セットのパーミッション(許可)を持っています。ひとつは所有者で、ひとつはファイルを所有するグループ(所有グループ)、もうひとつはその他の善人です。このレッスンでは、ファイルのパーミッションを調べる方法と、それらを操作する方法を学習します。
ファイルやディレクトリの情報を調べる
ls
コマンドは、あらゆるディレクトリの内容をリスト表示します。この基本的な形式では、ファイル名のみを表示します。
$ ls Another_Directory picture.jpg text.txt
それぞれのファイルにはより多くの情報があります: 種別、サイズ、所有者などです。これらの情報を見るには、ls
に “長い形式” を意味する -l
オプションを指定します:
$ 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
であれば:-
最初の1文字
d
は、ファイルの種別を示します。 -
次の3文字
rwx
は、ファイルの所有者( ユーザー のu
)に対するパーミッションを示します。 -
次の3文字
rwx
は、ファイルの所有 グループ (g
)に対するパーミッションを示します。 -
最後の3文字
r-x
は、他の全員( other のo
)に対するパーミッションを示します。
-
-
2番目 のカラムは、そのファイルを指しているリンクの数を示します。ディレクトリの場合、サブディレクトリの数に自分自身(
.
)と親ディレクトリ(..
)を加えた数になります。 -
3番目 と 4番目 のカラムは、所有者情報、すなわち、所有 ユーザー と所有 グループ を示します。
-
5番目 のカラムは、バイト単位のファイルサイズを示します。
-
6番目 のカラムは、ファイルが変更された正確な日付と時刻、すなわち タイムスタンプ を示します。
-
7番目 のカラムは、ファイル名を示します。
ファイルサイズを “読みやすい” 形式で表示するには ls
に -h
オプションを追加します。1キロバイト未満のサイズはバイト単位で、1キロバイト以上1メガバイト未満のファイルは K
をつけてキロバイト単位で表示されます。メガバイト( M
)とギガバイト( G
)のファイルサイズについても同様です。
$ ls -lh total 1,2G drwxrwxr-x 2 carol carol 4,0K Dec 10 17:59 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 -rw------- 1 carol carol 528K Dec 10 10:43 picture.jpg ---xr-xr-x 1 carol carol 33 Dec 11 10:36 test.sh -rwxr--r-- 1 carol carol 1,9K Dec 20 18:13 text.txt -rw-rw-r-- 1 carol carol 2,6M Dec 11 22:14 Zipped.zip
指定した一連のファイルの情報のみを表示したいときは、ls
にそれらのファイル名を続けます。
$ ls -lh HugeFile.zip test.sh total 1,2G -rw-rw-r-- 1 carol carol 1,2G Dec 20 18:22 HugeFile.zip ---xr-xr-x 1 carol carol 33 Dec 11 10:36 test.sh
ディレクトリとは何か
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では、すべてのディレクトリに少なくともこれら2つの特殊ディレクトリが含まれます。
Tip
|
|
ファイル種別の理解
ls -l
の出力において、各行の先頭文字はファイル種別を示していることを先に述べました。主要なファイル種別が3つあります:
-
(通常ファイル)-
さまざまな種類のデータを収めたファイルです。ファイルはコピーしたり、移動したり、あるいは変更したりできます。
d
(ディレクトリ)-
ディレクトリには、他のディレクトリやファイルを収めていて、ファイルシステムを組み立てる働きをします。技術的に、ディレクトリは特殊なファイルのひとつです。
l
(ソフトリンク)-
この “ファイル” は、ファイルシステムのどこかにある別のファイルやディレクトリへのポインタです。(訳注: Linuxでは シンボリックリンク (Symbolic Link)と呼ぶことが多いが、ソフトリンクの一種です。)
これらに加えて、少なくとも知っておくべき他の3つのファイル種別がありますが、このレッスンの範囲外です。
b
(ブロックデバイス)-
このファイルは物理ないし仮想のデバイスで、普通はディスクやその他の記憶装置を表します。例えば、システムの最初のハードディスクは
/dev/sda
で表されます。 c
(キャラクタデバイス)-
このファイルは、物理ないし仮想のデバイスです。ターミナル(メインのターミナルは
/dev/ttyS0
)やシリアルポートが代表的なキャラクタデバイスの例です。 s
(ソケット)-
ソケットは、2つのプログラム間で情報を受け渡す “コンジット” の働きをします。
Warning
|
何をしているのかを理解していない限り、ブロックデバイスやキャラクタデバイス、ソケットのパーミッションを変更してはいけません。システムが機能しなくなるおそれがあります。 |
パーミッションの理解
ls -l
の出力では、ファイル種別の右側にパーミッションが、r
、w
、x
の順の3文字を3組で表示されます。ダッシュ -
はその位置のパーミッションがないことを示していることに注意しましょう。
ファイルのパーミッション
r
-
読み出し可 と8進数での
4
(後述します)を示しています。これは、ファイルをオープンしてその内容読み出せるパーミッションを意味します。 w
-
書き込み可 と8進数での
2
を示しています。これは、ファイルを編集したり削除できるパーミッションを意味しています。 x
-
実行可 と8進数での
1
を示しています。これは、実行可能ファイルやスクリプトとしてファイルを実行できるパーミッションを意味しています。
例えば、ファイルのパーミッション rw-
は、読み出し・書き込みが可で、実行できないことを示します。
ディレクトリのパーミッション
r
-
読み出し可 と8進数での
4
を示しています。これは、ディレクトリの内容(例えばファイル名)を読み出せるパーミッションを意味していますが、ファイル自体の読み出しが可能であることを 意味していない ことに注意しましょう。 w
-
書き込み可 と8進数での
2
を示しています。これは、ディレクトリ内にファイルを作成すること、削除すること、名前やパーミッションないし所有者を変更できるパーミッションを意味します。ファイルへのパーミッションを持っていない、あるいはファイルの所有者が別人であったとしても、ディレクトリに対する書き込みパーミッションを持っている場合は、ディレクトリ内のすべてのファイルのパーミッションを変更できます。 x
-
実行可 と8進数での
1
を示しています。これは、ディレクトリに入れるパーミッションを意味していますが、ファイルを一覧することは意味しません(それにはr
パーミッションが必要です)。
ディレクトリの最後のビットは分かりにくいかもかもしれません。以下のパーミッションを持つディレクトリ Another_Directory
の例を見てみましょう:
$ ls -ld Another_Directory/ d--xr-xr-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
の内容をリストしようとすると、ディレクトリに対する読み出しパーミッションがないので、以下のエラーが表示されます:
$ ls -l Another_Directory/ ls: cannot open directory 'Another_Directory/': Permission denied
しかし、carol
は実行権限を 持っている ため、ディレクトリに入ることができます。つまり それぞれのファイルに対する パーミッションがあれば、ディレクト内のファイルにアクセスすることができます。この例では、スクリプト hello.sh
に対するすべてのパーミッションを持っていますから、ディレクトリの内容を読み込むことができる・できないにかかわらず、スクリプトを実行 できる ことになります。必要なのは完全なファイル名だけです。
$ sh Another_Directory/hello.sh Hello LPI World!
前述したようにパーミッションは順番に指定します。最初はファイルの所有者、次は所有グループ、そしてその他のユーザーです。ユーザーがファイルにアクションを行うと、同じ順序でパーミッションがチェックされます。まずシステムはユーザーがファイルの所有者であるかをチェックし、所有者であればパーミッションの最初のセットを適用します。次に、システムはユーザーがファイルの所有グループに属しているかをチェックし、メンバーであればパーミッションの2番目のセットを適用します。その他の場合には、システムはパーミッションの3番目のセットを適用します。このため、ユーザーがファイルの所有者である場合は、たとえグループやその他に対するパーミッションの方が寛容であったとしても、所有者のパーミッションのみが有効になります。
パーミッションを変更する
chmod
コマンドでファイルのパーミッションを変更する事ができます。コマンドは少なくとも2つの引数: どのパーミッションを変更するかと、変更したいファイルやディレクトリを取ります。変更するパーミッションは、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
)と、3つすべてを意味する all( 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
パラメータを使います。 “グループ宛に” ( g
)、許可する( +
)、書き込みパーミッション( w
)と考えると簡単です。コマンドは次になります:
$ chmod g+w text.txt
結果を ls
で確認しましょう:
$ ls -l text.txt -rw-rw-r-- 1 carol carol 765 Dec 20 21:25 text.txt
同じファイルの所有者に対する読み出しパーミッションを廃止するには、先と同様に、 “ユーザー宛に” ( u
)、禁止する( -
)、読み出しパーミッションと考えます。パラメータは 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-
をセットするにはどうするのでしょう? “全てに宛てて”( a
)、そのままセット( =
)、読み・書き可能で実行不可( rw-
)と考えて、次のようになります:
$ 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を底とする記数法)で指定します。
パーミッションにはそれぞれに対応する値があり、読み出し( r
)は 4
、書き込み( w
)は 2
、実行( x
)は 1
です。いずれのパーミッションもなければゼロ( 0
)です。パーミッションは組み合わせることができて、例えば rwx
は 7
( 4+2+1
)、r-x
は 5
( 4+0+1
)になります。
パーミッションの組を表す3桁の数字の1桁目はユーザー( u
)を、2桁目はグループ( g
)、3桁目はその他( o
)をそれぞれ表します。ファイルのパーミッションを rw-rw----
にする場合、8進数は 660
になります。
$ chmod 660 text.txt $ ls -l text.txt -rw-rw---- 1 carol carol 765 Dec 20 21:25 text.txt
このように、数値モード の構文は シンボリックモード
と同様です。最初の引数が変更後のパーミッションを示し、2番目は変更したファイルやディレクトリを指します。
Tip
|
パーミッションの値が 奇数 の場合、ファイルは実行可能です。 |
どちらの構文を使うのがよいでしょう? パーミッションの値を特定したい時には、数値モード を使うのがお勧めです。例えば、rw- r-- ---
にしたい場合には 640
など。
シンボリックモード は、現在のパーミッションにかかわらず、特定のパーミッションを操作したいときに便利です。例えば、グループやその他のユーザーに対する現在のパーミッションを変更せずに実行パーミッションを付ける場合には、chmod u+x script.sh
を使います。
ファイル所有権の変更
chown
コマンドは、ファイルやディレクトリの所有権を変更します。書式は簡単で、次のようになります:
chown ユーザー名:グループ名 ファイル名
例として text.txt
を取り上げます:
$ ls -l text.txt -rw-rw---- 1 carol carol 1881 Dec 10 15:57 text.txt
ファイルの所有者は carol
で、グループも carol
です。所有グループを別のもの、例えば student
に変更してみましょう:
$ chown carol:students text.txt $ ls -l text.txt -rw-rw---- 1 carol students 1881 Dec 10 15:57 text.txt
ファイルを所有するユーザーは、ファイルの所有グループに属している必要は無いことに注意しましょう。上記の例では、carol
は student
グループのメンバーである必要はありません。ただし、ファイルの所有グループを変更する場合には、変更後のグループのメンバーでなくてはいけません。
変更する必要が無い場合には、所有者か所有グループを省略することができます。ファイルの所有グループのみを変更するには chown :students text.txt
を使います。ユーザーだけを変更するには、コマンド chown carol text.txt
。なお、所有グループのみを変更する時には、chgrp carol text.txt
というコマンドも使えます。
システム管理者(root)でない限り、ユーザーは他のユーザーが所有するファイルや、自分が属していないグループが所有するファイルの所有権を変更することはできません。実行しようとすると Operation not permitted
(操作は許可されていません)というメッセージが表示されることでしょう。
グループを調べる
ファイルの所有権を変更する前に、システム上にどのようなグループが存在するか、どのユーザがグループのメンバであるか、ユーザがどのグループに属しているかを知っておくと便利です。2つのコマンド: groups
と groupmems
で行えます。
システムにどのようなグループが存在するかを見るには、単に groups
と入力します:
$ groups carol students cdrom sudo dip plugdev lpadmin sambashare
ユーザーがどのグループに属しているかを知りたいときは、引数にユーザー名を指定します:
$ groups carol carol : carol students cdrom sudo dip plugdev lpadmin sambashare
逆にユーザーが所属するグループを表示するには、groupmems
を使用します。-g
オプションでグループ名を指定し、-l
オプションでそのメンバーをリストします。
$ sudo groupmems -g cdrom -l carol
Tip
|
|
特別なパーミッション
ユーザー・グループ・その他に対する読み出し・書き込み・実行の3つのパーミッションだけでなく、それぞれのファイルは、ディレクトリの動作やプログラムの実行を変更する3つの 特別なパーミッション を持っています。それらは、シンボリックモードでも数値モードでも指定することができ、以下のようになります:
スティッキービット
スティッキービットは、削除制限フラグ とも呼ばれ、その他に対するパーミッションとして 8進数の 1
ないしシンボリックモードの t
で表されます。これはディレクトリのみで有効で、Linuxにおいては、ユーザーがそのディレクトリ内のファイルやサブディレクトリを削除ないし移動(リネーム)できるのは、その対象ファイル/ディレクトリの所有者である場合に制限する働きをします。
スティッキービットがセットされたディレクトリを ls -l
で出力すると、その他 に対するパーミッションにおいて、x
の代わりに t
が表示されます。
$ ls -ld Sample_Directory/ drwxr-xr-t 2 carol carol 4096 Dec 20 18:46 Sample_Directory/
数値モードにおいては、特殊パーミッションは “4桁の数値” で指定し、最初の桁がそれらの特殊パーミッションを示します。例えば、 パーミッションが 755
である Another_Directory
ディレクトリに数値モードでスティッキービット(値は 1
)をセットするコマンドは次のようになります:
$ chmod 1755 Another_Directory $ ls -ld Another_Directory drwxr-xr-t 2 carol carol 4,0K Dec 20 18:46 Another_Directory
Set GID
Set GID(SGIDあるいは Set Group IDともいう)は、8進数の 2
、ないしはシンボリックモードで グループ に対するパーミッションの s
で示されます。これは、ディレクトリないし実行可能ファイルに適用できます。実行可能ファイルにおいては、ファイルを実行した時に作られるプロセスが、ファイルの所有グループの権限を持って実行されます。ディレクトリにおいては、その中に作られたファイルやサブディレクトリが、親ディレクトリから所有グループを引き継ぎます。
SGIDがセットされたファイルやディレクトリを ls -l
で出力すると、グループ に対するパーミッションにおいて、x
の代わりに s
が表示されます。
$ ls -l test.sh -rwxr-sr-x 1 carol carol 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の効果をより理解できるでしょう。Sample_Directory
という 所有者が carol
で所有グループが users
であるディレクトリがあり、次のパーミッションを持っているとします:
$ 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/
グループ宛のパーミッションに、SGIDを表す s
がセットされました。再度、ディレクトリを変更して 、touch
コマンドを使って空のファイルを作ってみます:
$ cd Sample_Directory/ $ touch emptyfile $ ls -lh emptyfile -rw-r--r-- 1 carol users 0 Jan 18 17:20 emptyfile
このように、ファイルの所有グループが users
になりました。SGIDビットによって、親ディレクトリの所有グループ users
を引き継いだからです。
Set UID
Set UID(SUIDあるいは Set User IDともいう)は、8進数の 4
、ないしはシンボリックモードで ユーザー に対するパーミッションの s
で示されます。これはファイルにのみ適用でき、その動作は SGIDに類似していますが、プロセスはファイル 所有者 の権限を持って実行されます。SUIDがセットされたディレクトリを ls -l
で出力すると、ユーザー に対するパーミッションにおいて、x
の代わりに s
が表示されます。
$ ls -ld test.sh -rwsr-xr-x 1 carol carol 33 Dec 11 10:36 test.sh
複数の特殊パーミッションを1つにまとめて指定することができます。パーミッションが 755
であるスクリプト test.sh
に、SGID(値は 2
)とSUID(値は 4
)を数値モードで指定するには、次のように入力します:
$ chmod 6755 test.sh
結果は次のようになります:
$ ls -lh test.sh -rwsr-sr-x 1 carol carol 66 Jan 18 17:29 test.sh
(訳注: なお、スクリプトに対するSUIDおよびGUIDビットは、セキュリティ上の理由により無視されます。)
Tip
|
端末がカラー表示に対応している場合(最近はほとんどの端末が対応しています)、 |
演習
-
mkdir emptydir
コマンドでemptydir
という名前のディレクトリを作りましょう。ls
を使って、そのemptydir
ディレクトリのパーミッションを表示して下さい。 -
touch emptyfile
コマンドで、emptyfile
という名前のファイルを作りましょう。chmod
コマンドのシンボリックモードを使って、emptyfile
ファイルの所有者に対する実行パーミッションを追加し、その他のユーザーに対する実行パーミッションを削除します。これを1つのchmod
コマンドで行うにはどうすればよいでしょう? -
chmod 754 text.txt
コマンドを実行した後の、text.txt
のパーミッションはどうなりますか? -
test.sh
ファイルは、シェルスクリプトで次のようなパーミッションと所有権を持っているとします:-rwxr-sr-x 1 carol root 33 Dec 11 10:36 test.sh
-
ファイル所有者に対するパーミッションは何ですか?
-
ユーザー
john
がこのスクリプトを実行すると、どのユーザーの権限で実行されますか? -
数値モードの表記で、ファイルに与えられた特殊パーミッションを “unset” する、chmodを示して下さい。
-
-
以下のファイルについて考察します:
$ 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桁 のみの値を渡してemptyfile
のパーミッションを変更すると、何が起きるでしょうか? また、chmod 44 emptyfile
のように2桁ではどうなるでしょう? これらの結果から、chmod
が数値の値を読み取る方法について、何がわかりますか? -
実行パーミッションがあるが、読み出しパーミッションがないファイル(
--x
)を実行することはできますか? 方法と理由を答えて下さい。 -
Linuxシステムの一時ディレクトリ
/tmp
のパーミッションについて考察します:$ ls -l /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
は何を意味しますか? -
すべてのファイルの所有グループが自動的に
user
になり、作成者のみがそのファイルを削除できる、Box
ディレクトリ作成するにはどうすればよいですか?
まとめ
マルチユーザシステムである Linuxでは、各ファイルを誰が所有しているのか、またユーザがそのファイルに対する操作を行うことを許可されているかどうかを追跡する方法が必要です。これは3レベルのアクセス許可(パーミッション)システムによって行われますが、このレッスンではそのシステムの動作について学びました。
このレッスンでは、ls
でファイルのパーミッションを調べる方法、chmod
で誰がファイルを作成・削除・変更できるかを制御して 数値 表記と シンボリック 表記で変更する方法、chown
と chgrp
でファイルの所有権を変更する方法を学習しました。
このレッスンでは、以下のコマンドを取り上げました:
ls
-
ファイルを一覧表示し、オプションでパーミッションなどの詳細を含められます。
chmod
-
ファイルやディレクトリのパーミッションを変更します。
chown
-
ファイルやディレクトリの所有者や所有グループを変更します。
chgrp
-
ファイルやディレクトリの所有グループを変更します。
演習の解答
-
mkdir emptydir
コマンドでemptydir
という名前のディレクトリを作りましょう。ls
を使って、そのemptydir
ディレクトリのパーミッションを表示して下さい。ls
でディレクトリの内容ではなく、そのファイル属性を見るには、-d
オプションを使用します。そのため、答えは次のようになります:ls -l -d emptydir
2つのオプションをまとめて
ls -ld emptydir
と回答していたらボーナスポイントです。 -
touch emptyfile
コマンドで、emptyfile
という名前のファイルを作りましょう。chmod
コマンドのシンボリックモードを使って、emptyfile
ファイルの所有者に対する実行パーミッションを追加し、その他のユーザーに対する実行パーミッションを削除します。これを1つのchmod
コマンドで行うにはどうすればよいでしょう?次の方法を考えてみましょう:
-
“ファイルの所有者(
u
)に対して、追加する(+
)、実行(x
)パーミッション” で、u+x
-
“ファイルの所有グループ(
g
)とその他のユーザー(o
)に対して、削除する(-
)、書き込み(w
)と実行(x
)パーミッション” で、go-wx
。これら2セットのパーミッションを、コンマで区切って組み合わせて、次のようになります:
chmod u+x,go-wx emptyfile
-
-
chmod 754 text.txt
コマンドを実行した後の、text.txt
のパーミッションはどうなりますか?数値表現の各桁は3つのパーミッションを示していて、それぞれに対応する値があり、読み出し(
r
)は4
、書き込み(w
)は2
、実行(x
)は1
です。いずれのパーミッションもなければゼロ(0
)です。パーミッションは組み合わせることができて、例えばrwx
は7
(4+2+1
)、r-x
は5
(4+0+1
)になります。text.txt
のパーミッションは次になります:rwxr-xr--
-
test.sh
ファイルは、シェルスクリプトで次のようなパーミッションと所有権を持っているとします:-rwxr-sr-x 1 carol root 33 Dec 11 10:36 test.sh
-
ファイル所有者に対するパーミッションは何ですか?
所有者に対するパーミッション(
ls -l
の出力で2〜4番目の文字)はrwx
ですから、答えは “読み出し・書き込み・実行” です。 -
ユーザー
john
がこのスクリプトを実行すると、どのユーザーの権限で実行されますか?所有グループ のパーミッションに着目しましょう。
r-s
ですから SGIDビットがセットされています。このファイルの所有グループはroot
ですが、このスクリプトを一般ユーザーが実行した場合は、そのユーザーの権限で実行されます。 -
数値モードの表記で、ファイルに与えられた特殊パーミッションを “unset” する、chmodを示して下さい。
特殊パーミッションをクリアするには、
chmod
の4桁目に0
を指定します。現在のパーミッションは755
ですから、コマンドはchmod 0755
になります。
-
-
以下のファイルについて考察します:
$ 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桁の数値表記で、それぞれのファイルやディレクトリのパーミッションを書いて下さい。
数値表現での対応するパーミッションは次の通りです:
Another_Directory
-
答え:
1755
1
はスティッキービットで、755
が通常のパーミッションです。(ユーザー宛にrwx
、グループとその他ユーザー宛にr-x
) foo.bar
-
答え:
0044
特殊パーミッション無し(最初の数字が
0
)、ユーザー宛のパーミッション無し(---
)、グループとその他ユーザー宛に読み出しのみ(r--
)です。 HugeFile.zip
-
答え:
0664
特殊パーミッション無しで最初の数字は
0
、ユーザーとグループ宛が6
(rw-
)、その他ユーザー宛が4
(r--
)です。 Sample_Directory
-
答え:
2755
最初の
2
はSGIDビットです。ユーザー宛が7
(rwx
)、グループとその他ユーザー宛が5
(r-x
)です。
発展演習の解答
-
以下をターミナルで試してみましょう:
touch emptyfile
コマンドで空のファイルemptyfile
を作ります。次に、chmod 000 emptyfile
ですべてのパーミッションをゼロクリアします。chmod 4 emptyfile
のように、chmod
コマンドの数値モードで 1桁 のみの値を渡してemptyfile
のパーミッションを変更すると、何が起きるでしょうか? また、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
その他ユーザー宛のパーミッションが変わりました。続いて、2桁を指定したコマンド
chmod 44 emptyfile
を実行します:$ chmod 44 emptyfile $ ls -l emptyfile ----r--r-- 1 carol carol 0 Dec 11 10:55 emptyfile
今度は、グループ と その他 宛てのパーミッションが影響をうけました。ここから、
chmod
の数値表記では、低い桁( その他宛て )から高い桁( ユーザー宛 )に向かって “逆順に” 値を読み込むことが分かります。1桁の数字を渡すと その他ユーザー 宛てのパーミッションを変更し、2桁の数字を渡すと グループ 宛てと その他のユーザ 宛てを、3桁の数字を渡すと ユーザー宛 と グループ 宛てと その他のユーザ 宛て、4桁の数字を指定すると ユーザー宛 と グループ 宛てと その他のユーザ 宛てと特殊パーミッションを、それぞれ変更します。 -
実行パーミッションがあるが、読み出しパーミッションがないファイル(
--x
)を実行することはできますか? 方法と理由を答えて下さい。答えは明白のように思えますが、順を追って考えてみましょう。実行パーミッションがあれば、ファイルを実行することができるはずです。ところが、読み込みパーミッションがないと、システムは実行のためにファイルを開いて内容を読み出すことができません。そのため、読み込みパーミッションがないと、実行パーミッションがあったとしても、ファイルを実行することはできません。
-
Linuxシステムの一時ディレクトリ
/tmp
のパーミッションについて考察します:$ ls -l /tmp drwxrwxrwt 19 root root 16K Dec 21 18:58 tmp
ユーザー、グループ、その他に対するすべてのパーミッションがありますが、一般ユーザーがこのディレクトリ内のどのようなファイルも削除できるということでしょうか? その理由も答えて下さい。
/tmp
にはすべてのユーザーが書き込むことができるので、world writable であると言うことがあります。しかし、他人にファイルを変更されては困りますので、スティッキービット( 他のユーザー 宛てのパーミッションで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
は何を意味しますか?ファイル所有者の実行パーミッションを削除しました。
ls -l
の出力で、s
(ないしt
)はx
と同じ場所に表示されますから、ユーザーが実行パーミッションを持っているのか否かを表示する方法が必要です。そのために、特殊パーミッションの大文字・小文字を切り替えています。最初のパーミッショングループの小文字の
s
は、ファイルの所有者が実行パーミッションとSUIDを持っていることを意味しています。そして、大文字のS
は、ファイルの所有者が実行パーミッションを持たず、SUIDがセットされていることを示します。SGIDについても同様です。2番目のパーミッショングループの小文字の
s
は、ファイルの所有グループが実行パーミッションとSGIDビットを持っていることを示します。そして、大文字のS
は、ファイルの所有グループが実行パーミッションを持たず、SGIDがセットされていることを示します。スティッキービットの3番目のパーミッショングループに表示される
t
についても同様です。小文字のt
は、スティッキービットとその他のユーザーが実行パーミッションを持っていることを示します。大文字のT
は、その他のユーザーが実行パーミッションを持たず、スティッキービットがセットされていることを示します。 -
すべてのファイルの所有グループが自動的に
user
になり、作成者のみがそのファイルを削除できる、Box
ディレクトリ作成するにはどうすればよいですか?いくつかの手順で行います。最初のステップは、ディレクトリの作成です:
$ mkdir Box
このディレクトリに作成されるすべてのファイルを、自動的に
users
グループに割り当てたいのですから、ディレクトリの所有グループをこのグループにセットし、さらに SGUIビットをセットします。また、グループのメンバーがディレクトリに書き込める必要もあります。他のパーミッションはそのままに、特定のビットだけを “切り替える” には、シンボリックモードを使うのが便利です。
$ chown :users Box/ $ chmod g+wxs Box/
現在のユーザーが
user
グループに所属して居ない場合は、上のコマンドの前にsudo
を置いて rootとして実行する必要があります。終盤では、ファイルの所有者のみが削除できるようにします。これには、ディレクトリのスティッキービット(
t
で表示されます)をセットします。その他のユーザー(o
)宛てのパーミッションにセットすることに注意しましょう。$ chmod o+t Box/
ここまでで、
Box
ディレクトリのパーミッションは次のようになります:drwxrwsr-t 2 carol users 4,0K Jan 18 19:09 Box
もちろん、SGIDとスティッキービットを1つの
chmod
コマンドに指定することができます:$ chmod g+wxs,o+t Box/
このように答えていたらボーナスポイントです。