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

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

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

Ian Shields, Linux Author, Freelance

Ian ShieldsIan Shields は、Linux のフリー・ライターです。ノースカロライナ州 Research Triangle Park にある IBM を退職した彼が、オーストラリアのキャンベラにある IBM にシステム・エンジニアとして入社したのが 1973年であり、それ以降、カナダのモントリオールやノースカロナイナ州 Research Triangle Park でシステム・エンジニアリングとソフトウェア開発の両方に携わってきました。1990年代後半からは、Linux を使用して Linux 上で開発を行うとともに、Linux に関する執筆も行ってきました。彼は、オーストラリア国立大学で純粋数学および哲学の学士号を取得し、ノースカロライナ州立大学でコンピューター・サイエンスの修士号と博士号を取得しています。普段はオリエンテーリングを楽しんでおり、旅行に行くのも好きです。



2016年 4月 21日 (初版 2010年 11月 30日)

概要

より詳しく学び、さらなる開発を行い、より多くの人とつながる

新たに登場した developerWorks Premium メンバーシップ・プログラムでは、メンバーになると、強力な開発ツールのほか、Safari Books Online を通じて提供される最もホットな 500 タイトルの技術書 (Java 開発者向けのものが大量にあります) を含む各種のリソースをすべて自由に利用できるようになります。さらに、主要な開発者向けイベントの登録料の大幅な割引や、最新の O'Reilly カンファレンスの全容を閲覧できる再生動画など、その他にもさまざまな特典が提供されます。今すぐサインアップしてください。

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

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

このチュートリアルは、LPIC-1: Linux Server Professional Certification 101 試験における主題 104 の項目 104.5 に備える上で役に立ちます。この項目は、重要度が 3 とされています。

ユーザー、グループ、ファイルの所有権

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

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

この連載について

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

連載の各チュートリアルに関する説明とリンクについては、developerWorks の「Linux の 101 試験対策: LPIC-1 のロードマップ」を参照してください。現在進行中のこのロードマップは、2015年 4月 15日に更新された LPIC-1 試験の項目のバージョン 4.0 を反映しています。完成したチュートリアルは、その都度ロードマップに追加されていきます。

前提条件

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


ユーザーおよびグループ

始めに、ユーザーとグループについての基本的な情報を見直すところから始めましょう。

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

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

リスト 1. 有効なユーザー ID を判別する
[ian@attic4-cent ~]$ whoami
ian
[ian@attic4-cent ~]$ ksh -l
$ whoami
ian
$ su jenni
Password: 
[jenni@attic4-cent ian]$ whoami
jenni
[jenni@attic4-cent ian]$ echo "$PS1"
[\u@\h \W]\$ 
[jenni@attic4-cent ian]$ su - mary
Password: 
[mary@attic4-cent ~]$ whoami
mary

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

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

リスト 2. グループ・メンバーシップを判別する
[ian@attic4-cent ~]$ id
uid=1000(ian) gid=1000(ian) groups=1000(ian),1002(development),8093(editor) context=
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[ian@attic4-cent ~]$ id ian
uid=1000(ian) gid=1000(ian) groups=1000(ian),1002(development),8093(editor)
[ian@attic4-cent ~]$ groups
ian development editor
[ian@attic4-cent ~]$ id jenni
uid=1004(jenni) gid=1004(jenni) groups=1004(jenni),1002(development)
[ian@attic4-cent ~]$ groups jenni
jenni : jenni development
[ian@attic4-cent ~]$ su jenni
Password: 
[jenni@attic4-cent ian]$ groups
jenni development
[jenni@attic4-cent ian]$ groups ian
ian : ian development editor

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

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

通常のファイル

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

リスト 3. ファイル所有権を判別する
[ian@attic4-cent ~]$ ls -l /bin/bash .bashrc helloworld.C
-rw-r--r--. 1 ian  ian            124 Oct 16  2014 .bashrc
-rwxr-xr-x. 1 root root        906152 Jul 23 14:55 /bin/bash
-rw-rw-r--. 1 ian  development    116 Aug  8 21:40 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 つのグループを表しています。1 番目のグループは、ファイルの所有者に対する権限を表しており、それぞれの文字が読み取り権限、書き込み権限、実行権限を示しています。「-」となっている場合は、対応する権限が付与されていないことを意味します。従って、ユーザー ian は .bashrc ファイルに対して、読み取りと書き込みは行えますが、このファイルを実行することはできません。一方、root は /bin/bash ファイルに対して、読み取り、書き込み、実行操作をすべて行えます。2 番目のグループは、ファイルのグループに対する読み取り権限、書き込み権限、実行権限を表しており、3 番目のグループは、その他すべてのユーザーに対する読み取り権限、書き込み権限、実行権限を表しています。従って ian の helloworld.C ファイルに対し、development グループのメンバーは読み取りと書き込みを行える一方、その他すべてのユーザーは読み取りしか行えません。同様に /bin/bash ファイルに対しては、root グループのメンバーとその他すべてのユーザーは、読み取りまたは実行が許可されます。

ディレクトリー

