ファイル権限の管理

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

はじめに

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

これはガイド付きの実験であり、学習と実践を助けるためのステップバイステップの指示が提供されます。各ステップを慎重に進め、ハンズオンでの経験を積んでください。これまでのデータによると、これは初心者レベルの実験で、完了率は 92%、学習者からの高評価率は 99% です。

新しいファイルの作成

まずは 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 は、root 特権でコマンドを実行します。パスワードの入力を求められる場合があります。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/subdir は、new-dir ディレクトリとその中の subdir サブディレクトリを作成します。-p オプションは、必要に応じて親ディレクトリも作成するよう mkdir に指示します。-p がないと、new-dir が存在しない場合に new-dir/subdir の作成は失敗します。
  • echo "Hello, world" > new-dir/file1.txt は、new-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 オプション(recursive)により、new-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 は読み取り(read)権限:所有者はファイルを開いて読むことができます。
    • w は書き込み(write)権限:所有者はファイルを修正できます。
    • x は実行(execute)権限:所有者はファイルを実行できます(プログラムやスクリプトの場合)。- はその権限が拒否されていることを意味します。
  • 次の 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) = 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 オプションは、ディレクトリの中身ではなく、ディレクトリ自体をリスト表示するよう指示します。-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\necho "Hello, World"' > script.sh

このコマンドは 2 つのことを行います。

  1. script.sh という名前の新しいファイルを作成します。.sh 拡張子はシェルスクリプトによく使われます。シェルスクリプトは、一連のコマンドを順番に実行する実行ファイルです。
  2. このファイルに 2 行書き込みます。
    • #!/bin/bash(シバン/シェバンと呼ばれます)は、これが bash スクリプトであることをシステムに伝えます。この行は、スクリプトの実行に使用するインタプリタを指定します。ここでは Bash インタプリタのパスである /bin/bash を指定しています。
    • echo "Hello, World" は、スクリプト実行時に "Hello, World" と表示するコマンドです。
    • \n は改行文字で、コマンドがファイル内で別々の行になるようにします。

初期権限を確認します。

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 を使用する場合は、不適切な変更がシステムのセキュリティや機能に重大な影響を及ぼす可能性があるため、常に注意を払ってください。コマンドを実行する前に必ず再確認し、自分が行っている変更の影響を理解するようにしましょう。