Linuxにおけるファイルとディレクトリの権限管理

Linuxはマルチユーザー、マルチタスクのオペレーティングシステムであり、そのセキュリティの根幹をなすのが**権限管理**です。システム管理者だけでなく一般ユーザーにとっても、この権限システムを理解し適切に設定することは、誤操作や不正アクセスを防ぎ、システムとデータの安全を確保するために不可欠です。本稿では、Linuxにおけるファイルやディレクトリのアクセス権について、その**基本概念**から**確認方法**、**変更手法**、そして**実践的な応用**までを解説します。

1. 権限とは何か?

ファイルやディレクトリといったシステムリソースに対するアクセス権限は、特定のユーザーやプロセスがそのリソースに対してどのような操作(読み取り、書き込み、実行など)を許可されているかを示すものです。Linuxでは「あらゆるものがファイルである」という理念に基づき、すべてのファイル、ディレクトリ、デバイスなどがこの権限管理の対象となります。

ユーザーは大きく分けて二種類存在します。

  • スーパーユーザー(root): システム上のあらゆるファイルや操作に対して無制限に近い権限を持つ特権ユーザーです。セキュリティ上の理由から、通常は最小限の使用に留めるべきです。
  • 一般ユーザー: スーパーユーザー以外のすべてのユーザーを指します。これらのユーザーは、自身が所有するファイルや、アクセスが許可されたファイルに対してのみ操作が可能です。

一般ユーザーが一時的にスーパーユーザーの権限でコマンドを実行したい場合は、sudoコマンドを利用します。また、suコマンドを用いることで、別のユーザー(rootを含む)としてシェルセッションを開始することも可能です。

2. なぜ権限管理が必要なのか?

もし、あなたのPC上の重要なファイルが誰でも自由に削除・変更できたり、パスワード情報のような機密データが容易にアクセスされてしまうとしたら、深刻なセキュリティリスクに晒されることになります。Linuxの権限システムは、まさにこのような問題を解決するために設計されています。各ファイルやディレクトリに「誰が何をできるか」というルールを設定することで、許可されたユーザーのみが指定された操作を行えるようにし、データの完全性と機密性を保護します。

3. 権限の構成要素:ユーザー種別とアクセス権タイプ

Linuxでは、各ファイルやディレクトリに対して、関連する三つの**ユーザー種別**と、それぞれに適用される三つの**アクセス権タイプ**が定義されています。

3.1. 三つのユーザー種別

