Linux Professional Institute Learning Logo.
main contentにスキップ
  • ホーム
    • 全てのリソース
    • LPI学習教材
    • コントリビューターになる
    • Publishing Partners
    • Publishing Partnerになる
    • About
    • FAQ
    • コントリビューター
    • Roadmap
    • 連絡先
  • LPI.org
5.3 レッスン 1
課題 1: Linuxコミュニティとオープンソースのキャリア
1.1 ポピュラーなOSとLinuxの発展
  • 1.1 レッスン 1
1.2 主なオープンソースのアプリケーション
  • 1.2 レッスン 1
1.3 オープンソースソフトウエアとライセンス
  • 1.3 レッスン 1
1.4 ICTスキルとLinuxでの作業
  • 1.4 レッスン 1
課題 2: Linuxシステムで自分の手法を見つける
2.1 コマンドラインの基本
  • 2.1 レッスン 1
  • 2.1 レッスン 2
2.2 コマンドラインのヘルプ機能の利用
  • 2.2 レッスン 1
2.3 ディレクトリの利用とファイルの一覧
  • 2.3 レッスン 1
  • 2.3 レッスン 2
2.4 ファイルの作成、移動と削除
  • 2.4 レッスン 1
課題 3: コマンドラインの力
3.1 コマンドラインでのファイル圧縮
  • 3.1 レッスン 1
3.2 ファイルの検索と展開
  • 3.2 レッスン 1
  • 3.2 レッスン 2
3.3 コマンドをスクリプトにする
  • 3.3 レッスン 1
  • 3.3 レッスン 2
課題 4: Linuxオペレーティングシステム
4.1 オペレーティングシステムの選択
  • 4.1 レッスン 1
4.2 コンピュータハードウエアの理解
  • 4.2 レッスン 1
4.3 データの保管場所
  • 4.3 レッスン 1
  • 4.3 レッスン 2
4.4 ネットワーク上のコンピュータ
  • 4.4 レッスン 1
課題 5: セキュリティとファイルパーミッション
5.1 セキュリティの基本と、ユーザタイプの確認
  • 5.1 レッスン 1
5.2 ユーザとグループの作成
  • 5.2 レッスン 1
5.3 ファイルのパーミッションと所有権の管理
  • 5.3 レッスン 1
5.4 特別なディレクトリとファイル
  • 5.4 レッスン 1
How to get certified
  1. 課題 5: セキュリティとファイルパーミッション
  2. 5.3 ファイルのパーミッションと所有権の管理
  3. 5.3 レッスン 1

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 やその他のLinuxコマンドでは、複数のオプションを組み合わせることができます。例えば、ls -l -a を ls -la と書くことができます。

ファイル種別の理解

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

-R オプションを使うとき、特にたくさんのファイルやディレクトリを含むディレクトリに対して使うときは十分な注意が必要です。なぜなら、変更したくないファイルやディレクトリのパーミッションも、実に簡単に変更してしまうからです。

数値モード

数値モード では、パーミッションを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

groupmems はシステム管理者(root)のみが実行できます。rootとしてログインしているのでなければ、コマンドの前に sudo を置きます。

特別なパーミッション

ユーザー・グループ・その他に対する読み出し・書き込み・実行の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

端末がカラー表示に対応している場合(最近はほとんどの端末が対応しています)、ls -l の出力を見ると、特別なパーミッションが設定されているかどうかがすぐにわかります。スティッキービットの場合は、ディレクトリ名が青背景の黒いフォントで表示されることがあります。SGID(黄色背景)や SUID(赤背景)のファイルも同様です。使用しているLinuxディストリビューションや端末の設定によって、色が異なることがあります。

