Linux の 101 試験対策: ファイルのパーミッションと所有権の管理

ファイルに適切なセキュリティーを設定する

Linux® ファイルシステムでのファイルの所有権とパーミッションを管理する方法を学んでください。この記事では、suid、sgid、スティッキー・ビットなどのアクセス・モードについて解説し、これらの機能を使用してセキュリティーを強化する方法を説明します。この記事の内容は、Linux のシステム管理者として認定するための LPI 101 試験に備えるためにも、ファイルの所有権、パーミッション、セキュリティーについて学ぶ上でも役立ちます。

Ian Shields, Senior Programmer, IBM

Ian ShieldsIan Shields は、developerWorks Linux ゾーンの様々な Linux プロジェクトに関わっています。彼はノースキャロライナ州 Research Triangle Park にある IBM のシニア・プログラマーです。1973年にオーストラリアのキャンベラでシステム・エンジニアとして IBM に入社して以来、カナダのモントリオールやノースキャロライナ州 Research Triangle Park で、コミュニケーション・システムやパーベイシブ・コンピューティングに携わってきました。彼はいくつかの特許を保持しています。Australian National University にて純粋数学および哲学で学位を取得し、また North Carolina State University にてコンピューター・サイエンスで修士号と博士号を取得しています。Ian について詳しく知るには、My developerWorks で彼のプロフィールを見てください。


developerWorks 貢献著者レベル

2010年 11月 30日

この連載について

この連載は Linux システム管理タスクの学習に役立つだけでなく、LPIC-1 (Linux Professional Institute Certification レベル 1) 試験に備えるための教材にもなります。

連載の各記事についての説明とリンクについては、developerWorks の LPIC-1 ロードマップを参照してください。現在進行中のこのロードマップは、LPIC-1 試験の最新の目標 (2009年 4月) を反映しています。完成した記事はその都度ロードマップに追加されていきますが、当面は developerWorks の LPI 認定試験対策チュートリアルで同様の教材の以前のバージョンを調べてください。これらのバージョンは、2009年 4月より前の LPIC-1 目標に対応しています。

概要

この記事では、ファイルとディレクトリーのパーミッションと所有権を正しく使用して、ファイル・アクセスを制御する方法を学びます。この記事で説明する内容は以下のとおりです。

  • 通常のファイルと特殊なファイル、ならびにディレクトリーへのアクセス権を管理する方法
  • suid や sgid、スティッキー・ビットなどのアクセス・モードを使用してセキュリティーを維持する方法
  • ファイル作成マスクを変更する方法
  • ファイルへのアクセス権をグループ・メンバーに付与する方法

特に断りのない限り、記事に記載する例では、カーネル 2.6.34 を搭載した Fedora 13 を使用しています。他のシステムでは、結果が異なる場合もあります。

この記事は、Linux Professional Institute の Junior Level Administration (LPIC-1) 101 試験の主題 104 の目標 104.5 の試験対策となります。この目標の重要度は 3 です。

この記事で説明するファイルおよびグループ所有権の概念については、前回の記事「Linux の 101 試験対策: ディスク・クォータの管理」でも一部取り上げました。今回の記事を読むことで、これらの概念をより完全に理解できるようになるはずです。

前提条件

この連載の記事を最大限に活用するには、Linux の基礎知識と、記事に記載されたコマンドを演習できる実際の Linux システムが必要です。プログラムのバージョンによって出力のフォーマットに違いが出てくる場合もあるため、コマンドの実行結果は必ずしもここに記載するリストや図とまったく同じであるとは限りません。


ユーザーおよびグループ

Ian とつながるには

Ian は developerWorks で人気の高いお馴染みの著者の 1 人です。Ian が書いたすべての developerWorks 記事を閲覧してみてください。また、My developerWorks では、Ian のプロフィールを調べることや、彼やその他の著者、そして他の読者とつながることができます。

読者の皆さんは今までの連載を読んで、Linux がマルチユーザー・システムであること、各ユーザーは 1 つのプライマリー・グループに属し、場合によっては別のグループにも属すること、そしてあるユーザーとしてログインした後に、su または sudo -s コマンドを使って別のユーザーになれることもご存知のはずです。Linux でのファイルの所有権およびファイルへのアクセス権はユーザー ID とグループに密接に関係するので、まずはユーザーとグループについての基本的な情報を見直すところから始めます。

どのユーザーになっているかを確認する

別のユーザーにならない限り、ユーザー ID はログインしたときに使用した ID のまま変わりません。別のユーザーになると、この記事のほとんどの例がそうであるように、プロンプトにユーザー ID が含まれることがあります。プロンプトにユーザー ID が含まれていない場合、現在有効な ID を確かめるには、whoami コマンドを使用することができます。リスト 1 に、(PS1 環境変数からの) プロンプト・ストリングがこの記事の他の例とは異なる場合の例を記載します。ユーザー ID をプロンプト・ストリングに組み込ませることができる機能は、役に立つはずです。