ファイルやディレクトリに対するアクセス権は、以下の三つのユーザー種別に分けて管理されます。

  • 所有ユーザー(User / u: そのファイルやディレクトリを作成したユーザー、または現在その所有権を持つユーザーです。
  • 所有グループ(Group / g: そのファイルやディレクトリが属するグループです。複数のユーザーを一つのグループにまとめることで、チーム内でのファイル共有やアクセス管理が容易になります。
  • その他のユーザー(Others / o: 所有ユーザーでも所有グループのメンバーでもない、システム上のすべてのユーザーを指します。

これらすべてのユーザー種別をまとめて指す場合は**All / a**を使用します。

3.2. 三つのアクセス権タイプ

各ユーザー種別に対して、以下の三種類のアクセス権を付与できます。

  • 読み取り(Read / r:
    • ファイルの場合: ファイルの内容を閲覧することを許可します(例: catコマンド)。
    • ディレクトリの場合: そのディレクトリに含まれるファイルやサブディレクトリの一覧を取得することを許可します(例: lsコマンド)。
  • 書き込み(Write / w:
    • ファイルの場合: ファイルの内容を編集、追加、または削除することを許可します(例: viエディタ、echo "data" >> file)。
    • ディレクトリの場合: そのディレクトリ内でファイルやサブディレクトリの作成、削除、名前変更、移動を許可します。
  • 実行(Execute / x:
    • ファイルの場合: そのファイルをプログラムとして実行することを許可します(例: ./script.sh)。
    • ディレクトリの場合: そのディレクトリに移動すること(例: cdコマンド)、あるいはそのディレクトリ内のファイルにアクセスすることを許可します。

3.3. 権限の表記形式

アクセス権は通常、**10文字の文字列**で表現されます。最初の1文字がファイルの種類を示し、続く9文字が三つのユーザー種別(所有ユーザー、所有グループ、その他のユーザー)に対するアクセス権をそれぞれ3文字ずつで表現します。

[ファイルタイプ][所有ユーザー権限][所有グループ権限][その他のユーザー権限]

例: -rw-r--r--

  • 最初の1文字 (-): ファイルの種類を示します。
    • -: 通常のファイル
    • d: ディレクトリ
    • l: シンボリックリンク
    • b: ブロックデバイス
    • c: キャラクターデバイス
  • 続く3文字 (rw-): 所有ユーザーに対する権限です。この例では「読み取り(r)」と「書き込み(w)」が許可され、「実行(x)」は許可されていません。
  • 次の3文字 (r--): 所有グループに対する権限です。この例では「読み取り(r)」のみが許可されています。
  • 最後の3文字 (r--): その他のユーザーに対する権限です。この例では「読み取り(r)」のみが許可されています。

4. 権限の確認方法

ファイルやディレクトリの権限を確認するには、ls -lコマンド(ロングフォーマット表示)が最も一般的です。このコマンドを実行すると、権限、所有ユーザー、所有グループなどの詳細情報が表示されます。

例:

$ ls -l my_document.txt
-rw-r--r-- 1 alice staff 1024 Apr 15 10:30 my_document.txt

各フィールドの解説:

  1. -rw-r--r--: アクセス権限を表します(通常のファイル、所有ユーザーには読み書き、グループには読み取り、その他ユーザーには読み取りが許可されています)。
  2. 1: ハードリンクの数を示します。
  3. alice: ファイルの所有ユーザー名です。
  4. staff: ファイルの所有グループ名です。
  5. 1024: ファイルのサイズをバイト単位で示します。
  6. Apr 15 10:30: 最終更新日時です。
  7. my_document.txt: ファイル名です。

5. 権限の変更方法

ファイルやディレクトリのアクセス権を変更するには、chmodコマンド(change mode)を使用します。chmodには、**記号モード**と**数値モード(八進数表記)**の二種類の指定方法があり、特に数値モードは広く利用されます。

5.1. 記号モード (Symbolic Mode)

記号モードは、どのユーザー種別に、どの操作(追加、削除、設定)、どのアクセス権タイプを適用するかを直感的に指定する方法です。

構文: chmod [ユーザー種別][操作][アクセス権タイプ] <ファイルまたはディレクトリ>

  • ユーザー種別:
    • u: 所有ユーザー
    • g: 所有グループ
    • o: その他のユーザー
    • a: 全てのユーザー種別
  • 操作:
    • +: 権限を追加
    • -: 権限を削除
    • =: 指定した権限に設定(他の権限は削除される)
  • アクセス権タイプ:
    • r: 読み取り
    • w: 書き込み
    • x: 実行

使用例:

  • my_script.sh に所有ユーザーに対する実行権限を追加する:
    chmod u+x my_script.sh
    
  • confidential_data.txt から所有グループに対する書き込み権限を削除する:
    chmod g-w confidential_data.txt
    
  • public_info.html に、その他のユーザーに対して読み取り権限のみを設定する:
    chmod o=r public_info.html
    
  • 全てのユーザー種別に対して読み取り権限を追加する:
    chmod a+r shared_file.txt
    

5.2. 数値モード (Numeric Mode / 八進数表記)

数値モードでは、各アクセス権タイプに数値が割り当てられ、それらの合計値によって権限を指定します。これは、三つのユーザー種別(所有ユーザー、所有グループ、その他のユーザー)それぞれの権限を三桁の八進数で表現する方法です。

各アクセス権タイプに割り当てられる数値:

  • r (読み取り) = 4
  • w (書き込み) = 2
  • x (実行) = 1

これらの数値を組み合わせて、各ユーザー種別に対する権限を設定します。例えば、rwx4 + 2 + 1 = 7 となり、rw-4 + 2 + 0 = 6 となります。

構文: chmod [所有ユーザー権限の合計値][所有グループ権限の合計値][その他のユーザー権限の合計値] <ファイルまたはディレクトリ>

一般的な権限設定の例:

  • 755:
    • 所有ユーザー: rwx (4+2+1=7)
    • 所有グループ: r-x (4+0+1=5)
    • その他のユーザー: r-x (4+0+1=5)

    スクリプトやディレクトリによく使用され、所有者は自由に操作でき、他者は読み取りと実行のみが可能です。

  • 644:
    • 所有ユーザー: rw- (4+2+0=6)
    • 所有グループ: r-- (4+0+0=4)
    • その他のユーザー: r-- (4+0+0=4)

    一般的なファイルによく使用され、所有者は読み書きでき、他者は読み取りのみが可能です。

  • 700:
    • 所有ユーザー: rwx (4+2+1=7)
    • 所有グループ: --- (0+0+0=0)
    • その他のユーザー: --- (0+0+0=0)

    非常に機密性の高いファイルや、自分だけがアクセスしたいディレクトリに使用されます。

使用例:

  • executable_app の権限を rwxr-xr-x (755) に変更する:
    chmod 755 executable_app
    
  • my_private_dir/ ディレクトリの権限を rwx------ (700) に変更する:
    chmod 700 my_private_dir/
    

6. 所有ユーザーと所有グループの変更方法

アクセス権だけでなく、ファイルやディレクトリの**所有ユーザー**と**所有グループ**も変更することができます。これには主にchownchgrpコマンドを使用します。これらの操作は通常、root権限が必要です。

6.1. 所有ユーザーの変更: chown

chownコマンドは、ファイルやディレクトリの所有ユーザーを変更します。

構文: chown [新しい所有ユーザー[:新しい所有グループ]] <ファイルまたはディレクトリ>

このコマンドの実行には、通常スーパーユーザー権限(sudo)が必要です。

使用例:

  • system_log.txt の所有ユーザーを root に変更する:
    sudo chown root system_log.txt
    
  • project_report.docx の所有ユーザーを bob に、同時に所有グループも devs に変更する:
    sudo chown bob:devs project_report.docx
    

6.2. 所有グループの変更: chgrp

chgrpコマンドは、ファイルやディレクトリの所有グループを変更します。

構文: chgrp [新しい所有グループ] <ファイルまたはディレクトリ>

このコマンドも、通常スーパーユーザー権限(sudo)が必要です。

使用例:

  • shared_resource.dat の所有グループを administrators に変更する:
    sudo chgrp administrators shared_resource.dat
    

7. 応用的な権限管理のポイント

ここでは、権限管理におけるいくつかの重要な考慮事項や応用的なトピックについて解説します。

7.1. ディレクトリへのアクセスに必要な権限

特定のディレクトリに移動(cd)したり、そのディレクトリ内のファイルにアクセスするためには、そのディレクトリ自体に**実行(x)権限**が必要です。

  • ディレクトリのr権限: ディレクトリ内のファイル名を一覧表示する(ls)ことができます。
  • ディレクトリのw権限: ディレクトリ内でファイルやサブディレクトリを作成、削除、名前変更することができます。
  • ディレクトリのx権限: そのディレクトリを「通過」し、その中にあるファイルやサブディレクトリにアクセスすることができます。たとえディレクトリにr権限がなくても、x権限があれば、ファイル名がわかっている限りそのファイルの内容を読み取ることが可能です(ただし、lsで一覧表示はできません)。

7.2. 新規作成されるファイルとディレクトリの初期権限 (umask)

新しいファイルやディレクトリが作成された際、デフォルトで付与されるアクセス権は、umask(ユーザーマスク)設定によって決定されます。umaskは、本来付与されるべき初期権限から「削除される」権限を指定する八進数マスクです。

  • 通常のファイルの初期権限: 666 (rw-rw-rw-)
  • ディレクトリの初期権限: 777 (rwxrwxrwx)

umaskの値は、これらの初期権限から差し引かれる権限を定義します。例えば、umaskが002の場合:

  • 所有ユーザーの権限: 0
  • 所有グループの権限: 0
  • その他のユーザーの権限: 2 (書き込み権限 w に相当)

最終的な権限は、初期権限からumaskで指定された権限を「ビット単位で反転してAND演算する」ことで算出されます。
最終権限 = (初期権限) AND (NOT umask)

例: umaskが002の場合

  • ファイル: 666 (110 110 110)
    • umask 002 = --- --- -w- (000 000 010)
    • NOT umask = 111 111 101
    • 666 AND (NOT 002) = 110 110 110 AND 111 111 101 = 110 110 100 = 664 (rw-rw-r--)
  • ディレクトリ: 777 (111 111 111)
    • umask 002 = --- --- -w- (000 000 010)
    • NOT umask = 111 111 101
    • 777 AND (NOT 002) = 111 111 111 AND 111 111 101 = 111 111 101 = 775 (rwxrwxr-x)

umaskの値はumaskコマンドで確認・変更できます。

7.3. スティッキービット (Sticky Bit)

共有ディレクトリなど、複数のユーザーが書き込み権限を持つディレクトリでは、意図しないファイル削除を防ぐために**スティッキービット**が使用されます。通常、ディレクトリに書き込み権限を持つユーザーは、そのディレクトリ内のどのファイルでも削除できてしまいます。たとえ、そのファイルの所有者でなくてもです。

スティッキービットを設定すると、そのディレクトリ内のファイルやサブディレクトリは、以下の条件のいずれかを満たすユーザーのみが削除または名前変更できるようになります。

  • そのファイルやサブディレクトリの所有ユーザーである。
  • そのディレクトリの所有ユーザーである。
  • スーパーユーザー(root)である。

スティッキービットはchmodコマンドで設定できます。記号モードでは+t、数値モードでは権限の先頭に1を追加します(例: 1777)。

使用例:

  • /var/shared ディレクトリにスティッキービットを設定する:
    sudo chmod +t /var/shared
    

    または

    sudo chmod 1777 /var/shared
    

    このディレクトリの権限は drwxrwxrwt のように表示されます。

タグ: linux ファイルパーミッション chmod chown chgrp

7月31日 03:18 投稿