演習

  1. mkdir emptydir コマンドで emptydir という名前のディレクトリを作りましょう。ls を使って、その emptydir ディレクトリのパーミッションを表示して下さい。

  2. touch emptyfile コマンドで、emptyfile という名前のファイルを作りましょう。chmod コマンドのシンボリックモードを使って、emptyfile ファイルの所有者に対する実行パーミッションを追加し、その他のユーザーに対する実行パーミッションを削除します。これを1つの chmod コマンドで行うにはどうすればよいでしょう?

  3. chmod 754 text.txt コマンドを実行した後の、text.txt のパーミッションはどうなりますか?

  4. test.sh ファイルは、シェルスクリプトで次のようなパーミッションと所有権を持っているとします:

    -rwxr-sr-x 1 carol root     33 Dec 11 10:36 test.sh
    • ファイル所有者に対するパーミッションは何ですか?

    • ユーザー john がこのスクリプトを実行すると、どのユーザーの権限で実行されますか?

    • 数値モードの表記で、ファイルに与えられた特殊パーミッションを “unset” する、chmodを示して下さい。

  5. 以下のファイルについて考察します:

    $ ls -l /dev/sdb1
    brw-rw---- 1 root disk 8, 17 Dec 21 18:51 /dev/sdb1

    sdb1 のファイル種別は何で、誰が書き込めますか?

  6. 次の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

発展演習

  1. 以下をターミナルで試してみましょう: touch emptyfile コマンドで空のファイル emptyfile を作ります。次に、chmod 000 emptyfile ですべてのパーミッションをゼロクリアします。chmod 4 emptyfile のように、chmod コマンドの数値モードで 1桁 のみの値を渡して emptyfile のパーミッションを変更すると、何が起きるでしょうか? また、chmod 44 emptyfile のように2桁ではどうなるでしょう? これらの結果から、chmod が数値の値を読み取る方法について、何がわかりますか?

  2. 実行パーミッションがあるが、読み出しパーミッションがないファイル( --x )を実行することはできますか? 方法と理由を答えて下さい。

  3. Linuxシステムの一時ディレクトリ /tmp のパーミッションについて考察します:

    $ ls -l /tmp
    drwxrwxrwt  19 root root  16K Dec 21 18:58 tmp

    ユーザー、グループ、その他に対するすべてのパーミッションがありますが、一般ユーザーがこのディレクトリ内のどのようなファイルも削除できるということでしょうか? その理由も答えて下さい。

  4. 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 は何を意味しますか?

  5. すべてのファイルの所有グループが自動的に user になり、作成者のみがそのファイルを削除できる、Box ディレクトリ作成するにはどうすればよいですか?

まとめ

マルチユーザシステムである Linuxでは、各ファイルを誰が所有しているのか、またユーザがそのファイルに対する操作を行うことを許可されているかどうかを追跡する方法が必要です。これは3レベルのアクセス許可(パーミッション)システムによって行われますが、このレッスンではそのシステムの動作について学びました。

このレッスンでは、ls でファイルのパーミッションを調べる方法、chmod で誰がファイルを作成・削除・変更できるかを制御して 数値 表記と シンボリック 表記で変更する方法、chown と chgrp でファイルの所有権を変更する方法を学習しました。

このレッスンでは、以下のコマンドを取り上げました:

ls

ファイルを一覧表示し、オプションでパーミッションなどの詳細を含められます。

chmod

ファイルやディレクトリのパーミッションを変更します。

chown

ファイルやディレクトリの所有者や所有グループを変更します。

chgrp

ファイルやディレクトリの所有グループを変更します。

