ファイルのパーミッションと所有権

はじめに

第32章はじめに

このビデオでは、この章で説明するトピックの簡単な概要を示します。


学習目標
この章の終わりまでに、次のことができるようになります。

所有者、グループ、world（もしくはother）の概念を説明できます。
各カテゴリのファイル アクセス権（読み取り、書き込み、実行）を設定できます。
適切なパーミッションを遵守し、ファイル アクセスのリクエストを認証できます。
chmodを使用してファイルのパーミッションを変更し、chownを使用してユーザーの所有権を変更し、chgrpを使用してグループの所有権を変更できます。
新しく作成されたファイルに必要なパーミッションを設定する際の、umaskの役割を理解できます。
ACLを使用して、シンプルな所有ユーザー／グループ／その他のユーザー、そして読み取り／書き込み／実行というモデルを、拡張することができます。


ファイルのパーミッションと所有権

所有者、グループ、その他のユーザー
次のようにls -lを実行すると、a_fileの情報が得られます。

$ ls -l a_file
-rw-rw-r-- 1 coop aproject 1601 Mar 9 15:04 a_file

最初の文字（ファイル オブジェクトの種類を示します。ここでは-（ダッシュ））の後に、ファイル ユーザーに付与されたアクセス権を示すさらに9つの文字があります。これらはそのファイルの3種類に分類された所有権に対し、それぞれ3文字が付与されたものです。その3種類の所有権とは次のとおりです。

owner：ファイルを所有するユーザー（単にユーザーとも呼ばれます）
group：アクセス権を持つユーザーのグループ
world：その他のユーザー（otherとも呼ばれます）。

上記の出力リストでは、ユーザーはcoopで、グループはaprojectです。


ファイルのアクセス権
例えば以下のような、1つのファイルの情報を得たとします。

$ ls -l /usr/bin/vi
-rwxr-xr-x 1 root root 1206144 Jun 14 08:49 /usr/bin/vi

3種類の所有権のそれぞれの3つのエンティティには、次の値を設定することができます。

r：読み取りアクセスが許可されます
w：書き込みアクセスが許可されます
x：実行アクセスが許可されます。

パーミッションがない場合は、これらの文字の代わりに-（ダッシュ）が表示されます。

さらに、setuid/setgidを行うパーミッションなど、カテゴリごとに他の特殊なパーミッションが存在します。

したがって、前の例では、ユーザーcoopとグループaprojectのメンバには読み取りと書き込みのアクセス権があり、その他のユーザーには読み取りのアクセス権しかないことを表しています。

これらのファイル アクセスのパーミッションは、Linuxセキュリティ システムの重要な部分です。ファイルへのアクセス要求では、要求ユーザーの権限と識別情報をファイルの所有者のものと比較する必要があります。

この認証は、要求ユーザーが3種類の所有権のどれに属しているかによって与えられます。その調べ方は以下のとおりです。

要求ユーザーがファイル所有者である場合、ファイル所有者のパーミッションを使用します。
それ以外の場合で、要求ユーザーがファイルを所有するグループに属している場合、グループのパーミッションを調べます。
それ以外の場合、その他のユーザーのパーミッションを調べます。


chmod
ファイル パーミッションの変更は、chmodを使用して行います。スーパーユーザーでない限り、変更できるのは自分が所有するファイルのパーミッションのみです。

chmodを使用するには、さまざまな方法があります。たとえば、所有者とその他のユーザーに実行のパーミッションを付与し、グループの書き込みパーミッションを削除する場合：

$ ls -l a_file
-rw-rw-r-- 1 coop coop 1601 Mar 9 15:04 a_file
$ chmod uo+x,g-w a_file
$ ls -l a_file
-rwxr--r-x 1 coop coop 1601 Mar 9 15:04 a_file

ここで、uはユーザー（所有者）を表し、oはその他のユーザー（world/other）を表し、gはグループを表します。

パーミッションは、通常は8進数で書かれたビットマップ、または記号表記で表すことができます。8進数のビットマップは0755のように、記号表記はu+rwx、g+rx、o+rxのように表されます。


8進数
記号表記の構文表記は入力や覚えるのが難しい場合があるため、多くの場合、8進数の短縮形を使用します。これにより、すべてのパーミッションを1ステップで設定できます。これは単純なアルゴリズムで行われ、3種類のグループのエンティティに3種類のパーミッション ビットすべてを指定するには1桁で十分です。8進数表現は、次の3種類の合計です。