リスト 1. 有効なユーザー ID の判別
/home/ian$ whoami
tom
/home/ian$ exit
exit
$ whoami
ian

所属するグループを確認する

同じように、自分が属するグループを確認するには groups コマンドを使用することができます。id コマンドを使用すると、ユーザーとグループ両方の情報を調べることができます。groups または id コマンドのいずれにしても、ユーザー ID をパラメーターとして追加することで、カレント・ユーザーに関する情報ではなく、パラメーターとして追加したユーザー ID に関する情報を確認することができます。リスト 2 に、いくつかの例を記載します。ユーザー ID が指定されていない id コマンドは、SELinux のコンテキストと基本 ID 情報も表示することに注意してください。

リスト 2. グループ・メンバーシップの判別
[ian@echidna ~]$ id
uid=1000(ian) gid=1000(ian) groups=1000(ian),505(development),8093(editor)
context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[ian@echidna ~]$ id ian
uid=1000(ian) gid=1000(ian) groups=1000(ian),8093(editor),505(development)
[ian@echidna ~]$ groups
ian development editor
[ian@echidna ~]$ id tom
uid=1012(tom) gid=1012(tom) groups=1012(tom),505(development)
[ian@echidna ~]$ groups tom
tom : tom development
[ian@echidna ~]$ su tom
Password: 
[tom@echidna ian]$ groups
tom development
[tom@echidna ian]$ groups ian
ian : ian editor development

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

すべてのユーザーが ID を持ち、1 つのプライマリー・グループのメンバーとなっているように、Linux システム上のすべてのファイルには 1 人の所有者と 1 つのグループが関連付けられます。

通常のファイル

ファイルの所有者とグループを表示するには、ls -l コマンドを使用します。

リスト 3. ファイル所有権の判別
[ian@echidna ~]$ ls -l /bin/bash .bashrc helloworld.C 
-rw-r--r--. 1 ian  ian            124 Mar 31  2010 .bashrc
-rwxr-xr-x. 1 root root        943360 May 21  2010 /bin/bash
-rw-rw-r--. 1 ian  development    116 Nov 30 10:21 helloworld.C

この特定の例では、ユーザー ian の .bashrc ファイルはユーザー ian 自身が所有していて、このユーザーのプライマリー・グループである ian グループに属します。/bin/bash ファイルについても同じように、このファイルを所有しているのはユーザー root で、ファイルが属するグループは root です。一方、helloworld.C はユーザー ian が所有していますが、このファイルが属するグループは development となっています。ユーザー名とグループ名は別々の名前空間にあるため、1 つの名前がユーザー名とグループ名の両方になっている場合があります。実際、多くのディストリビューションでは、新しいユーザーごとに同じ名前のグループを作成するようにデフォルト設定されています。

Linux のパーミッション・モデルには、ファイルシステム・オブジェクトごとに3 つのタイプのパーミッションがあります。3 つのタイプとは、読み取り権限 (r)、書き込み権限 (w)、実行権限 (x) です。書き込み権限には、オブジェクトを変更、削除する権限も含まれます。さらに、これらのパーミッションはファイルの所有者、ファイルが属するグループのメンバー、そしてその他すべてのユーザーに対して個別に指定されます。

リスト 3 に示されている、コマンドの実行結果の先頭の列をもう一度見てみると、この列には 11 文字からなるストリングが示されています。11 番目の文字は最近追加されたもので、これについては後で説明します。このストリングの先頭文字が示すのは、オブジェクトのタイプです (この例では、通常のファイルを示す「-」)。これに続く 9 文字は、3 文字 1 組で 3 つのグループを表します。最初のグループでは、それぞれの文字がファイル所有者に対する読み取り権限、書き込み権限、および実行権限を示します。「-」となっている場合は、対応する権限が付与されていないことを意味します。したがって、ユーザー ian は .bashrc ファイルを読み取ったり、書き込んだりすることはできても、実行することはできません。root は、/bin/bash ファイルの読み取り、書き込み、実行操作をすべて行えます。2 番目のグループと 3 番目のグループがそれぞれ示すのは、ファイルのグループ、その他すべてのユーザーに対する読み取り権限、書き込み権限、実行権限です。したがって、development グループのメンバーは ian の helloworld.C ファイルに対して読み取りや書き込みをすることができる一方、その他すべてのユーザーはこのファイルを読み取ることしかできません。同様に、root グループのメンバーとその他すべてのユーザーには /bin/bash ファイルの読み取り、または実行が許可されるということになります。

ディレクトリー

