27.2. ユーザとアクセス権

1990年代初期の開始以来、Linuxはマルチユーザシステムとして開発が進められてきました。任意の数のユーザがLinux上で同時に作業することができます。ユーザは各自のワークステーションでセッションを開始する前に、システムにログインする必要があります。各ユーザは、各自のユーザ名およびそれに対応するパスワードを持っています。このようにユーザが区別されているので、権限のないユーザが、アクセス権のないファイルを表示できないことが保証されています。新しいプログラムをインストールするなど、より大きな変更をシステムに加える作業は、一般のユーザは通常は実行できないか、制約を加えられています。rootユーザ、またはスーパユーザだけが、システムに変更を加える制限なしの権限と、すべてのファイルに対する制限なしのアクセス権を持っています。この概念を理解した上で、必要な場合にのみrootユーザでログインし、完全なアクセス権を使用することが求められます。その結果、意図せずにデータを失うリスクを軽減することができます。一般的な状況では、システムファイルの削除やハードディスクのフォーマットを実行できるのはrootユーザだけです。そのため、一般ユーザとしてログインしていれば、トロイの木馬や、破壊的なコマンドを誤って入力することに起因する脅威を大幅に軽減できます。

27.2.1. ファイルシステムのパーミッション

基本的に、Linuxファイルシステム内にある各ファイルは、1人のユーザと1つのグループに所属しています。この所有グループと他のすべてのユーザに対して、これらのファイルへの書き込み、読み取り、または実行を許可することができます。

この状況では、グループとは、特定のいくつかの権利を共通に持つ、互いに関連付けられた一連のユーザと定義することができます。たとえば、あるプロジェクトに携わっているグループをproject3と呼ぶことにします。Linuxシステム内のあらゆるユーザは、少なくとも1つの所有グループ、通常はusersグループのメンバに所属します。1つのシステム内に、必要に応じてグループをいくつ作成してもかまいませんが、グループを追加できるのはrootユーザだけです。どのユーザも、groupsコマンドを使用して、自分が所属しているグループを確認することができます。

ファイルアクセス

ファイルシステム内でのパーミッション(アクセス権)の編成は、ファイルごと、ディレクトリごとに異なります。ファイルのパーミッション情報は、ls -lコマンドを使用して表示できます。出力例については、例 27.1. 「ファイルパーミッションを示すサンプル出力」を参照してください。

例 27.1. ファイルパーミッションを示すサンプル出力

-rw-r----- 1 tux project3 14197 Jun 21  15:03 Roadmap

3番目の列が示しているように、このファイルはユーザtuxに所属しています。また、このファイルはグループproject3に対して割り当てられています。Roadmapファイルのユーザパーミッションを調べるには、最初の列を詳細に検討する必要があります。

-

rw-

r--

---

タイプ

ユーザパーミッション

グループパーミッション

他のユーザのパーミッション

この列は、先頭に1つの文字があり、その後に3文字ずつ3つのブロック、つまり9つの文字が続く構成です。10文字のうち最初の1文字は、ファイルシステムコンポーネントのタイプを表す略称です。ダッシュ()は、これがファイルであることを意味します。ディレクトリ(d)、リンク(l)、ブロックデバイス(b)、またはキャラクタデバイスが代わりに表示されることもあります。

続く3つのブロックは、標準的なパターンに従っています。各ブロックの最初の文字は、ファイルが読み取り可能(r)またはそうでないこと()を意味します。中間の位置にあるwは、対応するオブジェクトが編集可能であることを示し、ダッシュ()であれば、ファイルへの書き込みが不可能であることを意味します。3番目の位置にあるxは、そのオブジェクトが実行可能であることを意味します。この例のファイルはテキストファイルなので、実行可能ではありません。したがって、この特定のファイルに対する実行可能アクセス権は必要ありません。

この例では、tuxRoadmapファイルの所有者として、読み取りアクセス権(r)および書き込みアクセス権(w)を持っていますが、このファイルを実行する(x)ことはできません。project3グループのメンバは、このファイルを読み取ることはできますが、変更や実行はできません。他のユーザは、このファイルに対するアクセス権が何もありません。他のパーミッションは、アクセス制御リスト(ACL)を使用して割り当てることができます。背景となる情報は、項27.2.6. 「アクセス制御リスト(ACL)」を参照してください。

ディレクトリパーミッション

ディレクトリに対応するアクセス権は、タイプがdと表示されています。ディレクトリの場合、個別のパーミッションは、やや異なる意味を持ちます。