ディレクトリーは通常のファイルと同じパーミッション・フラグを使用しますが、それらの解釈は異なります。

  • ディレクトリーの場合の読み取り権限は、読み取り権限を持つユーザーがディレクトリーの内容を一覧表示することを許可します。
  • 書き込み権限は、書き込み権限を持つユーザーがそのディレクトリー内でファイルを作成または削除できることを意味します。
  • 実行権限は、ユーザーがディレクトリーに入って任意のサブディレクトリーにアクセスすることを許可します。

ディレクトリーに対する実行権限が与えられていなければ、ディレクトリー内のファイルシステム・オブジェクトにアクセスすることはできません。ディレクトリーに対する読み取り権限が与えられていない場合、ディレクトリー内のファイルシステム・オブジェクトはディレクトリー・リストに表示されませんが、それでもディスク上でのオブジェクトのフル・パスを知っている限りは、オブジェクトにアクセスすることができます。リスト 4 の例はかなり不自然ですが、以上の点を説明するためのものです。

リスト 4. パーミッションとディレクトリー
[ian@attic4-cent ~]$ ls -l /home
total 32
drwx------.  4 chris       chris       4096 Aug  8 18:11 chris
drwx--x---.  4 development development 4096 Aug  7 16:00 development
drwxr-x---. 26 greg        development 4096 Aug  8 22:01 greg
drwx------. 42 ian         ian         4096 Aug  8 21:40 ian
drwx------. 26 ian-500     ian-500     4096 Aug  8 21:59 ian-500
drwx------. 26 jenni       jenni       4096 Aug  8 21:52 jenni
drwx------. 26 mary        mary        4096 Aug  8 21:53 mary
drwx------. 26 testuser    testuser    4096 Aug  7 22:07 testuser
[ian@attic4-cent ~]$ ls -a ~greg/.ba*
/home/greg/.bash_history  /home/greg/.bash_profile
/home/greg/.bash_logout   /home/greg/.bashrc
[ian@attic4-cent ~]$ ls -a ~jenni
ls: cannot open directory /home/jenni: Permission denied
[ian@attic4-cent ~]$ ls -a ~development
ls: cannot open directory /home/development: Permission denied
[ian@attic4-cent ~]$ head -n 3 ~development/.bashrc
# .bashrc

# Source global definitions

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

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

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

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

番目の文字

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


パーミッションの変更

アクセス権を追加する

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

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

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

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

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