ディレクトリーは通常のファイルと同じパーミッション・フラグを使用しますが、それらの解釈は異なります。ディレクトリーの場合の読み取り権限は、読み取り権限を持つユーザーに対してディレクトリーの内容を一覧表示することを許可するということであり、書き込み権限は書き込み権限を持つユーザーに、そのディレクトリー内でのファイルの作成、削除を許可するということです。さらに、実行権限を与えられたユーザーは、ディレクトリーに入って任意のサブディレクトリーにアクセスすることができます。実行権限が与えられていなければ、ディレクトリー内のファイルシステム・オブジェクトにアクセスすることはできません。読み取り権限が与えられていない場合、ディレクトリー内のファイルシステム・オブジェクトはディレクトリー・リストに表示されませんが、それでもディスク上でのオブジェクトのフル・パスを知っている限りは、オブジェクトにアクセスすることができます。リスト 4 の例はかなり不自然ですが、以上の要点を説明するためのものです。

リスト 4. パーミッションとディレクトリー
[ian@echidna ~]$ ls -l /home
total 32
drwxr-x---. 38 editor   editor      12288 Nov 30 10:49 editor
drwxr-x---.  4 greg     development  4096 Nov 30 12:44 greg
drwx------. 21 gretchen gretchen     4096 Nov 30 11:26 gretchen
drwxr-xr-x. 41 ian      ian          4096 Nov 30 10:51 ian
drwx------. 21 ianadmin ianadmin     4096 May 28  2010 ianadmin
d-wx--x--x. 21 tom      tom          4096 Nov 30 11:30 tom
[ian@echidna ~]$ ls -a ~greg/.ba*
/home/greg/.bash_history  /home/greg/.bash_profile
/home/greg/.bash_logout   /home/greg/.bashrc
[ian@echidna ~]$ ls -a ~gretchen
ls: cannot open directory /home/gretchen: Permission denied
[ian@echidna ~]$ ls -a ~tom
ls: cannot open directory /home/tom: Permission denied
[ian@echidna ~]$ head -n 3 ~tom/.bashrc
# .bashrc

# Source global definitions

ディレクトリー・リストの先頭文字はオブジェクトのタイプを示します (「d」はディレクトリーを意味します)。ユーザー greg のホーム・ディレクトリーでは、development グループのメンバーに対して読み取り権限と実行権限が設定されているので、ユーザー tom および ian はディレクトリーを一覧表示することができます。ユーザー gretchen のホーム・ディレクトリーの場合、gretchen グループとその他のユーザーに対しては読み取り権限も、実行権限も設定されていないため、ユーザー ian はこのディレクトリーにアクセスすることはできません。ユーザー tom のホーム・ディレクトリーには実行権限が設定されている一方、読み取り権限は設定されていないため、ユーザー ian はディレクトリーの内容を一覧表示することができませんが、ディレクトリー内のオブジェクトが存在していることがわかっていれば、そのオブジェクトにアクセスすることができます。

その他のファイルシステム・オブジェクト

ls -l コマンドによる出力には、リストの先頭文字でファイルとディレクトリー以外のファイルシステム・オブジェクトが示される場合があります。これらのオブジェクトについては後で詳しく説明するとして、とりあえずは以下のオブジェクト・タイプもあることを覚えておいてください。

表 1. ファイルシステムのオブジェクト・タイプ
コードオブジェクト・タイプ
-通常のファイル
dディレクトリー
lシンボリック・リンク
c文字型特殊デバイス
bブロック型特殊デバイス
pFIFO
sソケット

11 番目の文字

ls コマンドによって出力されるディレクトリー・リストの 11 番目の文字は、最近行われた機能拡張です。そのため、ディストリビューションによってはまだ最初の 10 文字しかない場合もあります。あるいは 11 番目の文字がスペースとなっている場合もあるので、この文字に気付かないかもしれませんが、この文字は代替アクセス・メソッドがファイルに適用されるかどうかを指定する文字です。ファイル・モードに続く文字がスペースの場合、代替アクセス・メソッドはありません。これが表示文字になっている場合は、代替アクセス・メソッドがあります。代替アクセス・メソッドとしては、例えばアクセス制御リストなどが考えられます。GNU の ls では、ファイルに SELinux のセキュリティー・コンテキストしかないことを示すために、「.」(ドット) 文字を使用します。SELinux のセキュリティー・コンテキスト以外の代替アクセス・メソッドの組み合わせを持つファイルは、「+」(プラス) 文字で示されます。


パーミッションの変更

アクセス権を追加する

例えば、「Hello world」シェル・スクリプトを作成するとします。通常、スクリプトを最初に作成した時点では、スクリプトを実行することはできません。実行権限を追加するには、+x オプションを指定した chmod コマンドを使用します (リスト 5 を参照)。