例 27.2. ディレクトリパーミッションを示すサンプル出力

drwxrwxr-x 1 tux project3 35 Jun 21 15:15  ProjectData

例 27.2. 「ディレクトリパーミッションを示すサンプル出力」では、ディレクトリProjectDataの所有者(tux)と所有グループ(project3)を簡単に識別できます。ファイルアクセスで説明したファイルのアクセス権(パーミッション)とは異なり、読み取りアクセス権(r)を持つことは、ディレクトリの内容を表示できることを意味します。書き込みアクセス権(w)の場合は、新しいファイルを作成できることを意味します。実行可能アクセス権(x)の場合は、ユーザがこのディレクトリに変更を加えられることを意味します。上記の例では、ユーザtuxproject3グループのメンバがProjectDataディレクトリに変更を加え(x)、内容を表示し(r)、このディレクトリにファイルを追加する(w)ことができることを表します。一方、他のユーザに対して与えられているのは、それより少ないアクセス権です。このディレクトリにアクセスし(x)、内容を閲覧する(r)ことはできますが、新しいファイルを作成する(w)ことはできません。

27.2.2. ファイルパーミッションの変更

アクセス権の変更

ファイルまたはディレクトリに対するアクセス権を変更できるのは、所有者とrootユーザです。 chmodコマンドで、パーミッションを変更するパラメータと1つ以上のファイル名を指定することにより変更します。パラメータは、次のカテゴリに分けられます。

  1. 対象ユーザ

    • u (ユーザ)—ファイルの所有者

    • g (グループ)—ファイルの所有者が所属するグループ

    • o (その他)—その他のユーザ(パラメータが何も指定されていない場合、変更はすべてのカテゴリに対して適用されます)

  2. 削除 ()、セット(=)、または挿入(+)を表す文字

  3. 略称

    • r読み取り

    • w書き込み

    • x実行

  4. 空白によって区切られた1つ以上のファイル名

たとえば、例 27.2. 「ディレクトリパーミッションを示すサンプル出力」で、tuxユーザが、その他のユーザに対してProjectDataディレクトリへの書き込み(w)アクセス権を許可する場合、chmod o+w ProjectDataコマンドを使用します。

また、自分以外のユーザに対する書き込みパーミッションを拒否する場合は、chmod go-w ProjectDataコマンドを入力します。すべてのユーザに対して、ProjectDataディレクトリに新しいファイルを追加することを禁止するには、chmod -w ProjectDataと入力します。その場合、このディレクトリの所有者であっても、最初に書き込みパーミッションを再確立するまでは、このディレクトリ内でファイルを作成することができません。

所有に関するパーミッションの変更

ファイルシステムコンポーネントの所有に関するパーミッションを制御する他の重要なコマンドは、chown (change owner)コマンドとchgrp(change group)コマンドです。chownコマンドを使用すると、ファイルの所有権を他のユーザに移すことができます。しかし、このような変更を行うことができるのは、rootユーザだけです。

例 27.2. 「ディレクトリパーミッションを示すサンプル出力」Roadmapファイル所有権を、tuxではなく、geekoユーザにするとします。 その場合、rootユーザで、chown geeko Roadmapコマンドを入力します。

chgrpコマンドは、ファイル所有者の所属グループを変更します。ただし、そのファイルの所有者は、新しいグループのメンバでなければなりません。この方法により、例 27.1. 「ファイルパーミッションを示すサンプル出力」tuxユーザは、chgrp project4 ProjectDataコマンドを使用して、ProjectDataファイル所有者の所属グループをproject4に切り替えることができます。ただし、このユーザが、この新しいグループのメンバであることが条件です。

27.2.3. setuidビット

特定の状況では、アクセス権の制約が強すぎることがあります。したがって、Linuxは、特定のアクションが実行できるように、現在のユーザとグループのID(身分とその権限)を一時的に変更できるようにする追加の設定項目を用意しています。たとえば、passwdプログラムでは、一般に/etc/passwdにアクセスする際にrootユーザのパーミッションが必要です。このファイルには、ユーザのホームディレクトリ、ユーザとグループのIDなどの重要情報が含まれます。したがって、このファイルへのアクセスをすべてのユーザに許可することは危険が大きいので、一般ユーザはpasswdを変更できません。この問題の解決策はsetuidメカニズムです。 setuid (set user ID)は、特別なファイル属性であり、マークされたプログラムを特定のユーザIDで実行するようシステムに指示します。次のようなpasswdコマンドを検討してみます。