4：読み取りのパーミッション
2：書き込みのパーミッション
1：実行のパーミッション

したがって、7は読み取り／書き込み／実行、6は読み取り／書き込み、5は読み取り／実行のパーミッションが付与されていることを意味します。

これをchmodで適用する場合、次のように各エンティティに上記の値を指定する必要があります。

$ chmod 755 a_file
$ ls -l a_file
-rwxr-xr-x 1 coop coop 1601 Mar 9 15:04 a_file

chmodの使用例


chownとchgrp
ファイル所有者の変更はchownで行われ、グループの変更はchgrpで行われます。スーパーユーザーのみがファイルの所有者を変更できます。同様に、ファイルのグループを変更できるのは、変更前と変更後の両方のグループに属しているユーザーだけです。

ファイルの所有グループの変更は、次のように簡単です。

$ chgrp cleavers somefile

そして、所有者の変更（スーパーユーザーのみがこれを行うことができます）は次のとおりです。

$ chown wally somefile

以下のように、両方を同時に変更できます。

$ chown wally:cleavers somefile

所有者とグループはコロン（またはピリオド）で区切ります。

これらの3つのプログラムはすべて、再帰を表す-Rオプションを使用できます。例えば、

$ chown -R wally:cleavers ./
$ chown -R wally:wally subdir

最初のコマンドで、現在のディレクトリとそのすべてのサブディレクトリ内のすべてのファイルの所有者とグループを変更します。2番目のコマンドでは、subdirとそのすべてのサブディレクトリの所有者とグループを変更します。


umask
ファイルを作成するときに与えられるデフォルトのパーミッションは、所有者、グループ、その他のユーザーのすべてに対して読み取り／書き込み（0666）であり、ディレクトリの場合はすべて読み取り／書き込み／実行（0777）です。では、以下を行ってみてください。

$ touch afile
$ mkdir adir
$ ls -l | grep -e afile -e adir
drwxrwxr-x 2 coop coop 4096 Sep 16 11:18 adir
-rw-rw-r-- 1 coop coop 0 Sep 16 11:17 afile

実際のパーミッションが、ファイルは664に、ディレクトリは775に変更されていることに気付くでしょう。これは、どのパーミッションを許可しないかを決めるumaskによって変更されています。umaskの現在の値は次の方法で表示できます。

$ umask
0002

これは、システム管理者がユーザーに設定する最も一般的な値です。この値は、実際の結果を取得するためにファイル作成許可と組み合わされます。つまり、

0666&〜002=0664、すなわち、rw-rw-r--です。

次のように、umaskコマンドを使用して、いつでもumaskの値を変更できます。

$ umask 0022


デモ：umask

このビデオは、umaskの簡単なデモを提供します。


ファイルシステムの ACL
Linuxには、よりシンプルなユーザー、グループ、その他のユーザー、そして読み取り、書き込み、実行というモデルを拡張する、POSIX ACL（アクセス制御リスト）の完全な実装が含まれています。

特定のオブジェクトまたはオブジェクトのクラスにアクセスするときに、特定のユーザーまたはユーザーのグループに特定の特権を付与します。ファイルとディレクトリは、777パーミッションを使用しなくても共有できます。

LinuxカーネルでACLの使用を有効にする場合、特定のファイルシステムにもACLを実装する必要があります。最新のLinuxディストリビューションで使用されるすべての主要なファイルシステムにはACL拡張が組み込まれています。マウント時にオプション-aclを指定すれば実装できます。ACLのデフォルト設定は、システムのインストール時に作成されます。

ACLを表示する構文：

$ getfacl file|directory

例えば以下のように使います。

$ getfacl file1

ACLを設定する構文：

$ setfacl options permissions file|ディレクトリ

例えば以下のように使います。

$ setfacl -m u:isabelle:rx /home/stephane/file1
$ setfacl -x u:isabelle /home/stephane/file

新しいファイルは、それらが存在するディレクトリから、（設定されている場合は）デフォルトのACLを継承することに注意してください。また、mvとcp -pはACLを維持することに注意してください。

ACLを削除する場合は以下のように行います。

$ setfacl -x u:isabelle /home/stephane/file1

また、ディレクトリにデフォルトのACLを設定する場合は以下のように行います。

$ setfacl -m d:u:isabelle:rx somedir


演習

課題 32.1: chmodの使用例