リスト 5. 実行可能なシェル・スクリプトの作成
[ian@echidna ~]$ echo 'echo "Hello world!"'>hello.sh
[ian@echidna ~]$ ls -l hello.sh
-rw-rw-r--. 1 ian ian 20 Nov 30 13:05 hello.sh
[ian@echidna ~]$ ./hello.sh
bash: ./hello.sh: Permission denied
[ian@echidna ~]$ chmod +x hello.sh
[ian@echidna ~]$ ./hello.sh
Hello world!
[ian@echidna ~]$ ls -l hello.sh
-rwxrwxr-x. 1 ian ian 20 Nov 30 13:05 hello.sh

同じように、読み取り権限または書き込み権限を設定するにはそれぞれ +r+w を使用します。実際、rw、および x は任意の組み合わせで使用することができます。例えば chmod +rwx のように組み合わせると、読み取り権限、書き込み権限、実行権限のすべてがファイルに設定されます。このような形の chmod は、まだ設定されていないアクセス権を追加します。

選択的にアクセス権を追加する

お気付きかもしれませんが、上記の例では、書き込み権限が所有者、グループ、さらにその他のユーザーに対して設定されます。それよりも選択的にアクセス権を追加するには、追加する対象をユーザーに設定する u、グループに設定する g、その他のユーザーに設定する o を使用したモード表現のプレフィックスを使用することができます。a を指定するとすべてのユーザーにアクセス権が設定されます。これは、モード表現を省略した場合と同じです。リスト 6 に、別のシェル・スクリプトに対する書き込み権限と実行権限をユーザーとグループに追加する方法を記載します。

リスト 6. アクセス権の選択的追加
[ian@echidna ~]$ echo 'echo "Hello world!"'>hello2.sh
[ian@echidna ~]$ chmod ug+xw hello2.sh
[ian@echidna ~]$ ls -l hello2.sh
-rwxrwxr--. 1 ian ian 20 Nov 30 13:08 hello2.sh

アクセス権を削除する

アクセス権を追加するのではなく、削除しなければならない場合もあります。それには + に変えるだけで、設定されているアクセス権のうち、任意のアクセス権を指定して削除することができます。リスト 7 は、2 つのシェル・スクリプトに設定されたその他のユーザーのすべてのアクセス権を削除する例です。

リスト 7. アクセス権の削除
[ian@echidna ~]$ ls -l hello*.sh
-rwxrwxr--. 1 ian ian 20 Nov 30 13:08 hello2.sh
-rwxrwxr-x. 1 ian ian 20 Nov 30 13:05 hello.sh
[ian@echidna ~]$ chmod o-xrw hello*.sh
[ian@echidna ~]$ ls -l hello*.sh
-rwxrwx---. 1 ian ian 20 Nov 30 13:08 hello2.sh
-rwxrwx---. 1 ian ian 20 Nov 30 13:05 hello.sh

一度に複数のファイルでのパーミッションを変更できることに注意してください。主題 103 を対象とした記事で紹介したいくつかのコマンドと同様、-R (または --recursive) オプションを使用して、ディレクトリーおよびファイルに対して再帰的な操作をすることも可能です。

パーミッションの設定

アクセス権を追加、削除することができるようになったところで、読者の皆さんは、特定のアクセス権一式を設定する方法を考えていることでしょう。それには、+ の代わりに = を使用します。上記のスクリプトに対してその他のユーザーがまったくアクセス権を持たないように設定するには、アクセス権を削除する場合に使用したコマンドではなく、chmod o= hello* を使用することができます。

ユーザー、グループ、その他のユーザーごとに異なるパーミッションを設定する場合には、例えば ug=rwx,o=rx のように、それぞれの式をカンマで区切ります。あるいは、次に説明するように、数値表記のパーミッションを使用することもできます。

8 進数表記によるパーミッション

これまでのところ、シンボル (ugoa や rxw) を使ってパーミッションを指定してきました。各グループに設定できるパーミッションは 3 つありますが、シンボルの代わりに 8 進数を使用してこれらのパーミッションを設定することもできます。8 進数で設定するパーミッションは、最大 4 桁の 8 進数字を使用します。先頭の桁は属性について検討するときに説明するとして、2 番目の桁はユーザーのパーミッション、3 番目の桁はグループのパーミッション、4 番目の桁はその他のユーザーのパーミッションを定義します。この 3 桁に、それぞれ目的とするパーミッション設定、つまり読み取り (4)、書き込み (2)、実行 (1) を追加していきます。リスト 5 に記載した hello.sh の例では、作成したスクリプトに設定されたパーミッションは -rw-r--r-- でした。これに対応する 8 進数 は 644 です。すべてのユーザーに実行権限を設定したことで、モードは 755 に変更されています。

同じパーミッションをグループごとに設定するのではなく、すべてのパーミッションを一度にまとめて設定したいとしたら、数値表記のパーミッションは非常に便利な方法となります。8 進数表記のパーミッションを使用する場合には、表 2 をクイック・リファレンスとして利用してください。