-rwsr-xr-x  1 root shadow 80036 2004-10-02 11:08 /usr/bin/passwd

sという文字が表示されていて、ユーザパーミッションでsetuidビットがセットされていることを示しています。setuidビットによって、passwdコマンドを実行するすべてのユーザは、rootで実行できます。

27.2.4. setgidビット

setuidビットはユーザに適用されます。ただし、グループにもsetgidビットという同等のプロパティがあります。この属性がセットされているプログラムは、どのユーザがそのプログラムを起動したかにかかわりなく、そのプログラムと共に保存されているグループIDを使用して動作します。したがって、setgidビットがオンになっているディレクトリ内では、新しく作成されるすべてのファイルとサブディレクトリは、そのディレクトリが所属しているグループに対して割り当てられます。次のサンプルディレクトリについて考えてみます。

drwxrws--- 2 tux archive 48 Nov 19 17:12
   backup

sという文字が表示されていて、グループパーミッションでsetgidビットがセットされていることを示しています。ディレクトリの所有者とarchiveグループのメンバは、このディレクトリにアクセスできます。このグループのメンバではないユーザは、適切なグループに「マップ」されます。書き込まれたすべてのファイルの有効なグループIDはarchiveです。. たとえば、グループIDarchiveで実行されるバックアッププログラムは、ルート権限なしにこのディレクトリにアクセスできます。

27.2.5. sticky(スティッキー)ビット

sticky(スティッキー)ビットもあります。このビットは、実行可能プログラムとディレクトリのどちらに所属しているかにより意味が異なります。このビットがプログラムに所属している場合、このようにマークが付けられたファイルは、使用するたびにハードディスクにアクセスする必要がないようにRAMにロードされます。現在のハードディスクは十分高速なので、この属性はほとんど使用されなくなっています。このビットをディレクトリに割り当てた場合、各ユーザが他のユーザのファイルを削除することが防止されます。一般的な使用例として、/tmp/var/tmpの各ディレクトリを挙げることができます。

drwxrwxrwt   2 root  root   1160 2002-11-19 17:15 /tmp
  

27.2.6. アクセス制御リスト(ACL)

伝統的なパーミッションの概念は、ファイルやディレクトリなど、Linuxのファイルシステムオブジェクトを対象にしていますが、ACL (アクセス制御リスト)は、この概念を拡張できます。ACLを使用すると、ファイルシステムオブジェクトの元の所有者や所有グループ以外に、個別のユーザまたはグループにパーミッションを割り当てることができます。

拡張アクセス権が有効になっているファイルまたはディレクトリは、簡単なls -lコマンドを使用して検出できます。

-rw-r--r--+ 1 tux project3 14197 Jun 21  15:03 Roadmap

Roadmapファイルの所有者はtuxで、このユーザはproject3グループに所属しています。tuxはこのファイルに対する書き込みと読み取りの両方のアクセス権を持っています。グループおよびその他のすべてのユーザは読み取りアクセス権を持っています。このファイルを、ACLなしのファイルと区別するための唯一の違いは、パーミッションビットを保持する最初の列で、追加の+が表示されていることです。

ACLの詳細を把握するために、getfacl Roadmapコマンドを実行してみます。

# file: Roadmap
# owner: tux
# group: project3
user::rw-
user:jane:rw-       effective: r--
group::r--
group:djungle:rw-   effective: r--
mask::r--
other::---

出力のうち最初の3行は、ls -lコマンドから得られるのと同じ情報であり、独自の情報はありません。これらの行は、ファイル名、所有者、および所有グループだけを示しています。4行目から9行目は、ACLエントリを保持しています。従来のアクセス権は、ACLを使用したときに利用可能になる属性の一部だけを表すことになります。上記のサンプルにおけるACLは、ファイルの所有者およびユーザjaneに対して読み取りと書き込みのアクセス権を許可しています(4行目と5行目)。従来の概念が拡張されて、追加ユーザによるアクセスを許可するようになりました。同じことは、グループアクセスを扱う際にも適用されます。所有グループは読み取りアクセス権(6行目)を保持し、djungleグループは読み取りと書き込みのアクセス権を保持しています。8行目のmaskエントリは、ユーザjanedjungleグループの有効なアクセス権を減らして、読み取りアクセスのみにしています。他のユーザとグループは、このファイルに対して、アクセス権を何も持っていません(9行目)。

ここまでで、ごく基本的な情報だけを紹介しました。ACLについての詳細は、章 24. Linuxのアクセス制御リストを参照してください。