ファイルのパーミッションと属性
ファイルシステムは、パーミッションと属性を使って、どの程度のレベルでシステムのプロセスがファイルやディレクトリとやり取りできるかを規定します。
目次
パーミッションの表示
ls コマンドの -l
オプションを使えば、ディレクトリのコンテンツのパーミッション (ファイルのモード とも) を確認できます。例:
$ ls -l /path/to/directory
total 128 drwxr-xr-x 2 archie archie 4096 Jul 5 21:03 Desktop drwxr-xr-x 6 archie archie 4096 Jul 5 17:37 Documents drwxr-xr-x 2 archie archie 4096 Jul 5 13:45 Downloads -rw-rw-r-- 1 archie archie 5120 Jun 27 08:28 customers.ods -rw-r--r-- 1 archie archie 3339 Jun 27 08:28 todo -rwxr-xr-x 1 archie archie 2048 Jul 6 12:56 myscript.sh
1番目の列に注目してください。例えば drwxrwxrwx+
という値であれば、それぞれの文字の意味は以下の様のようになります:
d
|
rwx
|
rwx
|
rwx
|
+
|
ファイルの種類。技術的にはパーミッションの一部ではありません。ここに入りうる値の説明は info ls -n "What information is listed" を参照してください。
|
このファイルに対して所有者が持っているパーミッション。以下で説明されています。 | このファイルに対してグループが持っているパーミッション。以下で説明されています。 | このファイルに対してその他のユーザが持っているパーミッション。以下で説明されています。 | 代替のアクセス手法がこのファイルに対して適用されているかどうかを示す単一の文字。この文字が空白ならば、代替のアクセス手法は適用されていません。. 文字の場合は、ファイルにセキュリティコンテキストが存在しているが、代替のアクセス手法は適用されていないことを示します。代替のアクセス手法がその他の組み合わせで適用されているファイルでは、+ 文字で表されます。例えば、アクセス制御リストの場合です。
|
3つの文字からなるパーミッション (上記の例では rwx
) には、以下の文字のどれかが入ります:
文字 | ファイルに対する効果 | ディレクトリに対する効果 | |
---|---|---|---|
読み取りパーミッション (最初の文字) | -
|
ファイルは読めません。 | ディレクトリの中身は表示できません。 |
r
|
ファイルを読むことができます。 | ディレクトリの中身を表示できます。 | |
書き込みパーミッション (2番目の文字) | -
|
ファイルは変更できません。 | ディレクトリの中身は変更できません。 |
w
|
ファイルを変更できます。 | ディレクトリの中身を変更できます (ここでの変更とは、新しいファイルやディレクトリの作成、既存のファイルやディレクトリの名称変更や削除です)。ただし、実行パーミッションも設定されていなければなりません。さもないと、このパーミッションは効果を持ちません。 | |
実行パーミッション (3番目の文字) | -
|
ファイルは実行できません。 | ディレクトリは cd でアクセスできません。 |
x
|
ファイルを実行できます。 | ディレクトリに cd でアクセスできます。これは、親ディレクトリから事実上 "継承している" とみなすことのできる唯一のパーミッションビットです。事実、親ディレクトリのどれか1つでも x が設定されていないと、パスの最後のファイルやディレクトリにも (それのパーミッションに依らず) アクセスできません。詳細は path_resolution(7) を参照してください。
| |
s
|
ユーザ (user) のパーミッションにある場合は setuid ビット、グループ (group) のパーミッションにある場合は setgid ビットとなります。その他のユーザ (others) のパーミッションには現れません。この文字は、x も設定されていることを意味します。
| ||
S
|
s と同じですが、x は設定されていません。通常のファイルで使われることは滅多になく、ディレクトリでは意味がありません。
| ||
t
|
スティッキービットです。その他のユーザ (others) のパーミッションにしか現れません。この文字は、x も設定されていることを意味します。
| ||
T
|
t と同じですが、x は設定されていません。通常のファイルで使われることは滅多にありません。
|
詳細は info Coreutils -n "Mode Structure"
と chmod(1) を見てください。
サンプル
いくつか例を見て、理解を深めましょう:
drwx------ 6 archie archie 4096 Jul 5 17:37 Documents
上記の場合、Archie は Documents
ディレクトリへの完全なアクセス権を持っています。Archie は、Documents 内のファイルを (そのファイルのパーミッションに依らず) 一覧表示、名称変更、削除することができ、さらにファイルを Documents 内に作成することができます。しかし、ファイル自体にアクセス (つまり、読み書き実行) できるかどうかは、そのファイルのパーミッションに依ります。
dr-x------ 6 archie archie 4096 Jul 5 17:37 Documents
Archie はファイルの作成、名称変更、削除ができませんが、それ以外なら可能です。Archie は Documents 内のファイルを一覧表示することができ、Documents 内のファイルに (そのファイルのパーミッションで許可されているならば) アクセスできます。
d-wx------ 6 archie archie 4096 Jul 5 17:37 Documents
Archie は Documents
ディレクトリ内で ls
を実行することができませんが、ディレクトリ内の特定のファイルの名前を知っているならば、そのファイルを一覧表示、名称変更、削除することができ、さらに (そのファイルのパーミッションで許可されているならば) アクセスすることができます。また、新しいファイルを作成することもできます。
d--x------ 6 archie archie 4096 Jul 5 17:37 Documents
Archie は、Documents
ディレクトリ内のファイルのうち、名前を知っているものにアクセスすることしかできません (ただし、そのファイルのパーミッションで許可されている場合に限る)。ディレクトリ内のファイルを一覧表示することはできず、ファイルの作成、名称変更、削除もできません。
ここで説明しているのはディレクトリのパーミッションであり、個々のファイルのパーミッションとは関係がありません。新しくファイルを作成したとき、変更があるのはディレクトリです。したがってディレクトリの書き込み権限が必要となります。
今度はディレクトリではなくファイルの例を見てみましょう:
-rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar
上記の例では最初の文字が d
ではなく -
になっていることが確認できます。なので、これはディレクトリではなくファイルであることを知ることができます。次に所有者のパーミッションは rw-
なので所有者はファイルの読み書きができますが実行することはできません。所有者が3つのパーミッション全てを得ていないことはおかしく思えるかもしれませんが、x
パーミッションは Gedit や Emacs などのテキストエディタから読むテキストファイル、あるいは R などのソフトウェアから読み込むデータファイルでは必要ないパーミッションです (python のコードなどが入っている場合は実行権限が与えられることがあります)。グループのパーミッションは r--
に設定されており、所有グループはファイルを読むことはできても編集することができません。何かを読み取り専用に設定することは重要です。他のユーザーのパーミッションはグループと同じに設定されています。
パーミッションを変更
chmod は Linux などの Unix ライクなオペレーティングシステムで使われるコマンドで、ファイルやディレクトリのパーミッション (もしくはアクセスモード) を変更することができます (change mode)。
テキストを使う方法
ファイルのパーミッション (あるいはアクセスモード) を変更するにはターミナルで chmod コマンドを使います。以下はコマンドの一般的な使い方です:
chmod who=permissions filename
who
はパーミッションを与える対象を指定する文字です。以下のどれかになります:
u
: ファイルを所有するユーザー。g
: ファイルが所属するグループ。o
: 他 (other) のユーザー。つまり、全てのユーザー。a
: 上記の全て (all)。ugo
と入力する代わりにa
で指定できます。
設定するパーミッションは #パーミッションの表示 で説明しているのと同じです (r
, w
, x
)。
それではコマンドを使用例を見てみましょう。Documents ディレクトリを守るためにあなた以外のユーザーが読み書きや実行 (この場合は検索) ができないようにしたい場合:
ビフォー: drwxr-xr-x 6 archie users 4096 Jul 5 17:37 Documents
$ chmod g= Documents $ chmod o= Documents
アフター: drwx------ 6 archie users 4096 Jul 6 17:32 Documents
上記ではパーミッションを取り去るために、=
の後に何も文字を入力していません。所有者のパーミッションだけ rwx
となり、他のパーミッションは全て -
に変更されたことが確認できます。
上記の設定は以下のコマンドで元に戻すことができます:
ビフォー: drwx------ 6 archie users 4096 Jul 6 17:32 Documents
$ chmod g=rx Documents $ chmod o=rx Documents
アフター: drwxr-xr-x 6 archie users 4096 Jul 6 17:32 Documents
グループと他のユーザーに読み込み・実行権限を与えるために、=
の後にパーミッションの文字 (r
と x
) を記入しています。空白は入れません。
who
に複数の文字を入力することでコマンドをひとつにまとめることができます。例:
$ chmod go=rx Documents
次に、2番目の例を考えてみましょう。たとえば、foobar
ファイルを変更して、読み取りと書き込みのアクセス許可を与え、グループ users
の同僚が作業している可能性があると仮定します。 foobar
は読み取りと書き込みもできますが、他のユーザーは読み取りしかできません。
Before: -rw-r--r-- 1 archie users 5120 Jun 27 08:28 foobar
$ chmod g=rw foobar
After: -rw-rw-r-- 1 archie users 5120 Jun 27 08:28 foobar
これは最初の例とまったく同じですが、ディレクトリではなくファイルを使用し、書き込み権限を付与します。(すべての権限を付与する例を示すため)
テキストを使う方法のショートカット
chmod コマンドでは =
の代わりに +
または -
を使うことでパーミッションを追加したり削除することができます。上記のコマンドのようにパーミッションを完全に書き換えることがありません (例えば、パーミッションを r--
から rw-
に変更する場合でも上記のコマンドを使うときは chmod コマンドの =
の後に w
だけでなく r
も必要です。r
を指定しなかった場合、r
のパーミッションが消えてしまいます。+
と -
を使うことで現在のパーミッションから一部のパーミッションを追加したり削除することができるようになります)。
前記のグループに書き込みパーミッションを与える例を +
と -
で試してみましょう:
ビフォー: -rw-r--r-- 1 archie users 5120 Jun 27 08:28 foobar
$ chmod g+w foobar
アフター: -rw-rw-r-- 1 archie users 5120 Jun 27 08:28 foobar
また、全てのユーザー (a) から書き込み権限を奪いたい場合:
ビフォー: -rw-rw-r-- 1 archie users 5120 Jun 27 08:28 foobar
$ chmod a-w foobar
アフター: -r--r--r-- 1 archie users 5120 Jun 27 08:28 foobar
別のショートカットは特殊な X
モードです。これは実際のファイルモードではありませんが、多くの場合、-R
オプションと組み合わせて使用され、ディレクトリに対してのみ実行可能ビットを設定し、通常のファイルに対しては変更しないでおきます。たとえば、次のようになります。
$ chmod -R a+rX ./data/
パーミッションのコピー
chmod に1つのクラスから許可をコピーするように指示し、所有者になって、グループまたはすべてに同じ許可を与えることができます。 これを行うには、=
の後に r
、w
、または x
を配置する代わりに、別の who を配置します 文字。 例えば:
Before: -rw-r--r-- 1 archie users 5120 Jun 27 08:28 foobar
$ chmod g=u foobar
After: -rw-rw-r-- 1 archie users 5120 Jun 27 08:28 foobar
このコマンドは基本的に、"グループのアクセス許可を変更 (g=
) して、所有ユーザー (=u
) と同じにします。パーミッションのセットをコピーしたり、新しいパーミッションを付与したりすることはできません。
$ chmod g=wu foobar
その場合、 chmod はエラーを出します。
数字を使う方法
chmod では数字を使ってパーミッションを設定することもできます。
数字を使用する場合、所有者とグループ、その他のユーザーのパーミッションを同時に編集することができます。コマンドは以下のようになります:
$ chmod xxx filename
xxx
は3桁の数字になります。各桁の数字は0から7までのどれかになります。1番目の数字は所有者のパーミッション、2番目の数字は所有グループのパーミッション、3番目の数字は他のユーザーのパーミッションになります。
この数値表記では、値 r
、w
、および x
にそれぞれ独自の数値を持ちます。
r=4 w=2 x=1
3桁の数字を考え出すには、所有者、グループ、ユーザーにどのようなアクセス許可を付与するかを検討し、それらの値を合計する必要があります。 たとえば、ディレクトリの所有者に読み取りと書き込みのアクセス許可を付与し、グループと他のすべてのユーザーに読み取りと実行のアクセス許可のみを付与する場合、次のような数値が考えられます。
- Owner:
rwx
=4+2+1=7 - Group:
r-x
=4+0+1=5 - Other:
r-x
=4+0+1=5
$ chmod 755 filename
これは、以下を使用することと同等です。
$ chmod u=rwx filename $ chmod go=rx filename
ほとんどのフォルダとディレクトリは 755
に設定され、所有者には読み取り、書き込み、実行を許可しますが、それ以外のすべてのユーザーには書き込みを拒否します。ファイルは通常 644
で、所有者には読み取りと書き込みを許可しますが、他のすべてのユーザーには読み取りだけを許可します。実行可能ファイル以外では x
パーミッションがないという最後の注意を参照してください。
例を使用してこれを実際に見るには、使用されている前の例を検討してください。代わりに、この数値手法が適用されています。
ビフォー: -rw-r--r-- 1 archie users 5120 Jun 27 08:28 foobar
$ chmod 664 foobar
アフター: -rw-rw-r-- 1 archie users 5120 Jun 27 08:28 foobar
これが実行可能ファイルの場合、所有者とグループに実行可能権限を付与するには、番号は 774
になります。また、すべてのユーザーに読み取り権限のみを与えたい場合は、番号を 444
にします。r
を4、w
を2、x
を1として処理する方法は、chmod xxx ファイル名
を使用するための数値を算出する最も簡単な方法ですが、各権限に2進数を割り当て、それを数値に変換する2進法もあります。もう少し複雑ですが、ここでは完全性のために説明します。
次の権限セットを検討してください。
-rwxr-xr--
許可された各許可の下に1を、許可されていないすべての許可に対して0を置くと、結果は次のようになります。
-rwxrwxr-x 111111101
次に、これらの2進数を変換できます。
000=0 100=4 001=1 101=5 010=2 110=6 011=3 111=7
したがって、上記の値は775になります。
グループから書き込み可能な権限を削除したい場合。
-rwxr-xr-x 111101101
したがって、値は755となり、chmod 755 filename
を使用して書き込み可能な権限を削除します。 どの方法を使用しても、同じ3桁の数字が表示されます。 テキストと数字のどちらを使用するかは、個人の好みと入力速度に依存します。 ディレクトリまたはファイルをデフォルトのアクセス許可に復元する場合。 所有者には読み取りと書き込み(および実行)のアクセス許可を付与しますが、他のすべてのユーザーには書き込みのアクセス許可を拒否します。chmod 755/644 filename
を使用する方が速い場合があります。 ただし、権限を通常とは異なるものに変更する場合は、テキストメソッドを使用する方が数値に変換するよりも簡単で迅速な場合があり、これによりミスが発生する可能性があります。 たまに chmod を使用するだけでよいユーザーにとって、どちらの方法の速度にも実際に大きな違いはないと主張することができます。
数字を使う方法であれば数字を4個使って setuid
, setgid
, sticky
ビットも設定できます:
setuid=4 setgid=2 sticky=1
例えば chmod 2777 filename
であれば誰でも読み書き実行ができ、setgid
ビットも有効になります。
まとめて chmod
通常、ディレクトリとファイルは同じパーミッションにする必要はありません。一度にディレクトリツリーを修正しなくてはならない場合、find を使って選択的に修正します。
ディレクトリだけを 755 に chmod するには:
$ find directory -type d -exec chmod 755 {} +
ファイルだけを 644 に chmod するには:
$ find directory -type f -exec chmod 644 {} +
所有権を変更
chown はファイルやディレクトリの所有者を変更します。これは、場合によってはパーミッションの変更よりも簡単です。
以下の例では、GParted を使ってバックアップデータ用に新しいパーティションを作成しています。Gparted は全てを root で実行するためファイルの所有者が全て root になります。通常ユーザーがパーティションをマウントしてデータを書き込もうとすると、パーミッションによって拒否されてしまいます。
brw-rw---- 1 root disk 8, 9 Jul 6 16:02 sda9 drwxr-xr-x 5 root root 4096 Jul 6 16:01 Backup
マウントされているディレクトリ (/media/Backup
) と同じように、/dev
のデバイスの所有者も root になっていることが確認できます。マウントされているディレクトリの所有者を変更するには以下を実行:
ビフォー: drwxr-xr-x 5 root root 4096 Jul 6 16:01 Backup
# chown archie /media/Backup
アフター: drwxr-xr-x 5 archie root 4096 Jul 6 16:01 Backup
これで、パーミッションを変更することなく、新しい所有者である archie がパーティションにデータを書き込むことができます(所有者 triad はすでに rwx
アクセス許可を持っていたので)。
アクセス制御リスト
アクセス制御リストはファイルシステムに柔軟なパーミッション機構を追加し、あらゆるユーザーやグループにあらゆるファイルのパーミッションを設定することができます。
アクセス制御リストがあるかどうかは ls コマンドの出力にプラス記号 (+
) があるかで確認できます。
Umask
umask ユーティリティを使うことでファイル作成モードマスクを制御することができ、新しくファイルを作成したときのファイルパーミッションの初期値を決めることができます。
ファイルの属性
ユーザーやグループの読み書きや実行権限を制御するファイルモードビットとは別に、ファイル操作の可否を細かくカスタマイズするためのファイル属性をファイルシステムがサポートしている場合があります。このセクションではそれらの属性を使用する方法を説明します。
e2fsprogs パッケージには、lsattr(1) と chattr(1) というプログラムが含まれており、ファイルの属性を確認したり変更することができます。
全てのファイルシステムで反映されるわけではありませんが、以下の属性を使用することができます:
a
: 追記のみc
: 圧縮d
: ダンプしないe
: 拡張フォーマットi
: 変更不可j
: データのジャーナリングs
: 安全な消去t
: 末尾のマージをしないu
: 削除不可A
: アクセス日時を更新しないC
: コピーオンライトしないD
: ディレクトリの同期更新S
: 同期更新T
: ディレクトリ階層のトップ
例えば、特定のファイルに変更不可ビットを設定したい場合、次のコマンドを使用:
# chattr +i /path/to/file
ファイルから属性を削除したいときは +
を -
に変更してください。
拡張属性
attr(5) より: "拡張属性とはファイルやディレクトリに関連付けられる name:value のペアである。拡張属性には4つのクラスがある: security, system, trusted, user"。
ユーザー拡張属性
ユーザー拡張属性を使うことでファイルに任意の情報を保存できます。ユーザー拡張属性を作成するには:
$ setfattr -n user.checksum -v "3baf9ebce4c664ca8d9e5f6314fb47fb" foo.bar
拡張属性を表示するには getfattr を使用:
$ getfattr -d foo.bar
# file: foo.bar user.checksum="3baf9ebce4c664ca8d9e5f6314fb47fb"
拡張属性の保存
コマンド | 必須フラグ |
---|---|
cp |
--preserve=mode,ownership,timestamps,xattr
|
mv |
preserves by default1 |
tar |
--xattrs for creation and --xattrs-include='*' for extraction
|
bsdtar |
-p for extraction
|
rsync | --xattrs
|
- ターゲットファイルシステムが拡張属性をサポートしていない場合、mv は拡張属性をサイレントに破棄します。
テキストエディタで拡張属性を保持するには、rename(2) を使用する代わりに、保存時にファイルを切り捨てるように設定する必要があります。[1]
ヒントとテクニック
ルートの保護
--preserve-root
フラグを使うことで chmod
を /
で再帰的に実行してしまうことを防ぐことができます。システム全体から実行可能属性を取り除いてシステムが破壊されてしまう恐れがなくなります。フラグを毎回使いたい場合、エイリアスで設定すると良いでしょう。[2] も参照。