表 2. 数値表記のパーミッション
シンボル8 進数
rwx7
rw-6
r-x5
r--4
-wx3
-w-2
--x1
---0

アクセス・モード

ユーザーがログインすると、そのユーザーのユーザー ID とグループ ID を使って新しいシェル・プロセスが実行されます。そのユーザーがシステム上の各ファイルへアクセスできるかどうかは、これらの ID に基づいて制御されます。つまり通常は、他のユーザーに属するファイルや、システム・ファイルにはアクセスできないということです。実際にユーザーが処理を実行する際には、完全に他のプログラムに委ねられます。ユーザーが開始したプログラムは、そのユーザーのユーザー ID を引き継ぐことになるため、それらのプログラムは、ユーザーがアクセス権を与えられていないファイルシステム・オブジェクトには一切アクセスすることができません。

その重要な例は、/etc/passwd ファイルです。このファイルの書き込み権限は root に対してのみ有効にされるため、一般ユーザーが直接変更することはできません。けれども、一般ユーザーがそのパスワードを変更しなければならない場合には、何らかの方法で /etc/passwd を変更できるようにしなければなりません。このファイルをユーザーが変更できないとしたら、他にどのような方法があるでしょうか?

suid と sgid

Linux のパーミッション・モデルには、suid (Set User ID) と sgid (Set Group ID) という特殊なアクセス・モードがあります。実行可能プログラムに suid アクセス・モードが設定されている場合、このプログラムは実際にそれを開始したユーザーではなく、ファイルの所有者によって開始されたかのように動作します。同様に、sgid アクセス・モードが設定されている場合には、そのプログラムを開始したユーザーがそのユーザー自身のグループではなく、ファイルのグループに属しているかのように、プログラムが動作します。この 2 つのアクセス・モードは、いずれか一方でも、あるいは両方一緒にでも設定することができます。

リスト 8 には、実行可能ファイル passwd が root によって所有されていることが示されています。

リスト 8. /usr/bin/passwd での suid アクセス・モード
[ian@echidna ~]$ ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 34368 Apr  6  2010 /usr/bin/passwd

ユーザーのパーミッション・トリプレットで、x の代わりに s が示されていることに注目してください。これは、この特定のプログラムに、suid ビットと実行可能ビットが設定されていることを意味します。したがって passwd を実行すると、実際にこれを実行したユーザーによって起動されたのではなく、スーパーユーザーのフル・アクセス権を持つ root ユーザーによって起動されたかのように実行されることになります。passwdroot 権限で実行されていれば、/etc/passwd を変更することが可能です。

suid ビットと sgid ビットは、ディレクトリー・リストのユーザーとグループに対する x ビットと同じ位置に示されます。ファイルが実行可能であり、suid または sgid ビットが設定されている場合、これらのビットは小文字の s で表示され、そうでなければ大文字の S で表示されます。

suid と sgid は便利な機能で、さまざまな状況で必要になります。しかし、不適切な使い方をすると、これらのアクセス・モードによってシステムのセキュリティーが侵害される恐れがあります。したがって、suid を設定するプログラムの数はできる限り少なくなるようにしてください。passwd コマンドは、suid を設定しなければならない数少ないプログラムのうちの 1 つです。

suid と sgid を設定する

suid および sgid ビットをシンボルでセット、リセットするには、文字 s を使用します。例えば、u+s とすると suid アクセス・モードが設定され、g-s とすると sgid モードが解除されます。8 進数表記では、suid の場合は最初の (最上位) 桁の値が 4 に設定され、sgid の場合は 2 に設定されます。

ディレクトリーと sgid

sgid モードが有効にされたディレクトリーでは、そのディレクトリー内に作成されるファイルまたはディレクトリーのすべてが、そのディレクトリーのグループ ID を継承します。このモードは、同じプロジェクトに取り組んでいる人たちが使用するディレクトリー・ツリーには、特に有効です。リスト 9 には、ユーザー greg が development グループのすべてのユーザーが使用できるディレクトリーをセットアップする方法と併せて、ユーザー gretchen がそのディレクトリー内にファイルを作成する方法の一例を記載します。作成された gretchen.txt ファイルはグループのメンバー全員が書き込める状態になっているため、gretchen は chmod g-w を使用してグループのメンバーが書き込みできないように設定します。

リスト 9. sgid アクセス・モードとディレクトリー
[greg@echidna ~]$ mkdir lpi101
[greg@echidna ~]$ chmod g+ws lpi101
[greg@echidna ~]$ ls -ld lpi101
drwxrwsr-x. 2 greg development 4096 Nov 30 13:30 lpi101/
[greg@echidna ~]$ su - gretchen
Password: 
[gretchen@echidna ~]$ touch ~greg/lpi101/gretchen.txt
[gretchen@echidna ~]$ ls -l ~greg/lpi101/gretchen.txt
-rw-rw-r--. 1 gretchen development 0 Nov 30 14:12 /home/greg/lpi101/gretchen.txt
[gretchen@echidna ~]$ chmod g-w ~greg/lpi101/gretchen.txt
[gretchen@echidna ~]$ ls -l ~greg/lpi101/gretchen.txt
-rw-r--r--. 1 gretchen development 0 Nov 30 14:12 /home/greg/lpi101/gretchen.txt