リスト 6. アクセス権の選択的追加
[ian@attic4-cent ~]$ echo 'echo "Hello world!"'>hello2.sh
[ian@attic4-cent ~]$ chmod ug+xw hello2.sh
[ian@attic4-cent ~]$ ls -l hello2.sh
-rwxrwxr--. 1 ian ian 20 Aug  9 06:22 hello2.sh
[

アクセス権を削除する

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

リスト 7. アクセス権の削除
[ian@attic4-cent ~]$ ls -l hello*.sh
-rwxrwxr--. 1 ian ian 20 Aug  9 06:22 hello2.sh
-rwxrwxr-x. 1 ian ian 20 Aug  8 22:18 hello.sh
[ian@attic4-cent ~]$ chmod o-xrw hello*.sh
[ian@attic4-cent ~]$ ls -l hello*.sh
-rwxrwx---. 1 ian ian 20 Aug  9 06:22 hello2.sh
-rwxrwx---. 1 ian ian 20 Aug  8 22:18 hello.sh

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

パーミッションの設定

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

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

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

これまでのところ、シンボル (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@attic4-cent ~]$ ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 30768 Feb 22  2012 /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 グループのすべてのユーザーが使用できるディレクトリーをセットアップする方法と併せて、ユーザー jenni がそのディレクトリー内にファイルを作成する方法の一例を記載します。作成された jenni.txt ファイルはグループのメンバー全員が書き込める状態になっているため、jenni は chmod g-w を実行してグループのメンバーが書き込みできないようにしています。

リスト 9. sgid アクセス・モードとディレクトリー
[greg@attic4-cent ~]$ mkdir lpi101
[greg@attic4-cent ~]$ chmod g+ws lpi101
[greg@attic4-cent ~]$ ls -ld lpi101
drwxrwsr-x. 2 greg development 4096 Aug  9 06:43 lpi101
[greg@attic4-cent ~]$ su - jenni
Password: 
[jenni@attic4-cent ~]$ touch ~greg/lpi101/jenni.txt
[jenni@attic4-cent ~]$ ls -l ~greg/lpi101/jenni.txt
-rw-rw-r--. 1 jenni development 0 Aug  9 06:44 /home/greg/lpi101/jenni.txt
[jenni@attic4-cent ~]$ chmod g-w ~greg/lpi101/jenni.txt 
[jenni@attic4-cent ~]$ ls -l ~greg/lpi101/jenni.txt
-rw-r--r--. 1 jenni development 0 Aug  9 06:44 /home/greg/lpi101/jenni.txt

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

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

スティッキー・ビット

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

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

リスト 11. スティッキー・ディレクトリー
[greg@attic4-cent ~]$ chmod +t lpi101
[greg@attic4-cent ~]$ ls -ld lpi101 /tmp
drwxrwsr-t.  2 greg development 4096 Aug  9 06:51 lpi101
drwxrwxrwt. 42 root root        4096 Aug  9 06:53 /tmp

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

アクセス・モードの要約

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

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

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

リスト 12. シンボルおよび 8 進数表記によるパーミッションの出力
[greg@attic4-cent ~]$ 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@attic4-cent ~]# touch keep.me
[root@attic4-cent ~]# chattr +i keep.me
[root@attic4-cent ~]# lsattr keep.me
----i---------- keep.me
[root@attic4-cent ~]# rm -f keep.me
rm: cannot remove `keep.me': Operation not permitted
[root@attic4-cent ~]# chattr -i keep.me
[root@attic4-cent ~]# rm -f keep.me

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


ファイル作成マスク

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

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

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

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

リスト 15. umask の設定
[ian@attic4-cent ~]$ umask -S
u=rwx,g=rwx,o=rx
[ian@attic4-cent ~]$ umask u=rwx,g=,o=
[ian@attic4-cent ~]$ umask
0077
[ian@attic4-cent ~]$ touch newfile
[ian@attic4-cent ~]$ ls -l newfile
-rw-------. 1 ian ian 0 Aug  9 07:09 newfile

新たに作成されたファイルのデフォルト・パーミッションは 0666 であることを覚えておいてください。これらのビットのどれを削除する (マスクをオフにする) べきかは umask 値で指定するので、必要な場合には明示的に実効権限をファイルに追加しなければなりません。


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

ファイルのグループ

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

リスト 16. グループ所有権の変更
[ian@attic4-cent ~]$ touch file{1,2}
[ian@attic4-cent ~]$ ls -l file*
-rw-rw-r--. 1 ian ian 0 Aug  9 07:16 file1
-rw-rw-r--. 1 ian ian 0 Aug  9 07:16 file2
[ian@attic4-cent ~]$ chgrp development file1
[ian@attic4-cent ~]$ chgrp 1002 file2
[ian@attic4-cent ~]$ ls -l file*
-rw-rw-r--. 1 ian development 0 Aug  9 07:16 file1
-rw-rw-r--. 1 ian development 0 Aug  9 07:16 file2

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

デフォルト・グループ

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

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

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

ファイル所有者

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

リスト 18. chown によるファイル所有権の変更
[ian@attic4-cent ~]$ touch file4
[ian@attic4-cent ~]$ su -
Password: 
[root@attic4-cent ~]# ls -l ~ian/file4
-rw-rw-r--. 1 ian ian 0 Aug  9 07:27 /home/ian/file4
[root@attic4-cent ~]# chown greg ~ian/file4
[root@attic4-cent ~]# ls -l ~ian/file4
-rw-rw-r--. 1 greg ian 0 Aug  9 07:27 /home/ian/file4
[root@attic4-cent ~]# chown jenni:mary ~ian/file4
[root@attic4-cent ~]# ls -l ~ian/file4
-rw-rw-r--. 1 jenni mary 0 Aug  9 07:27 /home/ian/file4
[root@attic4-cent ~]# chown :jenni ~ian/file4
[root@attic4-cent ~]# ls -l ~ian/file4
-rw-rw-r--. 1 jenni jenni 0 Aug  9 07:27 /home/ian/file4

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

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

参考文献

学ぶために

  • developerWorks Premium のメンバーになると、強力なツールや Safari Books Online から集めて管理する技術ライブラリーをすべて自由に利用できるほか、カンファレンスの割引を受けることや、カンファレンスの記録を閲覧することができ、さらには SoftLayer や Bluemix を利用できるクレジットが提供されるなど、さまざまな特典があります。
  • 2015年 4月時点での LPI のバージョン 4.0 の試験項目に基づく LPIC-1 認定に備えて勉強するのに役立つ developerWorks のチュートリアルを見つけるには、developerWorks の LPIC-1 ロードマップを利用してください。
  • Linux Professional Institute の Web サイトで、LPIC の詳細な試験項目、課題のリスト、例題を調べてください。特に以下のページを参照してください。 必ず Linux Professional Institute の Web サイトで最新の項目を参照してください。
  • GNU Coreutils マニュアルの「Directory listing」の章で、ディレクトリーのリストを構成する要素について説明しています。
  • The Linux Documentation Project には、HOWTO 文書をはじめ、各種の有益な文書が豊富に揃っています。
  • さまざまな IBM 製品や IT 業界のトピックに焦点を絞った developerWorks テクニカル・イベントで最新の技術情報を入手してください。
  • Twitter で developerWorks をフォローしてください。

議論するために

  • developerWorks コミュニティーに参加してください。ここでは他の developerWorks ユーザーとのつながりを持てる他、開発者が主導するブログ、フォーラム、グループ、Wiki を調べることができます。

コメント

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=1030090
ArticleTitle=Linux の 101 試験対策: ファイルのパーミッションと所有権の管理
publish-date=04212016