セキュリティの観点で、ファイルやフォルダの「権限(パーミッション)」はとても重要です。これによって、どのユーザーがファイルを読む、書く、または実行することができるかを決定できます。
Linuxにおけるパーミッションの概要は、下記の記事を参考にしてください。
>> 参考記事 :ファイルアクセス権(パーミッション)の概要Linuxでは、chmodというコマンドを使い、この「権限(パーミッション)」を設定・変更することができます。この記事では、chmodの基本から、実際の使い方まで、解説します。
chmodの基本
「権限(パーミッション)」は、ファイルやディレクトリがどのように扱われるかを決定します。具体的には、ユーザーがファイルを読んだり、書いたり、実行したりできるかどうかが、この権限によって制御されます。
この権限を変更するための主要なコマンドが「chmod」です。しかし、任意のユーザーがランダムに権限を変更できるわけではありません。実際には、ファイルの「所有者」や「スーパーユーザー」として知られる特権ユーザーだけが、chmodを使用して権限を変更できます。
chmodの構文は、下記です。
chmod [パーミッション表現] [ファイル名(もしくはディレクトリ名)]
パーミッションの表現は、「8進数表現」と「シンボリック表現」の2パターンがあります。
パーミッション表現
Linuxのファイルやディレクトリの権限を変更する方法は大きく2つに分かれます:8進数表現とシンボリック表現です。これらの方法はそれぞれ異なるアプローチを取りますが、最終的な目的は同じです。
8進数表現
8進数表現は、数字を使って直接的に権限を指定する方法です。
ファイルやディレクトリの権限は、3つの操作(読み取り、書き込み、実行)は、それぞれ r、w、x という文字で示されます。
- 読み取り(r): 読み取り権限。ファイルの内容を読むことができます。ディレクトリの場合、ディレクトリ内のファイルやサブディレクトリの一覧を表示することができます。
- 書き込み(w): 書き込み権限。ファイルの内容を変更することができます。ディレクトリの場合、ディレクトリ内にファイルやサブディレクトリを追加・削除することができます。
- 実行(x): 実行権限。ファイルを実行することができます。ディレクトリの場合、ディレクトリ内のファイルやサブディレクトリにアクセスすることができます。
この3つの操作を、数値で表現する際の基本となるのが8進数表現です。
- 読み取り(r)は 4 として数値化されます。
- 書き込み(w)は 2 として数値化されます。
- 実行(x)は 1 として数値化されます。
これらの数値を組み合わせることで、0から7までの数値を生成することができます。
例えば、読み取りと書き込みを許可(rw-)の場合は、4+2=6となります。
以下はその具体的な計算方法です:
- 読み取りのみ許可: r = 4
- 書き込みのみ許可: w = 2
- 実行のみ許可: x = 1
- 読み取りと書き込みを許可: r + w = 4 + 2 = 6
- 読み取りと実行を許可: r + x = 4 + 1 = 5
- 書き込みと実行を許可: w + x = 2 + 1 = 3
- 全ての操作を許可: r + w + x = 4 + 2 + 1 = 7
以下は8進数とそれに対応する権限の一覧です。
8進数 | 権限 | 説明 |
0 | — | すべての権限を持たない |
1 | –x | 実行権限のみ |
2 | -w- | 書き込み権限のみ |
3 | -wx | 書き込みと実行権限 |
4 | r– | 読み取り権限のみ |
5 | r-x | 読み取りと実行権限 |
6 | rw- | 読み取りと書き込み権限 |
7 | rwx | 読み取り、書き込み、実行のすべての権限 |
シンボリック表現
シンボリック表現は、文字を使用して権限を指定する方法です。この表現は、権限の対象(u, g, o, a)、操作(+,–,=)、および権限の種類(r, w, x)の3つの部分から構成されます。
権限の対象
- u (User): ファイルやディレクトリの「所有者」を指します。
- g (Group): ファイルやディレクトリの「グループ」を指します。
- o (Others): 「その他のユーザー」を意味します。これは、所有者やグループに属さないユーザーを指します。
- a (All): 「すべてのユーザー」を指します。これは、所有者、グループ、その他のユーザー全てを含みます。
操作
- +: 権限を追加します。例: u+x は、所有者に実行権限を追加します。
- –: 権限を削除します。例: g-w は、グループの書き込み権限を削除します。
- =: 権限を設定します。既存の権限は上書きされます。例: o=r は、その他のユーザーの権限を読み取りのみに設定します。
動作確認(ファイル)
それでは、chmodで、これらの権限がどのように動作するのかを、実際に確認してみます。
ユーザ名「hirotano」として、ログインしているものとします。
8進数表現による権限確認
テストファイルの準備
まず、テスト用として test_text_oct.txt という名前のテキストファイルを作成します。
hirotano@ubuntu-1:~$ echo "This is a sample text file for testing octal permissions." > test_text_oct.txt
作成されたファイルの権限を確認します。
hirotano@ubuntu-1:~$ ls -l -rw-rw-r-- 1 hirotano hirotano 58 Sep 18 13:06 test_text_oct.txt
所有者は、読み取りと書き込み権限が付与されています。
catコマンドで読み込みできることが確認できます。
hirotano@ubuntu-1:~$ cat test_text_oct.txt
This is a sample text file for testing octal permissions
ファイルの読み取り権限を削除
chmodコマンドを使い、ファイルの読み取り権限を削除します。パーミッションを200を使用して、所有者にのみ書き込み権限を設定します。
hirotano@ubuntu-1:~$ chmod 200 test_text_oct.txt hirotano@ubuntu-1:~$ ls -l --w------- 1 hirotano hirotano 58 Sep 18 13:06 test_text_oct.txt
ファイルの内容をcatコマンドで読み取ろうとすると、Permission deniedのエラーメッセージが表示されます。
hirotano@ubuntu-1:~$ cat test_text_oct.txt cat: test_text_oct.txt: Permission denied
ファイルの書き込み権限を削除
次に、chmodコマンドを使ってファイルの書き込み権限を削除します。400を使用して、所有者にのみ読み取り権限を設定します。
hirotano@ubuntu-1:~$ chmod 400 test_text_oct.txt hirotano@ubuntu-1:~$ ls -l -r-------- 1 hirotano hirotano 58 Sep 18 13:06 test_text_oct.txt
echoコマンドを使ってファイルにテキストを追加しようとすると、Permission deniedのエラーメッセージが表示されます。
hirotano@ubuntu-1:~$ echo "Trying to add this line." >> test_text_oct.txt -bash: test_text_oct.txt: Permission denied
テストスクリプトの準備
テスト用に、test_script_oct.shという名前のbashスクリプトを作成します。
hirotano@ubuntu-1:~$ echo 'echo "Hello from test_script_oct.sh!"' > test_script_oct.sh hirotano@ubuntu-1:~$ ls -l -rw-rw-r-- 1 hirotano hirotano 38 Sep 18 13:17 test_script_oct.sh
デフォルトで、所有者には、実行権限が与えられていないことが確認できます。
このスクリプトを実行すると、Permission deniedのエラーメッセージが表示されます。
ファイルの実行権限の付与
chmodコマンドを使って、スクリプトの実行権限を追加します。500を使用して、所有者に読み取りと実行の権限のみを設定します。
hirotano@ubuntu-1:~$ chmod 500 test_script_oct.sh hirotano@ubuntu-1:~$ ls -l -r-x------ 1 hirotano hirotano 38 Sep 18 13:17 test_script_oct.sh
スクリプトがエラーなく実行されることが確認できます。
hirotano@ubuntu-1:~$ ./test_script_oct.sh
Hello from test_script_oct.sh!
シンボリック表現による権限確認
テストファイルの準備
まず、テスト用として、test_text_sym.txtという名前のテキストファイルを作成します。
hirotano@ubuntu-1:~$ echo "This is a sample text file for testing symbolic permissions." > test_text_sym.txt hirotano@ubuntu-1:~$ ls -l -rw-rw-r-- 1 hirotano hirotano 61 Sep 18 13:27 test_text_sym.txt
ファイルの読み取り権限を削除
chmodコマンドを使って、所有者ファイルの読み取り権限を削除します。
hirotano@ubuntu-1:~$ chmod u-r test_text_sym.txt hirotano@ubuntu-1:~$ ls -l --w-rw-r-- 1 hirotano hirotano 61 Sep 18 13:27 test_text_sym.txt
ファイルの内容をcatコマンドで読み取ろうとすると、Permission deniedのエラーメッセージが表示されます。
hirotano@ubuntu-1:~$ cat test_text_sym.txt cat: test_text_sym.txt: Permission denied
所有者に書き込み権限を付与し、元の権限に戻します。ファイルの内容をcatコマンドで読み取ることができます。
hirotano@ubuntu-1:~$ chmod u+r test_text_sym.txt hirotano@ubuntu-1:~$ cat test_text_sym.txt This is a sample text file for testing symbolic permissions. hirotano@ubuntu-1:~$ ls -l -rw-rw-r-- 1 hirotano hirotano 61 Sep 18 13:27 test_text_sym.txt
ファイルの書き込み権限を削除
chmodコマンドを使ってファイルの書き込み権限を削除します。
hirotano@ubuntu-1:~$ chmod -w test_text_sym.txt hirotano@ubuntu-1:~$ ls -l -r--r--r-- 1 hirotano hirotano 61 Sep 18 13:27 test_text_sym.txt
echoコマンドを使ってファイルにテキストを追加しようとしようとすると、Permission deniedのエラーメッセージが表示されます。
hirotano@ubuntu-1:~$ echo "Trying to add this line." >> test_text_sym.txt -bash: test_text_sym.txt: Permission denied
スクリプトの実行権限の追加
テスト用に、test_script_sym.shという名前のbashスクリプトを作成します。
hirotano@ubuntu-1:~$ echo 'echo "Hello from test_script_sym.sh!"' > test_script_sym.sh hirotano@ubuntu-1:~$ ls -l -rw-rw-r-- 1 hirotano hirotano 38 Sep 18 13:38 test_script_sym.sh
このスクリプトを実行すると、Permission deniedのエラーメッセージが表示されます。
hirotano@ubuntu-1:~$ ./test_script_sym.sh -bash: ./test_script_sym.sh: Permission denied
スクリプトの実行権限を追加
chmodコマンドを使って、スクリプトの実行権限を追加します。
hirotano@ubuntu-1:~$ chmod +x test_script_sym.sh hirotano@ubuntu-1:~$ ls -l -rwxrwxr-x 1 hirotano hirotano 38 Sep 18 13:38 test_script_sym.sh
スクリプトがエラーなく実行されることが確認できます。
hirotano@ubuntu-1:~$ ./test_script_sym.sh
Hello from test_script_sym.sh!
動作確認(ディレクトリ)
ディレクトリの権限はファイルの権限の考え方とは少し異なり、注意が必要です。
テストディレクトリとファイルの準備
まず、test_dirという名前のディレクトリと、その中にsample.txtというテキストファイルを作成します。
hirotano@ubuntu-1:~$ mkdir test_dir hirotano@ubuntu-1:~$ echo "This is a sample text inside the directory." > test_dir/sample.txt
ディレクトリの権限を確認します。
hirotano@ubuntu-1:~$ ls -l drwxrwxr-x 2 hirotano hirotano 4096 Sep 18 13:58 test_dir
所有者には、読み取り、書き込み、実行の権限が設定されています。
ディレクトリの実行権限を削除
ディレクトリに実行権限を削除すると、そのディレクトリ内にcdできなくなります。
hirotano@ubuntu-1:~$ chmod 600 test_dir hirotano@ubuntu-1:~$ cd test_dir -bash: cd: test_dir: Permission denied hirotano@ubuntu-1:~$ ls -l drw------- 2 hirotano hirotano 4096 Sep 18 13:58 test_dir
ディレクトリの書き込み権限を削除
次に、ディレクトリの書き込み権限を削除します。この権限を削除すると、ディレクトリ内のファイルを削除することができなくなります。
hirotano@ubuntu-1:~$ chmod 500 test_dir hirotano@ubuntu-1:~$ rm test_dir/sample.txt rm: cannot remove 'test_dir/sample.txt': Permission denied hirotano@ubuntu-1:~$ ls -l dr-x------ 2 hirotano hirotano 4096 Sep 18 13:58 test_dir
ディレクトリの権限を再帰的に変更
chmodの-Rオプションを使用すると、ディレクトリとその中のすべてのサブディレクトリ、ファイルの権限を再帰的に変更することができます。
テスト用に、test_dirという名前のディレクトリと、その中にsub_dirというサブディレクトリ、さらにその中にsample.txtというテキストファイルを作成します。
hirotano@ubuntu-1:~$ mkdir -p test_dir/sub_dir hirotano@ubuntu-1:~$ echo "This is a sample text inside the subdirectory." > test_dir/sub_dir/sample.txt
権限を確認します。
hirotano@ubuntu-1:~$ ls -l drwxrwxr-x 3 hirotano hirotano 4096 Sep 18 14:16 test_dir hirotano@ubuntu-1:~$ ls -l test_dir drwxrwxr-x 2 hirotano hirotano 4096 Sep 18 14:16 sub_dir hirotano@ubuntu-1:~$ ls -l test_dir/sub_dir/ -rw-rw-r-- 1 hirotano hirotano 47 Sep 18 14:16 sample.txt
-Rオプションなしでの権限変更
chmodでtest_dirの権限を変更しますが、-Rオプションは使用しません。
hirotano@ubuntu-1:~$ chmod 700 test_dir
この変更後、test_dirにはの権限は変更されていますが、sub_dirやその中のsample.txtの権限は変更されていません。
hirotano@ubuntu-1:~$ ls -l drwx------ 3 hirotano hirotano 4096 Sep 18 14:16 test_dir hirotano@ubuntu-1:~$ ls -l test_dir/ drwxrwxr-x 2 hirotano hirotano 4096 Sep 18 14:16 sub_dir hirotano@ubuntu-1:~$ ls -l test_dir/sub_dir/ -rw-rw-r-- 1 hirotano hirotano 47 Sep 18 14:16 sample.txt
-Rオプションありでの権限変更
chmodの-Rオプションを使用して、test_dirとその中のすべてのサブディレクトリ、ファイルの権限を再帰的に変更します。
hirotano@ubuntu-1:~$ chmod -R 700 test_dir
この変更により、test_dirだけでなく、sub_dirやその中のsample.txtの権限も変更されます。
hirotano@ubuntu-1:~$ ls -l drwx------ 3 hirotano hirotano 4096 Sep 18 14:16 test_dir hirotano@ubuntu-1:~$ ls -l test_dir/ drwx------ 2 hirotano hirotano 4096 Sep 18 14:16 sub_dir hirotano@ubuntu-1:~$ ls -l test_dir/sub_dir/ -rwx------ 1 hirotano hirotano 47 Sep 18 14:16 sample.txt
コメント