これで、development グループのすべてのメンバーがユーザー greg の lpi101 ディレクトリー内にファイルを作成できるようになりました。リスト 10 に示すように、ユーザー gretchen 以外のグループ・メンバーは gretchen.txt ファイルを更新することができませんが、ディレクトリーに対する書き込み権限は設定されているので、ファイルを削除することはできます。

リスト 10. sgid アクセス・モードとファイル所有者
[gretchen@echidna ~]$ su - tom
Password: 
[tom@echidna ~]$ echo "something" > ~greg/lpi101/gretchen.txt
-bash: /home/greg/lpi101/gretchen.txt: Permission denied
[tom@echidna ~]$ rm ~greg/lpi101/gretchen.txt
rm: remove write-protected regular empty file `/home/greg/lpi101/gretchen.txt'? y
[tom@echidna ~]$ ls -l ~greg/lpi101/
total 0

スティッキー・ビット

上記の例で説明したように、ディレクトリーに対する書き込み権限を持つユーザーはすべて、そのディレクトリー内に含まれるファイルを削除することができます。これはグループで作業するプロジェクトには好ましいかもしれませんが、/tmp ディレクトリーなどの全体で共有されるファイル空間には望ましいことではありません。幸い、そのためのソリューションがあります。

アクセス・モードには、スティッキー・ビットと呼ばれるもう 1 つのビットがあります。スティッキー・ビットはシンボルでは t として示され、数値では 8 進数の最上位桁に 1 として示されます。ディレクトリー・リストでは、その他のユーザーの実行可能フラグの場所 (最後の文字) に表示され、大文字と小文字の意味は suid と sgid の場合と同じです。スティッキー・ビットがディレクトリーに設定されている場合、そのディレクトリー内のファイルを削除またはリンク設定を解除できるのは、ディレクトリーの所有者であるユーザーまたはスーパーユーザー (root) に限られます。リスト 11 に、ユーザー greg が彼の所有する lpi101 ディレクトリーにスティッキー・ビットを設定する例、ならびにこのビットを /tmp に設定する例を記載します。

リスト 11. スティッキー・ディレクトリー
[greg@echidna ~]$ chmod +t lpi101
[greg@echidna ~]$ ls -ld lpi101 /tmp
drwxrwsr-t.  2 greg development  4096 Nov 30 14:16 lpi101
drwxrwxrwt. 24 root root        12288 Nov 30 14:22 /tmp

かつて UNIX® システムでは、実行可能ファイルをスワップ空間に保管して再ロードを回避するために、ファイルにスティッキー・ビットを設定していました。最近の Linux カーネルでは、ファイルにスティッキー・ビットが設定されていても、これを無視することに注意してください。

アクセス・モードの要約

表 3 に、以上で説明した 3 つのアクセス・モードのシンボルによる表記と 8 進数による表記をまとめます。

表 3. アクセス・モード
アクセス・モードシンボル8 進数
suidsu4000
sgidsg2000
スティッキーt1000

上記のリストと前のパーミッションに関する情報を考え併せると、greg の lpi101 ディレクトリーに設定されたパーミッションとアクセス・モード drwxrwsr-t に対応する完全な 8 進数表記は、3775 であることがわかるはずです。ls コマンドは 8 進数表記のパーミッションを表示しませんが、find コマンドを使用すると表示することができます (リスト 12 を参照)。

リスト 12. シンボルおよび 8 進数表記によるパーミッションの出力
[greg@echidna ~]$ find . -name lpi101  -printf "%M %m %f\n"
drwxrwsr-t 3775 lpi101

不変ファイル

アクセス・モードとパーミッションによって、ファイルとディレクトリーに対して誰が何の操作を実行できるかを詳細に制御することができますが、それでも root ユーザーが不注意にファイルを削除してしまうなどの事態を防ぐことにはなりません。LPI の主題 104.5 の範囲ではありませんが、さまざまなファイルシステムでさらにアクセスを制御するための属性は他にもあります。そのうちの 1 つは、不変属性です。この属性を設定すると、root でさえも属性が設定解除されるまではファイルを削除できなくなります。

ファイルまたはディレクトリーに不変フラグ (またはその他すべての属性) が設定されているかどうかを調べるには、lsattr コマンドを使用します。-i フラグを設定した chattr コマンドを使用すると、ファイルが不変ファイルになります。

リスト 13 に示されているように、root ユーザーは不変ファイルを作成することができますが、不変フラグが削除されるまでは、そのファイルを削除することはできません。

リスト 13. 不変ファイル
[root@echidna ~]# touch keep.me
[root@echidna ~]# chattr +i keep.me
[root@echidna ~]# lsattr keep.me
----i--------e- keep.me
[root@echidna ~]# rm -f keep.me
rm: cannot remove `keep.me': Operation not permitted
[root@echidna ~]# chattr -i keep.me
[root@echidna ~]# rm -f keep.me

