Linuxでは、ファイルへのアクセスは、ファイルのパーミッション、属性、所有権によって管理されています。 このチュートリアルでは、chmod
コマンドを使用してファイルやディレクトリのアクセス権を変更する方法を説明します。
Linux File Permissions #
先に進む前に、Linux の基本的なパーミッション モデルを説明します。
Linuxでは、各ファイルは所有者とグループに関連付けられ、3つの異なるクラスのユーザーに対してパーミッションのアクセス権が割り当てられています:
- ファイルの所有者。
- Others (everybody else).
File ownership can be changed using the chown
and chgrp
commands.
There are three file permissions types that apply to each class:
- The read permission.
- The write permission.This is a third class of file permission that apply to each class:
- The read permission.
- the write permission.
- The write permission.
- The execute permission.
-
u
– ファイルの所有者。 -
g
– グループのメンバーであるユーザー。 -
o
– それ以外のすべてのユーザー。 -
a
– すべてのユーザー、ugo
と同じ。 -
-
指定したパーミッションを削除します。 -
+
指定したパーミッションを追加します。 -
=
現在のパーミッションを、指定したパーミッションに変更します。=
記号の後にパーミッションが指定されていない場合、指定されたユーザクラスからのすべてのパーミッションが削除されます。 -
グループのメンバーにファイルの読み取り権限は与えるが、書き込みと実行権限は与えない:
chmod g=r filename
-
すべてのユーザーに対して実行権限を削除する:
chmod g=r filename
-
グループのメンバーにファイルの読み取り権限と書き込み権限を与える。
chmod a-x filename
-
他のユーザーの書き込み権限を強制的に削除:
chmod -R o-w dirname
-
ファイルのオーナー以外のすべてのユーザーの読み取り、書き込み、実行権限を削除:
chmod og-rwx filename
同じことは、次の形式を使って行うことも可能である。
chmod og= filename
-
ファイルの所有者に読み取り、書き込み、実行の権限を与え、ファイルのグループに読み取り権限を与え、その他のすべてのユーザーに権限を与えないようにします。
chmod u=rwx,g=r,o= filename
-
ファイルのグループのメンバーが持っている権限にファイルの所有者の権限を追加します:
chmod g+u filename
-
与えられたディレクトリにスティッキービットを追加します。
chmod o+t dirname
-
r
(読み込み)=4 -
w
(書き込み)=2 -
x
(実行)=1 - パーミッションなし=0
- Owner: rwx=4+2+1=7
- Group: r-x=4+0+1=5
- Others: r-x=4+0+0=4
- setuid=4
- setgid=2
- sticky=1
- 変更なし=0
この概念により、どのユーザーにファイルの読み取り、ファイルへの書き込み、またはファイルの実行を許可するかを指定できます。
ファイルのパーミッションは、ls
コマンドを使用して表示できます。 通常のファイル (-
), ディレクトリ (d
), シンボリックリンク (l
), またはその他の特別なタイプのファイルである可能性があります。
次の9文字はファイル権限を表し、3文字ずつの3連です。 最初の3連符は所有者権限、2番目の3連符はグループ権限、最後の3連符はその他のすべての権限である。
上記の例では、(rw-r--r--
)はファイルの所有者に読み取りと書き込みの権限(rw-
)、グループとその他に読み取り権限(r--
)だけがあることを意味します。
3つのパーミッションのトリプレットはそれぞれ以下の文字で構成でき、ファイルに設定するかディレクトリに設定するかによって、異なる効果を持つ。
ファイルに対するパーミッションの効果
パーミッション | 文字 | |
---|---|---|
読み取り | - |
ファイルは読み取ることができません。 |
r |
ファイルの内容は閲覧可能です。 | |
Write | - |
ファイルを変更または修正できません。 |
w |
ファイルを変更または修正することは可能です。 | |
実行 | - |
ファイルを実行できません。 |
x |
||
s |
user triplet で見つかった場合、setuid ビットを設定します。 group トリプレットで見つかった場合は、setgid ビットを設定します。 実行ファイルに setuid または setgid フラグが設定されると、そのファイルはそのファイルの所有者およびグループ権限で実行される。 |
|
S |
s と同様だが x フラグは設定されていない。 |
|
t |
others triplet で見つかった場合、sticky ビットを設定する。また、 x フラグも設定されていることを示す。 |
|
T |
t と同じだが、x フラグがセットされない。 このフラグはファイルに対しては無意味です。 |
Effect of Permissions on Directories (Folders)
Linuxにおいて、ディレクトリは他のファイルやディレクトリを含む特殊なタイプのファイルである。
パーミッション | 文字 | ディレクトリ上の意味 |
---|---|---|
読み取り | - |
そのディレクトリの中身は見ることができない。 |
r |
||
Write | - |
ディレクトリの内容を変更できない |
w |
ディレクトリの内容を変更できる (例:新しいファイルの作成、ファイルの削除などの操作ができる。) |
|
実行 | - |
ディレクトリを変更できない。 |
x |
ディレクトリはcd を使って移動することができる。 |
|
s |
user triplet で見つかった場合、setuid ビットを設定する。 group のトリプレットで見つかると setgid ビットがセットされます。 また、x フラグが設定されることを意味します。 setgid フラグがディレクトリに設定されると、その中に作成された新しいファイルは、ファイルを作成したユーザのプライマリグループ ID ではなく、ディレクトリグループ ID (GID) を継承する。setuid はディレクトリには影響しない。 |
|
S |
s と同様だが x フラグは設定されない。 |
|
t |
others triplet で見つかると sticky bit をセットする。これは x flag がセットされていることも意味している。 ディレクトリにスティッキービットが設定されると、ファイルの所有者、ディレクトリの所有者、または管理ユーザーのみがディレクトリ内のファイルを削除したり名前を変更したりできます。 |
|
T |
t と同じですが x フラグは設定されません。 このフラグはディレクトリでは役に立たない。 |
Using chmod #
chmod
コマンドは以下の一般形をとる:
chmod MODE FILE...
chmod
コマンドではシンボリックまたは数値モード、あるいは参照ファイルを使ってファイルのパーミッションを変更することができる。 モードについては後ほど詳しく説明します。
ファイルのパーミッションを変更できるのは、root、ファイルの所有者、または sudo 権限を持つユーザーのみです。 chmod
を使用する場合、特に再帰的にパーミッションを変更する場合は特に注意してください。
Symbolic (Text) Method #
シンボリックモードを使用する場合の chmod
コマンドの構文は、以下の形式です:
chmod perms… FILE...
最初のフラグのセット (), Users Flags では、ファイルのパーミッションをどのユーザクラスが変更されたかが定義されています。
ユーザーフラグが省略された場合、デフォルトはa
で、umaskareによって設定されるパーミッションは影響を受けません。
フラグの2番目のセット () である操作フラグは、パーミッションが削除、追加、または設定されるかを定義します:
パーミッション(perms...
)は、ゼロまたは以下の1文字以上を使用して明示的に設定することが可能です。 r
、w
、x
、X
、s
、およびt
。
複数のユーザークラス () に権限を設定する場合、シンボリックモードを区切るためにカンマ (スペースなし) を使用します。
以下は、シンボリックモードでの chmod
コマンドの使用例です:
Numeric Method #
数値メソッドを使用する際のchmod
コマンドの構文は以下の形式です:
chmod NUMBER FILE...
数値モードを使用すると、3つのユーザークラス(オーナー、グループ、その他すべて)に対して同時に許可を設定することが可能です。
NUMBER
には3桁または4桁の数字を使用できます。
3桁の数字を使用する場合、1桁目はファイルのオーナー、2桁目はファイルのグループ、最後の桁はその他のすべてのユーザーの権限を表します。
書き込み、読み取り、実行の各権限は、次のような数値になります。
特定のユーザークラスのパーミッション数はそのグループのパーミッション値の合計によって表わされます。
数値モードでファイルのパーミッションを知るには、単にすべてのユーザークラスの合計を計算します。 たとえば、ファイルの所有者に読み取り、書き込み、実行権限を与え、ファイルのグループに読み取りと実行権限を与え、他のすべてのユーザーに読み取り権限のみを与えるには、次のようにします。
上記の方法で、希望の権限を表す数値 754
にたどり着きます。
setuid
、setgid
、sticky bit
フラグを設定するには、4桁の数字を使用します。
4桁の数字を使用する場合、1桁目は以下の意味を持ちます:
次の3桁は3桁数字を使用した場合の意味と同じになります。
1桁目が0の場合は省略可能で、3桁でモードを表すことができます。 数値モード0755
は755
と同じです。
数値モードを計算するには別の方法(2進法)もありますが、少し複雑です。 4,2,1を使って数値モードを計算する方法を知っていれば、ほとんどのユーザは十分です。
ファイルのパーミッションを数字表記で確認するには、stat
コマンドを使います:
stat -c "%a" filename
644
以下は、chmod
コマンドを数字モードで使用する例です。
-
ファイルの所有者に読み取りと書き込みの権限を与え、グループメンバーおよび他のすべてのユーザーには読み取り権限のみを与える:
chmod 644 dirname
-
ファイルの所有者に読み取り、書き込み、実行権限を与え、グループメンバーに読み取りと実行権限を、他のすべてのユーザーには権限を与えず、読み取り権限を与えます。
chmod 750 dirname
-
与えられたディレクトリに読み取り、書き込み、実行権限、およびスティッキービットを与える:
chmod 1777 dirname
-
与えられたディレクトリでファイルの所有者に読み取り、書き込み、実行権限を、他のすべてのユーザーに権限を持たずに再帰的に設定する。
chmod -R 700 dirname
Using a Reference File #
--reference=ref_file
オプションで、ファイルのパーミッションを指定した参照ファイル(ref_file
)と同じに設定することができるようになりました。
chmod --reference=REF_FILE FILE
例えば、以下のコマンドは file1
のパーミッションを file2
chmod --reference=file1 file2
ファイルのパーミッションを再帰的に変更 #
与えられたディレクトリ以下のすべてのファイルとディレクトリに対して再帰的に操作するには -R
(--recursive
) オプションを使用します。
chmod -R MODE DIRECTORY
例えば、/var/www
ディレクトリの下のすべてのファイルとサブディレクトリのパーミッションを 755
に変更するには、次のようにします:
chmod -R 755 /var/www
Operating on Symbolic Links #
Symbolic linksalways have 777
permissions.
デフォルトでは、シンボリックリンクのパーミッションを変更する場合、 chmod
はリンクが指しているファイルのパーミッションを変更します。 Permission denied” というエラーが発生します。
このエラーは、ほとんどの Linux ディストリビューションではデフォルトでシンボリックリンクが保護されており、ターゲット ファイルに対して操作できないために発生します。 このオプションは/proc/sys/fs/protected_symlinks
で指定します。 1
は有効、0
は無効を意味します。
Changing File Permissions in Bulk in Package #
時には、ファイルやディレクトリのパーミッションを一括して変更する必要がある場合があります。
最も一般的なシナリオは、ウェブサイトファイルのパーミッションを 644
、ディレクトリのパーミッションを 755
に再帰的に変更することです。
数値メソッドの使用:
find /var/www/my_website -type d -exec chmod 755 {} \;
find /var/www/my_website -type f -exec chmod 644 {} \;
シンボリックメソッドの使用:
find /var/www/my_website -type d -exec chmod u=rwx,go=rx {} \;
find /var/www/my_website -type f -exec chmod u=rw,go=r {} \;
コマンドは /var/www/my_website
以下のファイルおよびディレクトリを検索し、見つかった各ファイルおよびディレクトリを chmod
コマンドに渡しパーミッションを設定します。 パーミッションはシンボリックモードか数値モードで設定できます。
chmod
についてもっと知りたい場合は、chmod man ページをご覧ください。