演習の解答

  1. mkdir emptydir コマンドで emptydir という名前のディレクトリを作りましょう。ls を使って、その emptydir ディレクトリのパーミッションを表示して下さい。

    ls でディレクトリの内容ではなく、そのファイル属性を見るには、-d オプションを使用します。そのため、答えは次のようになります:

    ls -l -d emptydir

    2つのオプションをまとめて ls -ld emptydir と回答していたらボーナスポイントです。

  2. touch emptyfile コマンドで、emptyfile という名前のファイルを作りましょう。chmod コマンドのシンボリックモードを使って、emptyfile ファイルの所有者に対する実行パーミッションを追加し、その他のユーザーに対する実行パーミッションを削除します。これを1つの chmod コマンドで行うにはどうすればよいでしょう?

    次の方法を考えてみましょう:

    • “ファイルの所有者( u )に対して、追加する( + )、実行( x )パーミッション” で、u+x

    • “ファイルの所有グループ( g )とその他のユーザー( o )に対して、削除する( - )、書き込み( w )と実行( x )パーミッション” で、 go-wx。

      これら2セットのパーミッションを、コンマで区切って組み合わせて、次のようになります:

      chmod u+x,go-wx emptyfile
  3. 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--
  4. 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 になります。

  5. 以下のファイルについて考察します:

    $ ls -l /dev/sdb1
    brw-rw---- 1 root disk 8, 17 Dec 21 18:51 /dev/sdb1

    sdb1 のファイル種別は何で、誰が書き込めますか?

    ls -l からの出力で、最初の文字はファイル種別を示します。b は ブロックデバイス で、通常はマシンに接続されているディスク(内蔵ないし外部)です。所有者( root )と、disk グループのメンバーが書き込みできます。

  6. 次の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 )です。

発展演習の解答

  1. 以下をターミナルで試してみましょう: 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桁の数字を指定すると ユーザー宛 と グループ 宛てと その他のユーザ 宛てと特殊パーミッションを、それぞれ変更します。

  2. 実行パーミッションがあるが、読み出しパーミッションがないファイル( --x )を実行することはできますか? 方法と理由を答えて下さい。

    答えは明白のように思えますが、順を追って考えてみましょう。実行パーミッションがあれば、ファイルを実行することができるはずです。ところが、読み込みパーミッションがないと、システムは実行のためにファイルを開いて内容を読み出すことができません。そのため、読み込みパーミッションがないと、実行パーミッションがあったとしても、ファイルを実行することはできません。

  3. Linuxシステムの一時ディレクトリ /tmp のパーミッションについて考察します:

    $ ls -l /tmp
    drwxrwxrwt  19 root root  16K Dec 21 18:58 tmp

    ユーザー、グループ、その他に対するすべてのパーミッションがありますが、一般ユーザーがこのディレクトリ内のどのようなファイルも削除できるということでしょうか? その理由も答えて下さい。

    /tmp にはすべてのユーザーが書き込むことができるので、world writable であると言うことがあります。しかし、他人にファイルを変更されては困りますので、スティッキービット( 他のユーザー 宛てのパーミッションで t が示されます)がセットされています。これは、ファイルの所有者のみが /tmp にあるファイルを削除・変更できることを意味します。

  4. 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 は、その他のユーザーが実行パーミッションを持たず、スティッキービットがセットされていることを示します。

  5. すべてのファイルの所有グループが自動的に 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/

    このように答えていたらボーナスポイントです。

Linux Professional Insitute Inc. All rights reserved. 学習資料をご覧ください: https://learning.lpi.org
ここでの作成物は、Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Licenseの下でライセンスされています。

次のレッスン

5.4 特別なディレクトリとファイル (5.4 レッスン 1)

次のレッスンを読む

Linux Professional Insitute Inc. All rights reserved. 学習資料をご覧ください: https://learning.lpi.org
ここでの作成物は、Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Licenseの下でライセンスされています。

LPIは非営利団体です。

© 2023 Linux Professional Institute(LPI)は、オープンソースプロフェッショナル向けのグローバルな認定基準およびキャリアサポート組織です。200,000人以上の認定保持者を擁する、世界初かつ最大のベンダー中立Linuxおよびオープンソース認定機関です。LPIは180か国以上で認定プロフェッショナルを擁し、複数の言語で試験を実施し、何百ものトレーニングパートナーを擁しています。

私たちの目的は、オープンソースの知識とスキルの認定資格を世界中からアクセスできるようにすることで、誰にとっても経済的で創造的な機会を可能にすることです。

  • LinkedIn
  • flogo-RGB-HEX-Blk-58 Facebook
  • Twitter
  • お問い合わせ
  • 個人情報とCookieポリシー

間違いを見つけたり、このページを改善したいですか? 私たちに知らせてください。.

© 1999–2023 The Linux Professional Institute Inc. All rights reserved.