不変フラグを変更するには、root 権限が必要です。あるいは少なくとも、CAP_LINUX_IMMUTABLE ケーパビリティーがなければなりません。セキュリティーまたは侵入検知に対する取り組みの一環として、ファイルを不変にすることはよくあります。詳細については、ケーパビリティーの man ページ (man capabilities) を参照してください。


ファイル作成マスク

新しくファイルが作成されるときに、その新規ファイルに設定するパーミッションを指定するのは、作成プロセスです。大抵の場合、モードには 0666 が要求されます。このモードでは、任意のユーザーがファイルの読み取り、書き込み操作を行うことができます。ディレクトリーは、一般にデフォルトで 0777 に設定されます。ただし、このように寛大にアクセスを許可したファイル/ディレクトリーの作成は、umask 値によって制御されます。umask 値は、新しく作成するファイルまたはディレクトリーに自動的にアクセス権を付与したくない場合に指定します。システムは umask の値を使用して、最初に要求されたパーミッションに対し、付与するアクセス権の範囲を狭めます。umask の設定は、umask コマンドで表示することができます (リスト 14 を参照)。

リスト 14. 8 進 umask 値の表示
[ian@echidna ~]$ umask
0002

umask が指定するのは、付与すべきでないアクセス権であることに注意してください。ユーザーが専用グループを持たない Linux システムでは、umask は通常 0022 にデフォルト設定され、新規ファイルからグループおよびその他のユーザーの書き込み権限を削除します。ユーザーが専用グループを持つ場合 (この記事の例で使用している Fedora システムなどの場合) には、umask は 0002 にデフォルト設定され、その他のユーザーの書き込み権限が削除されるのが通常です。umask をシンボルで表示するには、-S を使用してください。この場合に表示されるのは、許可されているほうのアクセス権です。

umask を設定するにも、umask を表示するにも、umask コマンドを使用します。例えば、新しく作成したファイルにすべてのグループおよびその他のユーザーがアクセスできないようにして、ファイルをより個人的なものにしておきたい場合には、umask の値を 0077 に設定します。あるいは、これをシンボルで設定するには、umask u=rwx,g=,o= を使用します (リスト 15 を参照)。

リスト 15. umask の設定
[ian@echidna ~]$ umask -S
u=rwx,g=rwx,o=rx
[ian@echidna ~]$ umask u=rwx,g=,o=
[ian@echidna ~]$ umask
0077
[ian@echidna ~]$ touch newfile
[ian@echidna ~]$ ls -l newfile
-rw-------. 1 ian ian 0 Nov 30 15:40 newfile

ファイルの所有者およびグループの設定

ファイルのグループ

ファイルのグループを変更するには、chgrp コマンドにグループ名と 1 つ以上のファイル名を指定します。グループ番号を指定するのでも構いません。一般ユーザーがファイルのグループを変更する場合、指定するファイルは自分が所有するものであること、そしてそのユーザーは変更後のファイルのグループのメンバーになっていることが必須となります。root ユーザーは、ファイルをどのグループにでも変更することができます。リスト 16 に一例を記載します。

リスト 16. グループ所有権の変更
[ian@echidna ~]$ touch file{1,2}
[ian@echidna ~]$ ls -l file*
-rw-rw-r--. 1 ian ian 0 Nov 30 15:54 file1
-rw-rw-r--. 1 ian ian 0 Nov 30 15:54 file2
[ian@echidna ~]$ chgrp development file1
[ian@echidna ~]$ chgrp 505 file2
[ian@echidna ~]$ ls -l file*
-rw-rw-r--. 1 ian development 0 Nov 30 15:54 file1
-rw-rw-r--. 1 ian development 0 Nov 30 15:54 file2

この記事で取り上げた多くのコマンドと同様、chgrp には -R オプションがあります。このオプションを使うと、選択したすべてのファイルとサブディレクトリーに変更を再帰的に適用することができます。

デフォルト・グループ

アクセス・モード」のセクションでは、sgid モードをディレクトリーに設定すると、そのディレクトリーで新しく作成されるファイルは、ファイルを作成したユーザーのグループにではなく、そのディレクトリーのグループに属することになると説明しました。

