ファイル権限の管理

LinuxBeginner
オンラインで実践に進む

はじめに

この実験では、Linuxにおけるファイル権限の世界を深く掘り下げます。chowntouchchmodという3つの重要なコマンドについて学びます。これらのツールは、Linuxシステム上のファイルやディレクトリへのアクセスを管理するために不可欠です。この実験を終える頃には、ファイルの作成、所有権の変更、およびファイル権限の変更についてしっかりと理解できているはずです。これらのコマンドを理解することで、システム上のファイルに対して誰が読み取り、書き込み、実行できるかを制御できるようになります。

新しいファイルの作成

まずは touch コマンドを使って新しいファイルを作成することから始めましょう。この多機能なコマンドは、新しい空のファイルを作成したり、既存のファイルのタイムスタンプを更新したりすることができます。ファイルを「触れる(touch)」ことで、存在させたり、最後にアクセスした時間を更新したりするクイックな方法だと考えてください。

まず、正しいディレクトリにいることを確認します。ここでは project ディレクトリで作業を行います:

cd ~/project

cd コマンドは「ディレクトリの変更(change directory)」を意味します。~ 記号はホームディレクトリを表し、/project は移動先のサブディレクトリを指定しています。もし project ディレクトリが存在しない場合、このコマンドは失敗します。確信が持てない場合は、先にディレクトリを作成しておくのが一般的です。ただし、この実験環境ではディレクトリは既に存在しているはずです。

それでは、example.txt という名前の新しいファイルを作成しましょう:

touch example.txt

このコマンドは、現在のディレクトリに example.txt という空のファイルを作成します。ファイルが作成されたことを確認するには、ls コマンドを使用します:

ls

ls は「リスト(list)」を意味します。現在の場所にあるファイルやディレクトリを表示します。出力の中に example.txt が表示されているはずです。もし表示されない場合は、touch コマンドを正しく実行したか、また本当に ~/project ディレクトリにいるかどうかを再確認してください。

ファイルの所有権の変更

ファイルを作成できたので、次は所有権を変更する方法を学びましょう。chown コマンドを使うと、ファイルのユーザー所有権とグループ所有権の両方を変更できます。所有権は、誰がそのファイルを制御できるかを決定します。

まず、example.txt ファイルの現在の所有権を確認してみましょう:

ls -l example.txt

ls -l コマンド(ロングフォーマットでのリスト表示)は、権限、所有者、グループなど、ファイルに関する詳細情報を提供します。以下のような出力が表示されるはずです:

-rw-rw-r-- 1 labex labex 0 Jul 29 15:11 example.txt

この出力を分解してみましょう:

  1. -rw-rw-r-- はファイル権限を表します(詳細はステップ4で説明します)。最初の文字はファイルの種類を示します(- は通常のファイル、d はディレクトリなど)。残りの文字は、所有者、グループ、その他のユーザーに対する読み取り、書き込み、実行権限を表します。
  2. 最初の labex はファイルの現在の所有者です。これはファイルを所有しているユーザー名です。
  3. 2番目の labex はファイルの現在のグループです。グループとは、権限を共有できるユーザーの集まりです。
  4. 0 はファイルのサイズ(バイト単位)です。ファイルは空なので、サイズはゼロです。
  5. Jul 29 15:11 は最終更新日時です。
  6. example.txt はファイル名です。

それでは、ファイルの所有権を root ユーザーに変更してみましょう。root はLinuxシステムにおける管理者アカウントであり、特別な権限を持っています。

sudo chown root:root example.txt

このコマンドの動作は以下の通りです:

  • sudo はルート権限でコマンドを実行します。パスワードの入力を求められる場合があります。chown はシステムセキュリティに影響を与える強力なコマンドであるため、昇格された権限が必要です。sudo なしでは「Permission denied(権限拒否)」エラーが発生します。
  • chown は所有権を変更するためのコマンドです。
  • root:root は新しい所有者とグループを指定します(両方ともrootに設定)。構文は 所有者:グループ です。
  • example.txt は対象のファイルです。

変更を確認しましょう:

ls -l example.txt

所有者とグループの両方が root に変更されていることが確認できるはずです:

-rw-rw-r-- 1 root root 0 Jul 29 15:11 example.txt