🚩
以下のPDFドキュメントに埋め込まれた外部URLにアクセスする場合は、常に右クリックして新しいタブまたはウィンドウで開いてください。直接クリックしてURLを開こうとすると、コース ウィンドウ／タブが閉じます。

【【これ以降は橋本さんの訳を参照】】

One can use either the octal digit or symbolic methods for specifying permissions when using chmod.  Let’s elaborate somemore on the symbolic method.

It is possible to either give permissions directly, or add or subtract permissions. The syntax is pretty obvious. Try the followingexamples:

$ chmod u=r,g=w,o=x afile
$ chmod u=+w,g=-w,o=+rw afile
$ chmod ug=rwx,o=-rw afile

After each step do:

$ ls -l afileto see how the permissions took, and try some variations.


課題 32.2: umask

🚩
以下のPDFドキュメントに埋め込まれた外部URLにアクセスする場合は、常に右クリックして新しいタブまたはウィンドウで開いてください。直接クリックしてURLを開こうとすると、コース ウィンドウ／タブが閉じます。

Exercise 32.2: umask

Create an empty file with:

$ touch afile
$ ls -l afile
-rw-rw-r-- 1 coop coop 0 Jul 26 12:43 afile

which shows it is created by default with both read and write permissions for owner and group, but only read for world.

  

If you just type umask you get the current value:

$ umask
0002

これは、システム管理者がユーザーに設定する最も一般的な値です。この値は、実際の結果を取得するためにファイル作成許可と組み合わされます。つまり、

0666 &  ̃002 = 0664; i.e., rw-rw-r--

Try modifying the umask and creating new files and see the resulting permissions, as in:

$ umask 0022
$ touch afile2
$ umask 0666
$ touch afile3
$ ls -l afile*


課題 32.3: アクセス コントロール リストを使う

🚩
以下のPDFドキュメントに埋め込まれた外部URLにアクセスする場合は、常に右クリックして新しいタブまたはウィンドウで開いてください。直接クリックしてURLを開こうとすると、コース ウィンドウ／タブが閉じます。

Exercise 32.3: Using Access Control Lists

1.  Create a file using your usual user name and run getfacl on it to see its properties.

2.  Create a new user account with default properties (or reuse one from previous exercises.

3.  Login as that user and try to add a line to the file you created in the first step. This should fail.

4.  User setfacl to make the file writeable by the new user and try again.

5.  User setfacl to make the file not readable by the new user and try again.

6.  Clean up as necessary

Solution 32.3

It is probably easiest to open two terminal windows, one to work in as your normal user account, and the other as the secondary one.

1.  In window 1:

$ echo This is a file > /tmp/afile
$ getfacl /tmp/afile
getfacl: Removing leading'/'from absolute path names
# file: tmp/afile
# owner: coop
# group: coop
user::rw-
group::rw-
other::r--

2.  In window 1:

$ sudo useradd fool
$ sudo passwd fool
...


3.  In window 2:

$ sudo su - fool
$ echo another line > /tmp/afile
-bash: /tmp/afile: Permission denied

4.  In window 1:

$ setfacl -m u:fool:rw /tmp/afile
$ getfacl /tmp/afile
getfacl: Removing leading'/'from absolute path names
# file: tmp/afile
# owner: coop
# group: coop
user::rw-
user:fool:rw-
group::rw-mask::rwx
other::r--

In window 2:
$ echo another line > /tmp/afile

5.  In window 1:

$ setfacl -m u:fool:w /tmp/afile

In window 2:
$ echo another line > /tmp/afile
-bash: /tmp/afile: Permission denied

6.  Cleaning up:
$ rm /tmp/afile
$ sudo userdel -r fool


知識チェック

「第32章 - ファイルのパーミッションと所有権」を完遂しました。おめでとうございます。このクイズに答えて、これまでに学んだ概念の理解度をチェックしてください。

クイズ開始

問題 32.1
ファイルprivのパーミッションを0664から-rwx------に変更するコマンドは次のうちどれですか？ 当てはまるものをすべて選択してください。

A. chown 0700 priv
B. chmod 0700 priv
C. chmod u+x,g-rw,o-r priv

問題 32.2
次のコマンドのうち、ファイルprivのパーミッションを-rwx------から0664に変更するのはどれですか？ 当てはまるものをすべて選択してください。

A. chown 0664 priv
B. chmod 0664 priv
C. chmod u-x,g+rw,o+r priv