newgrp コマンドを使用することで、カレント・ユーザーのプライマリー・グループを一時的に、そのユーザーがメンバーとなっている別のグループに変更することもできます。このコマンドにより、新しいシェルが作成されます。そのシェルを終了すると、ユーザーは前のグループに戻ることになります (リスト 17 を参照)。

リスト 17. newgrp による一時的なデフォルト・グループの変更
[ian@echidna ~]$ groups
ian development editor
[ian@echidna ~]$ newgrp development
[ian@echidna ~]$ groups
development ian editor
[ian@echidna ~]$ touch file3
[ian@echidna ~]$ ls -l file3
-rw-r--r--. 1 ian development 0 Nov 30 16:00 file3
[ian@echidna ~]$ exit
[ian@echidna ~]$ groups
ian development editor

ファイル所有者

root ユーザーは、chown コマンドを使ってファイルの所有権を変更することができます。最も単純な形での構文は、グループ名またはグループ ID の代わりにユーザー名または数値による ID を使用するという点を除けば、chgrp コマンドと同じです。ファイルのグループを同時に変更することもできます。それには、ユーザー名または ID の直後に、コロンとグループ名またはグループ ID を追加してください。コロンだけを追加すると、ユーザーのデフォルト・グループが使用されます。当然のことながら、-R オプションを使用すると変更が再帰的に適用されます。リスト 18 に、一例を記載します。

リスト 18. chown によるファイル所有権の変更
[ian@echidna ~]$ touch file4
[ian@echidna ~]$ su -
Password: 
[root@echidna ~]# ls -l ~ian/file4
-rw-rw-r--. 1 ian ian 0 Nov 30 16:04 /home/ian/file4
[root@echidna ~]# chown greg ~ian/file4
[root@echidna ~]# ls -l ~ian/file4
-rw-rw-r--. 1 greg ian 0 Nov 30 16:04 /home/ian/file4
[root@echidna ~]# chown tom:gretchen ~ian/file4
[root@echidna ~]# ls -l ~ian/file4
-rw-rw-r--. 1 tom gretchen 0 Nov 30 16:04 /home/ian/file4
[root@echidna ~]# chown :tom ~ian/file4
[root@echidna ~]# ls -l ~ian/file4
-rw-rw-r--. 1 tom tom 0 Nov 30 16:04 /home/ian/file4

以前の形式では、ユーザーとグループを指定するにはコロンではなく、ドットを使用していましたが、名前にドットが含まれる場合に混乱する可能性があるため、ドットの使用は推奨されません。

これで、Linux でのファイルとディレクトリーのパーミッションについての基本をすべて理解できたはずです。

参考文献

学ぶために

  • 2009年4月時点での目標に基づく LPIC-1 認定に備えるために必要な developerWorks の記事を見つけるには、developerWorks の LPIC-1 ロードマップを利用してください。
  • LPIC Program サイトで、Linux Professional Institute の 3 つの Linux システム管理資格認定レベルについて、詳しい目標、タスクのリスト、そして出題例を調べてください。特に、2009年4月時点での LPI 101 試験および LPI 102 試験の目標は要チェックです。最新の目標については、必ず LPIC Program サイトを参照してください。
  • developerWorks の連載「LPI exam prep」をすべて読んで、Linux の基礎を学び、2009年4月以前の LPI 試験の目標に基づくシステム管理者認定試験に備えてください。
  • GNU Coreutils マニュアルの「Directory listing」の章で、ディレクトリーのリストを構成する要素について説明しています。
  • The Linux Documentation Project には、HOWTO 文書をはじめ、各種の有益な文書が豊富に揃っています。
  • developerWorks Linux ゾーンで、Linux 開発者および管理者向けのハウツー記事とチュートリアル、そしてダウンロード、ディスカッション、フォーラムなど、豊富に揃った資料を探してください。
  • さまざまな IBM 製品および IT 業界についての話題に絞った developerWorks の Technical events and webcasts で時代の流れをキャッチしてください。
  • 無料の developerWorks Live! briefing に参加して、IBM の製品およびツール、そして IT 業界の傾向を素早く学んでください。
  • developerWorks の on-demand demos で、初心者向けの製品のインストールとセットアップから、熟練開発者向けの高度な機能に至るまで、さまざまに揃ったデモを見てください。
  • Twitter で developerWorks をフォローするか、developerWorks で Linux に関するツイートのフィードに登録してください。

製品や技術を入手するために

  • ご自分に最適な方法で IBM 製品を評価してください。評価の方法としては、製品の試用版をダウンロードすることも、オンラインで製品を試してみることも、クラウド環境で製品を使用することもできます。また、SOA Sandbox では、数時間でサービス指向アーキテクチャーの実装方法を効率的に学ぶことができます。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。プロフィールで選択した情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=607103
ArticleTitle=Linux の 101 試験対策: ファイルのパーミッションと所有権の管理
publish-date=11302010