もし root ではなく labex のまま表示される場合は、chown コマンド実行時に sudo を使用したか、パスワードを正しく入力したかを確認してください。

ディレクトリの所有権の変更

chown コマンドは、ディレクトリ全体とその中身の所有権を変更することもできます。実際に試してみましょう。これは、すべてのファイルとサブディレクトリが同じ所有者を持つようにしたい複雑なディレクトリ構造を管理する場合に特に便利です。

まず、いくつかのファイルを含む新しいディレクトリを作成します:

mkdir -p new-dir/subdir
echo "Hello, world" > new-dir/file1.txt
echo "Another file" > new-dir/subdir/file2.txt

これらのコマンドを分解します:

  • mkdir -p new-dir/subdirnew-dir ディレクトリとその中の subdir サブディレクトリを作成します。-p オプションは、必要に応じて親ディレクトリを作成するように mkdir に指示します。-p がないと、new-dir が存在しない場合に new-dir/subdir の作成は失敗します。
  • echo "Hello, world" > new-dir/file1.txtnew-dir ディレクトリ内に file1.txt という名前のファイルを作成し、そこに "Hello, world" というテキストを書き込みます。> 記号はリダイレクトに使用されます。これは echo コマンドの出力を受け取り、指定されたファイルに書き込みます。
  • echo "Another file" > new-dir/subdir/file2.txt も同様に、new-dir/subdir ディレクトリ内に file2.txt を作成し、テキストを書き込みます。

現在の所有権を確認しましょう:

ls -lR new-dir

ls -lRnew-dir の中身を再帰的にリスト表示します。-R オプション(再帰的)により、lsnew-dir 内のすべてのファイルとサブディレクトリ、およびその中身をリスト表示します。

以下のような表示になるはずです:

new-dir:
total 4
-rw-rw-r-- 1 labex labex 13 Jul 29 09:15 file1.txt
drwxrwxr-x 2 labex labex 23 Jul 29 09:15 subdir

new-dir/subdir:
total 4
-rw-rw-r-- 1 labex labex 13 Jul 29 09:15 file2.txt

ディレクトリ new-dir、そのサブディレクトリ subdir、およびファイル file1.txtfile2.txt がすべて labex によって所有されていることがわかります。

それでは、new-dir とその中身すべての所有権を root ユーザーに変更しましょう:

sudo chown -R root:root new-dir

このコマンドにおいて:

  • -R オプションは chown に対して再帰的に操作を行うよう指示し、new-dir 内のすべてのファイルとサブディレクトリの所有権を変更します。これは非常に重要です。-R がないと、new-dir ディレクトリ自体の所有権しか変更されず、その中のファイルやサブディレクトリは依然として labex が所有したままになります。

変更を確認しましょう:

ls -lR new-dir

以下のように表示されるはずです:

new-dir:
total 4
-rw-rw-r-- 1 root root 13 Jul 29 09:15 file1.txt
drwxrwxr-x 2 root root 23 Jul 29 09:15 subdir

new-dir/subdir:
total 4
-rw-rw-r-- 1 root root 13 Jul 29 09:15 file2.txt

ご覧の通り、ディレクトリとその中身すべての所有権が root に変更されました。これは、ディレクトリ構造内の所有権を一括で変更するために -R オプションがいかに強力かを示しています。

ファイルの権限の変更

Linuxでは、ファイル権限は一連の文字や数字で表されます。これらの権限を読み取り、変更する方法を探ってみましょう。権限を理解することは、ファイルを保護し、不正なアクセスを防ぐために不可欠です。

まず、example.txt ファイルの現在の権限を見てみましょう:

ls -l example.txt

以下のような表示になるはずです:

-rw-rw-r-- 1 root root 0 Jul 29 15:11 example.txt

-rw-rw-r-- の部分がファイル権限を表しています。ここで数値表記とシンボリック表記が登場します。分解してみましょう:

  • 最初の文字(-)は、これが通常のファイルであることを示します。他の一般的な指標としては、ディレクトリを表す d や、シンボリックリンクを表す l があります。
  • 次の3文字(rw-)は所有者の権限を表します(読み取りと書き込みは可能だが、実行は不可)。
    • r は読み取り権限:所有者はファイルを開いて読み取ることができます。
    • w は書き込み権限:所有者はファイルを変更できます。
    • x は実行権限:所有者はファイルを実行できます(プログラムやスクリプトの場合)。- はその権限が拒否されていることを意味します。
  • 次の3文字(rw-)はグループ用です。上記と同じ意味ですが、ファイルのグループのメンバーに適用されます。
  • 最後の3文字(r--)はその他(それ以外の全員)用です。これも同様の意味ですが、所有者でもグループメンバーでもないユーザーに適用されます。

