ファイルのパーミッションと属性

提供: ArchWiki
2022年5月20日 (金) 12:38時点におけるKusanaginoturugi (トーク | 投稿記録)による版 (→‎ケイパビリティ: === Preserving extended attributes === に差し替え)
ナビゲーションに移動 検索に移動

関連記事

ファイルシステムパーミッション属性を使ってシステムプロセスが処理できるファイルやディレクトリのレベルを規定します。

警告: パーミッションや属性のセキュリティについて言えば、対抗できるのはシステムが起動した後の攻撃にすぎません。マシンに物理的にアクセスできる攻撃者からデータを保護するには、ディスク暗号化を施す必要があります。

パーミッションの表示

ls コマンドの -l オプションを使ってディレクトリの中身のパーミッション (あるいはファイルモード) を確認できます。例:

$ ls -l /path/to/directory
total 128
drwxr-xr-x 2 archie users  4096 Jul  5 21:03 Desktop
drwxr-xr-x 6 archie users  4096 Jul  5 17:37 Documents
drwxr-xr-x 2 archie users  4096 Jul  5 13:45 Downloads
-rw-rw-r-- 1 archie users  5120 Jun 27 08:28 customers.ods
-rw-r--r-- 1 archie users  3339 Jun 27 08:28 todo
-rwxr-xr-x 1 archie users  2048 Jul  6 12:56 myscript.sh

最初のカラムが一番重要です。例えば drwxrwxrwx+ という値であれば、それぞれの文字の意味は以下の表のようになります:

d rwx rwx rwx +
ファイルのタイプ。技術的にはパーミッションではありません。値については info ls -n "What information is listed" を参照してください。 ファイルの所有者のパーミッション。下を参照。 ファイルのグループのパーミッション。下を参照。 ファイルの所有者でないユーザーのパーミッション。下を参照。 他のアクセスメソッドがファイルに適用されているかどうか表す文字。この文字が空白のとき、他のアクセスメソッドは存在しません。. という文字はファイルにセキュリティコンテキストが付与されていることを表します。他のアクセスメソッドが使われていると、+ の文字で表されます (アクセス制御リストの場合)。

三組のパーミッション文字列 (上記の例なら rwx) は以下の文字によって構成されます:

文字 ファイルの場合 ディレクトリの場合
読み取り権限 (最初の文字) - ファイルを読み込むことができません。 ディレクトリの中身を表示することができません。
r ファイルを読み込むことができます。 ディレクトリの中身を表示することができます。
書き込み権限 (二番目の文字) - ファイルを変更することができません。 ディレクトリの中身を変更することができません。
w ファイルを変更することができます。 ディレクトリの中身を変更することができます (新しいファイルやフォルダを作成したり、既存のファイルやフォルダの名前を変更したり削除するなど)。実行権限も設定されていないと、このパーミッションは反映されません。
実行権限 (三番目の文字) - ファイルを実行することができません。 ディレクトリを cd で開くことができます。
x ファイルを実行できます。 ディレクトリを cd で開くことができます。親のディレクトリから継承を行う唯一のパーミッションビットです。パス内の全てのフォルダに 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 users  4096 Jul  5 17:37 Documents

上記の場合 Archie は Documents ディレクトリの完全なアクセス権を持っています。Archie は Documents に入っているファイルを確認したりファイルを作成・削除することが可能です。ファイルのパーミッションは関係ありません。ファイルにアクセスできるかどうかはファイルのパーミッションによって決まります。

dr-x------ 6 archie users  4096 Jul  5 17:37 Documents

Archie はファイルを作成・削除したり名前を変更することができません。Documents の中にどんなファイルが入っているのか確認したり、(ファイルの読み込み権限があれば) 既存のファイルにアクセスすることは可能です。

d-wx------ 6 archie users  4096 Jul  5 17:37 Documents

Archie は Documents の中を 'ls' することはできませんが、ファイルの名前がわかっていれば名前を変更したり削除したり (ファイルの読み込み権限があれば) アクセスすることはできます。また、新しいファイルを作ることも同様にできます。

d--x------ 6 archie users  4096 Jul  5 17:37 Documents

Documents の中のファイルで Archie がアクセスできるのは名前を知っているファイルだけです (ファイルの読み込み権限が必要)。中に入っているファイルを一覧したり作成・削除することはできません。

ここで説明しているのはディレクトリのパーミッションであり、個々のファイルのパーミッションとは関係がありません。新しくファイルを作成したとき、変更があるのはディレクトリです。したがってディレクトリの書き込み権限が必要となります。

今度はディレクトリではなくファイルの例を見てみましょう:

-rw-r--r-- 1 archie users  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

グループと他のユーザーに読み込み・実行権限を与えるために、= の後にパーミッションの文字 (rx) を記入しています。空白は入れません。

who に複数の文字を入力することでコマンドをひとつにまとめることができます。例:

$ chmod go=rx Documents
ノート: chmod コマンドで who に入力する文字やパーミッション文字の順番は特に意味をなしません: chmod go=rx file でも chmod og=xr file でも全く同じ意味になります。

次に、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つのクラスから許可をコピーするように指示し、所有者になって、グループまたはすべてに同じ許可を与えることができます。 これを行うには、=の後に rw、または 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番目の数字は他のユーザーのパーミッションになります。

この数値表記では、値 rw、および 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アクセス許可を持っていたので)。

ノート:
  • chown は常に setuid と setgid ビットを消去します。
  • root 以外のユーザーは chown を使ってファイルの所有権を他のユーザーに変えることができません。

アクセス制御リスト

アクセス制御リストはファイルシステムに柔軟なパーミッション機構を追加し、あらゆるユーザーやグループにあらゆるファイルのパーミッションを設定することができます。

アクセス制御リストがあるかどうかは ls コマンドの出力にプラス記号 (+) があるかで確認できます。

Umask

umask ユーティリティを使うことでファイル作成モードマスクを制御することができ、新しくファイルを作成したときのファイルパーミッションの初期値を決めることができます。

ファイルの属性

ユーザーやグループの読み書きや実行権限を制御するファイルモードビットとは別に、ファイル操作の可否を細かくカスタマイズするためのファイル属性をファイルシステムがサポートしている場合があります。このセクションではそれらの属性を使用する方法を説明します。

警告: デフォルトでは、cprsync などのプログラムはファイルの属性までコピーしません。

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"。

警告: デフォルトでは、cprsync などのプログラムは拡張属性までコピーしません。

ユーザー拡張属性

ユーザー拡張属性を使うことでファイルに任意の情報を保存できます。ユーザー拡張属性を作成するには:

$ setfattr -n user.checksum -v "3baf9ebce4c664ca8d9e5f6314fb47fb" foo.bar

拡張属性を表示するには getfattr を使用:

$ getfattr -d foo.bar
# file: foo.bar
user.checksum="3baf9ebce4c664ca8d9e5f6314fb47fb"

Preserving extended attributes

Command Required flag
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
  1. mv silently discards extended attributes when the target file system does not support them.

To preserve extended attributes with text editors you need to configure them to truncate files on saving instead of using rename(2).[1]

ヒントとテクニック

ルートの保護

--preserve-root フラグを使うことで chmod/ で再帰的に実行してしまうことを防ぐことができます。システム全体から実行可能属性を取り除いてシステムが破壊されてしまう恐れがなくなります。フラグを毎回使いたい場合、エイリアスで設定すると良いでしょう。[2] も参照。

参照