それでは、chmod コマンドを使ってこれらの権限を変更しましょう。chmod は「モードの変更(change mode)」を意味し、これらの権限を修正できます。まずは 数値表記 から始めます。

sudo chmod 700 example.txt

このコマンドにおいて:

  • 700 は権限の数値表現です:
    • 最初の桁(7)は所有者の権限を表します。
    • 2番目の桁(0)はグループの権限を表します。
    • 3番目の桁(0)はその他の権限を表します。

各桁は0から7までの数字で、読み取り(4)、書き込み(2)、実行(1)の権限値を加算して計算されます:

  • 4: 読み取り権限
  • 2: 書き込み権限
  • 1: 実行権限
  • 0: 権限なし

したがって、7(最初の桁)は所有者に読み取り(4)、書き込み(2)、実行(1)の権限を与えます:4+2+1=7 0(2番目の桁)はグループに権限を与えません(0+0+0=0)。 0(3番目の桁)はその他に権限を与えません(0+0+0=0)。

つまり、700 は「所有者:読み取り・書き込み・実行可能。グループ:なし。その他:なし」を意味します。

変更を確認しましょう:

ls -l example.txt

以下のように表示されるはずです:

-rwx------ 1 root root 0 Jul 29 15:11 example.txt

所有者は rwx(読み取り、書き込み、実行)権限を持ち、グループとその他は権限を持たない状態になりました。

ディレクトリの権限の変更

ディレクトリの権限変更も、ファイルの場合と同様に機能します。新しいディレクトリを作成し、その権限を変更する練習をしましょう。ディレクトリ権限は、誰がディレクトリの中身をリスト表示できるか、ディレクトリ内に新しいファイルを作成できるか、ディレクトリ内のファイルにアクセスできるかを制御します。

まず、新しいディレクトリを作成し、非標準的な権限を設定します:

mkdir ~/test-dir
chmod 700 ~/test-dir

現在の権限を確認しましょう:

ls -ld ~/test-dir

ls -l-d オプションは、中身ではなくディレクトリ自体をリスト表示するように ls に指示します。-d がないと、lstest-dir の中にある ファイルやサブディレクトリをリスト表示しようとしますが、今は空です。以下のように表示されるはずです:

drwx------ 2 labex labex 4096 Jul 29 15:45 /home/labex/test-dir

先頭の d はディレクトリであることを示します。rwx------ は、所有者が読み取り、書き込み、実行権限を持ち、グループとその他は権限を持たないことを示します。ディレクトリの場合:

  • 読み取り権限(r)により、ls を使ってディレクトリの中身をリスト表示できます。
  • 書き込み権限(w)により、ディレクトリ内に新しいファイルやサブディレクトリを作成できます。
  • 実行権限(x)により、ディレクトリ内のファイルやサブディレクトリにアクセスできます(つまり、cd で中に入れます)。

それでは、権限を変更しましょう:

chmod -R 755 ~/test-dir

このコマンドにおいて:

  • -R は、すべてのファイルとサブディレクトリに対して再帰的に変更を適用します(今回はディレクトリが空ですが)。後からファイルを追加する可能性があるため、ディレクトリを扱う際は空であっても含めておくのが良い習慣です。
  • 755 は、所有者に読み取り・書き込み・実行権限を与え、グループとその他に読み取り・実行権限を与えます。

755 を分解すると:

  • 所有者 (7): 読み取り (4) + 書き込み (2) + 実行 (1) = 7
  • グループ (5): 読み取り (4) + 実行 (1) = 5
  • その他 (5): 読み取り (4) + 実行 (1) = 5

変更を確認しましょう:

ls -ld ~/test-dir

以下のように表示されるはずです:

drwxr-xr-x 2 labex labex 4096 Jul 29 15:45 /home/labex/test-dir

所有者のみがアクセス可能だった状態(700)から、所有者はフルアクセスを持ち、その他は読み取りと実行が可能(755)になったことが明確にわかります。これで、誰でも test-dir の中身をリスト表示して中のファイルにアクセスできるようになりましたが、新しいファイルの作成や既存ファイルの変更は所有者のみが行えます。

権限のシンボリック表記の使用

数値表記は簡潔ですが、特定の権限だけを変更したい場合には、シンボリック表記の方が直感的な場合があります。シンボリック表記は、ユーザー、グループ、その他を表す文字と、権限を追加または削除するための演算子を使用します。

このステップでは、小さなシェルスクリプトを作成し、それに実行権限を追加します。

まず、中身のある新しいスクリプトファイルを作成しましょう:

cd ~/project
echo '#!/bin/bash' > script.sh
echo 'echo "Hello, World"' >> script.sh

これらのコマンドは2つのことを行います:

  • 最初の echo コマンドは script.sh を作成し、最初の行 #!/bin/bash を書き込みます。この行はシバン(shebang)と呼ばれ、Linuxに対してこのスクリプトをBashで実行するように指示します。
  • 2番目の echo コマンドは >> を使ってファイルの末尾に新しい行を追加します。echo "Hello, World" を書き込み、スクリプトが実行されると Hello, World と表示されます。

ファイルに2つの別々の行が含まれていることを確認するには:

cat script.sh

以下のように表示されるはずです:

#!/bin/bash
echo "Hello, World"

次に、初期の権限を確認します:

ls -l script.sh

以下のような表示になるはずです:

-rw-rw-r-- 1 labex labex 32 Jul 29 16:30 script.sh

ご覧の通り、最初は所有者とグループに読み取り・書き込み権限があり、その他には読み取り権限しかありません。プログラムとして実行するために必要な実行権限がありません。

スクリプトを実行してみましょう:

./script.sh

スクリプトにはまだ実行権限がないため、「Permission denied(権限拒否)」エラーが表示されるはずです。./ の部分は、現在のディレクトリにあるスクリプトを実行するようにシェルに指示しています。

それでは、シンボリック表記 を使って所有者に実行権限を追加しましょう:

chmod u+x script.sh

このコマンドにおいて:

  • u はユーザー(所有者)を指します。他のオプションには、グループ用の g、その他用の o、全員(ユーザー、グループ、その他)用の a があります。
  • +x は実行権限を追加します。+ 記号は権限を追加し、- 記号は権限を削除します。

つまり、u+x は「所有者に実行権限を追加する」という意味です。

変更を確認しましょう:

ls -l script.sh

以下のように表示されるはずです:

-rwxrw-r-- 1 labex labex 32 Jul 29 16:30 script.sh

所有者が rwx(読み取り、書き込み、実行)権限を持つようになりました。

それでは、もう一度スクリプトを実行してみましょう:

./script.sh

今度は、以下の出力が表示されるはずです:

Hello, World

この例は、なぜスクリプトに実行権限を追加する必要があるのか、そして追加前と追加後の違いを明確に示しています。シンボリック表記を使えば、数値表記全体を再計算することなく、特定の権限を簡単に変更できます。

まとめ

この実験では、Linuxのファイル権限を管理するための重要なコマンドを学びました:

  1. touch を使って新しいファイルを作成し、既存のファイルを更新しました。
  2. chown を使ってファイルやディレクトリの所有権を変更する方法を学びました。これにはディレクトリ構造全体に対する再帰的な変更も含まれます。
  3. chmod を数値表記とシンボリック表記の両方で使用し、ファイルやディレクトリの権限を変更する練習をしました。所有者、グループ、その他の権限レベルの違いを理解しました。
  4. スクリプトを実行するために実行権限が必要であるなど、権限がなぜ重要なのかという実践的な例を確認しました。
  5. chmod における数値表記とシンボリック表記の違い、およびそれぞれがいつ適しているかを明確にしました。

これらのコマンドは、Linuxシステムにおいてセキュリティを維持し、アクセスを制御するために不可欠です。特に sudo を使用して権限を変更する際は、常に注意してください。誤った変更はシステムのセキュリティや機能に重大な影響を与える可能性があります。コマンドを実行する前に必ず再確認し、自分が行っている変更の意味を理解するようにしてください。